Springmvc知识一------配置文件&URL&注解组件

配置文件

web.xml

Springmvc项目属于动态的web项目,所以我们应该先建立一个动态web项目,然后,我们再加上相关配置即可。

web项目的总配置属性在web.xml文件中,在集成其他框架时,我们只需要在其中加入相关配置即可。

    <!-- 配置springmvc的 servlet -->  
        <servlet>
            <servlet-name>springDispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置初始化参数 :配置springmvc配置文件的名称和路径 classpath java源文件根目录 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>springDispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>

注意:还有一种方式就是按照默认的来进行加载springmvc的配置文件, 即将我们的springmvc配置文件命名为-servlet.xml,并转移到/WEB-INF/目录下和web.xml同一目录下,不需要通过init-param属性再来进行配置 例如本例子中,将配置文件 【springDispatcherServlet-servlet.xml】放置到web.xml目录下也是可以的。但是,建议使用第一种方式,可以灵活的指定名称。另外解决我们的中文乱码的POST请求,我们也是在这里加上相应的配置filter

springmvc.xml

然后在Springmvc的配置文件中。在这里的配置和spring的配置基本类似。只是还要引入Springmvc的命名空间视图解析器的配置必须存在。还有就是后期对于内置的各种类的配置也是写在这里面

<!-- 命名空间 beans  context mvc-->
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd


<!-- 配置自动扫描-->
    <context:component-scan base-package="com.wf.springmvc"/>

    <!-- 配置视图解析器 : 如何把handler 方法返回值解析为实际的物理视图-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

上面是最简单的配置,配置这么多就可以利用Springmvc进行相关代码的编写,后期当我们用到什么的知识点时,会对我们的配置文件进行扩增,这里只是配置了一个最最简单的配置。

URL

@RequestMapping注解

    @RequestMapping("/helloworld")
    public String hello(){
        System.out.println("Hello World");
        return "success";
    }

注意:
1、RequestMapping进行映射请求的url,我们的前段控制器拦截用户给我们的请求,然后我们的前端控制器会进行URL的解析,然后找到我们所对应的映射路径,即是@RequestMapping组件进行的映射。然后进行对应的处理,返回 到前段控制器,这里我们还没有进行数据模型的存储,根据返回的String值,进行对应的视图渲染。返回值会根据视图解析器解析为实际的物理视图,对于配置的InternalResourceViewResolver类的解析器【在springmvc的配置文件中】,会通过【prefix属性值+函数返回值+suffix属性值】,这样的方式得到对应的物理视图,然后做请求转发。

2、RequestMapping 既可以标注在方法头,也可以标记在类头中,这样的话,我们可以对我们的url路径进行分类。 作用在类定义处:提供初步请求映射信息,作用在方法处:提供 进一步 细分映射信息。

RequestMapping注解常用属性
value属性:如果只有一个参数默认的值,即映射的路径。
method属性:指定页面提交的方式 ,通常有get和post请求。

@RequestMapping(value="RequestMappingMethod",method=RequestMethod.GET)
    public String requestMappringmethod(){
        System.out.println("Hello requestMappringmethod");
        return SUCCESS;
    }

匹配Ant风格的URL

springmvc支持ant风格的URL(了解),使用Ant有以下三条规则:
?(问号)表示通配一个字符 ;※(星号)表示通配任意字符 ; ※※(星号)表示任意层路径

//http://localhost:8080/springmvc001/RequestMappingTest/test/more/testAnt
//http://localhost:8080/springmvc001/RequestMappingTest/test/more/more/testAnt

@RequestMapping(value="test/**/testAnt")
    public String testAnt(){
        System.out.println("testAnt");
        return SUCCESS;
    }

// 注意:Ant遵循匹配相似度最高原则(has more characters),URL请求/test/more/testAnt,现在存在两个路径匹配模式/**/*和/test/more/*,那么会根据模式/test/more/*来匹配

使用REST风格URL

