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