Spring MVC 之注解式开发

1.案例:使用@Controller和@RequestMapping()实现欢迎程序

      @controller :用于标记在一个类上,使用它标记 的类就是一个Spring MVC Controller对象,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

      @RequesrMapping():用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@Controller
public class FirstController {

    @RequestMapping("/first")   
    public String doFirst(){
      return "/second.jsp";
    }
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       ">

<!--包扫描器-->
<context:component-scan base-package="cn.happy.day04"/>
</bean?
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Second</h1>
</body>
</html>

2.一个处理类中定义N个处理器方法

@Controller
public class FirstController {

    @RequestMapping("/first")   
    public String doFirst(){
      return "/second.jsp";
    }

    @RequestMapping("/second")   
    public String doSecond(){
        return "/index.jsp";
    }

3.注解式开发-----命名空间:用来区分不同类中的同名方法

@Controller
@RequestMapping("/user")
public class FirstController {

    @RequestMapping("/first")   
    public String doFirst(){
      return "/second.jsp";
    }

4.注解式开发-----请求方法中的通配符用法

 @RequestMapping("/first*")   //代表0个或多个字符,以first开头就行
    public String doFirst(){
      return "/second.jsp";
    }

    @RequestMapping("/**/second")   //0级或者无限极目录
    public String doSecond(){
        return "/index.jsp";
    }

    @RequestMapping("/*/third")   //有且只能有一级目录
    public String doThird(){
        return "/second.jsp";

5.注解开发-----请求中方式的定义

     对于@RequestMapping,有一个属性method,用于对被注解方法所处理请求的提交方式进行限制,只有满足该method属性制定的提交方式,才会执行被注解方法。   

     method属性的取值为RequestMethod,是一个枚举常量。常用值为 RequestMethod.GET 与 RequestMethod.POST.

    @RequestMapping(value = "/first",method = RequestMethod.GET)    
    public String doFirst(){
      return "/second.jsp";
    }

6.处理器方法的参数

请求中所携带的请求参数

01.零散参数

<body>
     <form action="/second" method="post">
         登录名:<input name="uname"/>
         <input type="submit"/>
     </form>
</body>

 @RequestMapping("/second")
 public String doFirst(String  uname){
        System.out.println(info.getUname()+"========");
        return "/first.jsp";
    }

02.校正请求参数名

   //校验参数名称

    @RequestMapping("/second")
    public String doSecond(@RequestParam(value = "uname") String info){
        //value的值和表单元素的name属性保持一致,即可实现自动装配
        System.out.println(info+"--------");
        return "/second.jsp";
    }

03.对象参数

<body>
     <form action="/second" method="post">
         登录名:<input name="uname"/>
         <input type="submit"/>
     </form>
</body>


    @RequestMapping("/second")
    public String doFirst(UserInfo info){
        System.out.println(info.getUname()+"========");
        return "/first.jsp";
    }

04.域属性对象自动装配

<body>
     <form action="/second" method="post">
         登录名:<input name="uname"/>
         汽车品牌1:<input name="car.brand"/>
         <input type="submit"/>
     </form>
</body>


    @RequestMapping("/second")
    public String doFirst(UserInfo info){
        System.out.println(info.getUname()+"========");
        System.out.println(info.getCar().getBrand()+"----------");
        return "/first.jsp";
    }

05.对象集合的自动绑定

<body>
     <form action="/second" method="post">
         登录名:<input name="uname"/>
        汽车品牌1:<input name="userCars[0].brand"/>
         汽车品牌2:<input name ="userCars[1].brand"/>
         <input type="submit"/>
     </form>
</body>


    @RequestMapping("/second")
    public String doFirst(UserInfo info){
        System.out.println(info.getUname()+"========");
        System.out.println(info.getUserCars().get(0).getBrand());
        System.out.println(info.getUserCars().get(1).getBrand());
        return "/first.jsp";
    }

06.乱码解决

<!--编码过滤器-->
  <filter>
    <filter-name>CharEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>CharEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

07.路径变量@PathVariable  

     对于处理器方法中所接收的请求参数,可以来自于请求中所携带的参数,也可以来自于请求的url中所携带的变量,即路径变量。不过,此时需要借助@PathVariable注解

    @PathVariable在不指定参数的情况下,默认其参数名即路径变量名与用于接受其信息的属性名相同。若路径变量与用于接受其信息的属性名不同,则@PathVariable可通过参数指出路径变量名称。 

   //路径变量
    @RequestMapping(value="/{rname}/{age}/second")
    public String doThid(@PathVariable("rname") String name,@PathVariable int age){
        System.out.println(name);
        System.out.println(age);
        return "/second.jsp";
    }

08.处理器方法的返回值

001. void ajax

1》引入jar包

    <!--alibaba的 fastjson-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.31</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.8.1</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
    </dependency>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="/js/jquery-1.8.3.js"></script>
    <script type="text/javascript">
        $(function(){
            $.ajax({
                url:"/toJson",
                type:"post",
                data:"",
                success:function(data){
                    alert(data.toString())
                }
            })
        })
    </script>
</head>
<body>

</body>
</html>
    @RequestMapping("/toJson")
    public void doFirst(HttpServletRequest request ,HttpServletResponse response)  {
        List<User> list = new ArrayList<User>();
        User u1 = new User();
        u1.setAge(18);
        u1.setName("tom");

        User u2 = new User();
        u2.setName("lucy");
        u2.setAge(20);

        list.add(u1);
        list.add(u2);
        String result = JSON.toJSONString(list);
        try {
            response.getWriter().write(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

002.Object类型

    由于返回Object数据,一般都是将数据转化为JSON对象后传递给浏览器页面的。而这个由Object转换为Json,是有Json工具完成的。所以需要导入jar包(上述三个就是),将Object数据转化为json数据,需要Http消息转换器HttpMessageConverter完成,而转换的开启,需要由<mvc:anntation-driven/>来完成,当spring容器进行初始化过程中,在<mvc:anntation-driven/>处创建注解驱动是,默认创建了七个HttpMessageConverter对象。也就是说,我们注册<mvc:anntation-driven/>,就是为了让容器为我们创建HttpMessageConverter对象。  

<!--注解驱动-->
   <mvc:annotation-driven/>
@RequestMapping("/jsonObject")
    @ResponseBody
    public Object doSecond(){
        List<User> list = new ArrayList<User>();
        User u1 = new User();
        u1.setAge(18);
        u1.setName("tom");

        User u2 = new User();
        u2.setName("lucy");
        u2.setAge(20);

        list.add(u1);
        list.add(u2);

        return list;
    }

  

  

  

  

  

  

  

  

 

 

  

 

  

  

  

  

posted @ 2017-11-01 21:46  ruanjiancainiao  阅读(239)  评论(0编辑  收藏  举报