注解@PathVariable的使用,就是为了获取REST风格的参数的传递,了解什么是REST建议访问【http://kb.cnblogs.com/page/186516/】和【http://www.infoq.com/cn/articles/rest-introduction

    /*  4  后台处理
     * @PathVariable 注解 可以将url中的占位符绑定到处理函数体内。 REST风格使用
     * 
     */
    @RequestMapping(value="/testPathVariable/{id}")
    public String TestPathVariable(@PathVariable(value="id") Integer id ){
        System.out.println("PathCariable= "+id);
        return SUCCESS;
    }

<b> 4前台链接 </b><br>
    <a href="RequestMappingTest/testPathVariable/2">testPathVariable</a><br>

注意:关于REST 即是(Representational State Transfer) 资源表现层状态转化。是目前流行 的一种互联网软件架构。他主要的特点是结构清晰,符合标准,易于理解和方便扩展。
资源:网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本,一张图片等等,总之就是一个具体的存在。我们可以利用一个URI(统一资源定位符)指向它,每一种资源都有一个特定的URI,要获取这个资源,我们就要访问他的URI,因此,URI即为每一个资源的独一无二的识别符。(注意URL与URI的区别)
表现层:把资源具体的表现出来的形式,叫做它的表现层。文本可以以TXT格式表现,也可以用html格式表现,甚至可以采用二进制的方式。
状态转化:每次发出一个请求,就是一次客户端与服务器的一次交互过程,http协议,是一个无状态的协议,即所有的状态都保存在服务器端,因此,如果客户端想要操作服务器,就必须通过某种手段,让服务器端发生“状态转化”。即HTTP协议里面,GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。
@PathVariable 映射URL绑定的占位符。带占位符的URL是spring3.0新增的功能,该功能在Springmvc向REST目标挺进的发展过程中具有重大意义。通过@PathVariable注解可以将URL中的占位符绑定到控制器处理方法的入参中。即上述代码中皆有体现。PathVariable的value属性值需要与占位符的名称一致。

REST风格下将POST请求转化为DELETE与PUT请求

    <b> 前台链接方式 注意前台一定要隐藏input标签且name属性为_method, </b>
    <a href="RequestMappingTest/TestRestGET/2">testPathVariable</a><br>

    <form action="RequestMappingTest/TestRestPOST" method="post">
        <input type="submit" value="TestRestPost">
    </form>

    <form action="RequestMappingTest/TestRestDELETE/1" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="TestRestDELETE">
    </form>
    <form action="RequestMappingTest/TestRestPUT/1" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="TestRestPUT">
    </form>


<!--后台进行数据处理 -->

    @RequestMapping(value="/TestRestGET/{id}",method=RequestMethod.GET)
    public String TestRestGET(@PathVariable(value="id") Integer id){
        System.out.println("TestRest GET: "+id);
        return SUCCESS;
    }

    @RequestMapping(value="/TestRestPOST",method=RequestMethod.POST)
    public String TestRestPOST(){
        System.out.println("TestRest POST ");
        return SUCCESS;
    }
    @RequestMapping(value="/TestRestDELETE/{id}",method=RequestMethod.DELETE)
    public String TestRestDELETE(@PathVariable(value="id") Integer id){
        System.out.println("TestRest DELETE: "+id);
        return SUCCESS;
    }
    @RequestMapping(value="/TestRestPUT/{id}",method=RequestMethod.PUT)
    public String TestRestPUT(@PathVariable(value="id") Integer id){
        System.out.println("TestRest PUT: "+id);
        return SUCCESS;
    }



<!--web.xml 配置过滤器 -->
<!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter :可以把post请求转化为DELETE 或者PUT请求 -->
        <filter>
            <filter-name>HiddenHttpMethodFilter</filter-name>

            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        </filter>
        <filter-mapping>
             <filter-name>HiddenHttpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>  <!--  过滤所有请求-->
        </filter-mapping>

注解组件

@RequestMapping注解

映射路径的注解,见上面【@RequestMapping注解】小节

@PathVariable注解

用于REST风格的参数取值。见上面【使用REST风格URL】小节

@RequestParam注解

RequestParam主要是用于绑定请求参数值。get Post请求都可以。用在方法体参数内
属性
1. value=”name”, 求情参数的参数名
2. required=false, 是否必须存在
3. defaultValue=”0” 默认值

