前言
spring以及包括springmvc在内的子项目提倡使用注解开发。使用了注解开发一段时间后发现,确实快捷方便。下面讲解在使用springMVC框架时,一些常用的注解。这些功能强大的注解在大大简化了代码开发的同时也提升程序的可扩展性。
@Controller
@Controller 用于标记在一个类上,用于定义类的注解,使用它标记的类就是一个Controller 对象。
@Controller 用于标记在一个类上,使用它标记的类就是一个Controller 对象。
DispatcherServlet将会扫描使用了该注解的类的方法,并检测方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:
(1)在SpringMVC 的配置文件中定义MyController 的bean 对象。
(2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。(推荐使用)
<!--方式一-->
<bean class="com.jex.controller.MyController"/>
<!--方式二-->
< context:component-scan base-package = "包含controller实现类的包" />
@RequestMapping
RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。SpringMVC通过@RequestMapping注解将URL请求与业务方法进行进行映射。
在控制器的类定义处以及方法定义处都可添加@RequestMapping,在类定义处添加@RequestMapping注解,相当于多了一层访问路径。
@Controller
@RequestMapping("/helloController")
public class HelloController {
@RequestMapping(value="hello")
public String hello(){
System.out.println("hello world");
return "index";
}
}
<p>
参数:
1、consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html。
2、produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
3、headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
4、value:指定URL请求的实际地址,是@RequestMapping的默认值。
@RequestMapping("test")
public String test(){
System.out.println("this is test");
return "index";
}
等同于
@RequestMapping(value="test")
public String test(){
System.out.println("this is test");
return "index";
}
5、method:指定请求的method类型,包括 GET、POST、PUT、DELETE等。
@RequestMapping(value="/testPost",method=RequestMethod.POST)
public String testPost(){
System.out.println("testPost");
return "index";
}
表示只有POST请求可以访问该方法,若使用其他请求访问,如GET请求访问,会直接报错。
其他几种方式也是同样的道理,我们常用的是GET和POST请求方式,PUT,DELETE是rest风格的表现形式。
6、params:指定request中必须包含某些参数值,才可以调用该方法。
@RequestMapping(value="testParams", params={ "param1=value1" , "param2"})
public String testParams(){
System.out.println("testParams");
return "index";
}
分别表示参数param1 的值必须等于value1 ,参数param2 必须存在,值无所谓只有满足指定的两个参数条件的时候才能调用该方法。
<p>
<p>
<p>
根据上述3种错误,我们可以知道请求必须同时包含param1 和 param2 参数,并且param1 = value1 才可正常访问业务方法。
@Resource和@Autowired
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。
(2)@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
参数绑定
@RequestParam
@requestParam是处理request body部分的注解,有三个常用参数:defaultValue = , required = , value = ;
defaultValue 表示设置默认值,required 设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
常用来处理简单类型的绑定,用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容;
params是对URL请求的参数进行限制,不满足条件的URL无法调用业务方法,这种特性在我们开发中并不常用的。我们常用到@requestParam在业务方法中获取URL的参数。
@RequestMapping(value="paramsBindTest")
public String paramsBindTest(@RequestParam("param1") String param1 ,@RequestParam("param2") int param2){
System.out.println(param1);
int num = param2 + 1;
System.out.println(num);
return "index";
}
<p>
<p>
将URL请求的参数 param1 和 param2 分别赋给形参 param1 和 param2 ,同时进行了数据类型的转换,URL参数都是String类型的,根据形参的数据类型,将param2 转换为int类型,所以可以看到打印的num值为 11,完成了数学运算。
@PathVariable
SpringMVC同时也支持restful风格的URL,使用@PathVariable来处理request uri部分的注解,将请求URL中的模板变量映射到处理方法的参数上,即取出uri模板中的变量作为参数。
@RequestMapping(value="restful/{param1}")
public String restfulTest(@PathVariable("param1") String param1){
System.out.println(param1);
return "index";
}
<p>
<p>
将参数列表的注解改为@PathVariable("param1")即可,非常简单。
@RequestHeader
@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
}
@CookieValue
@CookieValue可以把Request header中关于cookie的值绑定到方法的参数上。
@RequestMapping("/cookieTest")
public String getCookie(@CookieValue(value="JSESSIONID") String sessionId){
System.out.println(sessionId);
return "index";
}
<p>
<p>
@RequestBody
@RequestBody用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@ResponseBody
@ResponseBody用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
(1)使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
(2)用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
使用pojo绑定参数:
SpringMVC会根据请求参数名和pojo属性名进行自动匹配,自动为该对象填充属性值。并且支持级联属性。
1.创建实体类Address,User并进行级联设置。
public class Address {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Address [id=" + id + ", name=" + name + "]";
}
}
public class User {
private int id;
private String name;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", address=" + address
+ "]";
}
}
2.创建addUser.jsp。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
<form action="/SpringMvcTest/helloController/addUser" method="post">
编号:<input type="text" name="id"/><br/>
姓名:<input type="text" name="name"/><br/>
地址:<input type="text" name="address.name"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
3.业务方法。
@RequestMapping("/addUser")
public String addUser(User user){
System.out.println(user);
return "index";
}
4.运行。
<p>
写到这可能会发现程序中文乱码了,SpringMVC解决中文乱码很简单,在web.xml中添加过滤器即可。
<filter>
<filter-name>encodingFilter</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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JSP页面的转发和重定向:
SpringMVC默认以转发的形式响应JSP,也可以自主进行设置。
重定向:
@RequestMapping("redirectTest")
public String redirectTest(){
return "redirect:/index.jsp";
}
<p>
<p>
通过地址栏可以看到,地址改变,重定向跳转。
需要注意的是业务方法中,设置重定向不能写逻辑视图,必须写明目标资源的物理路径,如"redirect:/index.jsp"。
转发:
@RequestMapping("forwardTest")
public String forwardTest(){
return "forward:/index.jsp";
}
<p>
<p>
可以看到请求前后,地址栏没有改变,转发跳转。
源码
链接:https://pan.baidu.com/s/1Y4Sb5WZJpIxWVw2Tr9Q8iw
提取码:ro86
网友评论