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;
    }