<b>前台链接</b><br>
    <a href="RequestMappingTest/TestRequestParam?name=rose&age=12">testRequestParam</a><br>

    <form action="RequestMappingTest/TestRequestParam" method="post">
        name:<input type="text" name="name">
        age:<input type="text" name="age">
        <input type="submit" value="Submit">
    </form>


<!--后台数据处理 -->
@RequestMapping(value="/TestRequestParam")
    public String TestRequestParam(
    @RequestParam(value="name",required=false ,defaultValue="tom") String name,
    @RequestParam(value="age",required=false) Integer age){
        System.out.println("RequestParam name: "+name+" RequestParam age: "+age);
        return SUCCESS;
    }

注意:在传递到后台时,如果利用了required=false,建议利用基本类型的封装类型进行接收,这么的话可以设置为null ,如果利用 了基本类型,则会不知道默认值是多少,报错。或者利用defaultValue进行设置也是可以解决报错问题的。

@RequestHeader注解

这个注解主要是用来获取请求头的相关信息,不常用,了解即可。他的属性值也有【value】【required】【defaultValue】,value属性值是http中的请求头中的信息名,同RequestParam,用在方法参数体内。

    @RequestMapping(value="/TestRequestHeader")
    public String TestRequestHeader(@RequestHeader(value="Accept-Language") String al,
                                    @RequestHeader(value="Cookie") String ck){
        System.out.println("Accept-Languag : "+al);
        System.out.println("Cookie: "+ck);
        return SUCCESS;
    }

@CookieValue注解

用来获取Cookie的信息,属性值和RequestParam相同,用在方法体参数中。

@RequestMapping(value="/TestCookieValue")
    public String TestCookieValue(@CookieValue(value="JSESSIONID")  String cook){
        System.out.println("CookieValue : "+cook);
        return SUCCESS;
    }

POJO对象参数的传递

springmvc 会自动按照请求参数名和POJO 属性名进行自动匹配,自动为该对象填充属性值,而且还支持级联属性的装配,这样的话,能大大缩减我们对表单数据利用RequestParam获取参数的重复工作

<b>前台链接</b><br>
    <form action="RequestMappingTest/TestRequestParamPojo" method="post">
        userName:<input type="text" name="userName"><br>
        userPassworld:<input type="password" name="userPassworld"><br>
        userAge:<input type="text" name="userAge"><br>
        userEmail:<input type="text" name="userEmail"><br>
        addressCity<input type="text" name="address.addressCity"><br>
        addressStreet<input type="text" name="address.addressStreet"><br>
        <input type="submit" value="submit">
    </form>

<!-- 后台处理 -->
    @RequestMapping(value="/TestRequestParamPojo")
    public String Test0000(User user){
        System.out.println("TestRequestParamPojo : "+user);
        return SUCCESS;
    }

注意:前台的name属性值,必须和POJO类中的变量名相同。,对于字段的数量则没有要求,可以多于POJO类中的变量,多于的话,会忽略掉,或者利用RequestParam进行单独接收,也可以少于POJO类中的变量,少于的话,会进行自动默认,在遇到级联属性时,利用【变量名.属性名】进行设置,上图就有。可以不必存在特定的构造函数。

使用原生ServletAPI作为入参

使用Servlet作为入参的话,首先我们应该加入所需要的jar包【servlet-api.jar】或者不导入,使用tomcat里面的这个jar包。具体情况看能不能在使用HttpServletRequest等时加入正确的类。

<b>前台链接</b><br>
<a href="RequestMappingTest/TestServletAPI">TestServletAPI</a><br>

<!--后台处理 -->
@RequestMapping(value="/TestServletAPI")
    public void TestServletAPI(HttpServletRequest request,
                                HttpServletResponse response,
                                Writer out){
        System.out.println("request"+request+"; response  "+response);
        try {
            out.write("hello spring servletAPI");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注意:在mvc中,并不能完全使用servlet的API,具体支持以下九种,最常用的三种
【HttpServletRequest 】【HttpServletResponse 】【 HttpSession】
【 java.security.Principal 】【 Locale 】【InputStream】
【 OutputStream 】【 Reader 】【 Writer】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章