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