SpringMvc的常用注解介绍
@RequestMapping 注解
作用:用于建立请求URL和处理请求的方法之间的对应关系(客户端会发送请求,服务器端会有一个方法处理该请求,RequestMapping这个发给发就是建立这两者之间的关系)
源码:
1.出现在类上:可以让我们的URL按照模块化去管理
例如常见的电子商城网站:有用户模块,订单模块,这两个模块都有对数据库数据的增删改查,如果我们只将RequestMapping这个注解写在每个模块中的方法上,那么我们就很难去辨认到底是哪个方法.
其中红色的为写在类上面的
(就拿两个模块中的删除方法来说,都是删除数据库数据 如果你用/user/delete 和/order/delete是不是很快的就找到要执行的方法,便于模块化管理,但是如果你写的是/delete1 和/delete2谁能准确快速的找到请求要执行的方法)
@RequestMapping 注解的属性
和请求参数绑定相关的注解
请求参数的绑定
作为一个web层框架,客户端发请求都会携带参数,而我需要将参数(数据)拿到,这就是请求参数的绑定
在早期Servlet中如果需要获取请求的参数或者说获取表单的参数,需要用request.getParameter()获取
基本数据类型和字符串类型
name和参数的名称必须一致
实体类型JavaBean
import java.io.Serializable;
public class Account implements Serializable {
String username;
String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
JavaBean类型有其他对象的引用
那么表单的name如何写才可以封装成功
集合数据类型
配置解决中文乱码的过滤器
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
自定义类型转换
在mvc框架中从表单 传过来的数据都是String ,那么在JavaBean中的其他类型是如何接受表单的String的呢。在mvc有类型转换器,将String 转为 Integer 等其他类型的类,同时也包括了String转为Date,但是当我们不按照固定的日期类型去书写的时候呢。比如2020-11-10去写,这个时候就需要自定义类型转换器了。
第一步:自定义一个类并实现Conveter<S,T>泛型接口
StringToConveter.java
public class StringToConveter implements Converter<String, Date> {
@Override
public Date convert(String s) {
Date date=null;
if(s==null)
throw new RuntimeException("请输入日期");
try {
DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd");
date = dateFormat.parse(s);//将YYYY-MM-dd这个字符串解析为Date
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
}
在配置文件spring.mvc配置bean
@RequestParam
和从前台过来的数据封装有关。例如前台传一个属性名为username的参数 ,那么Controller层的方法必须提供一个带参数名为username的参数,否则数据封装不成功。
如果前台的传的数据和Controller方法的参数名称不一致怎么办?
解决方法就是在参数的前面使用@RequestParam(value=" 前台参数名称") String name
<form action ="user/fail" method="post">
用户名:<input type="text" name="name"><br>
密码:<input type="password" name= "password">
<input type="submit" value="提交">
</form>
@Controller
@RequestMapping(path = {"/user"})
public class HelloController {
@RequestMapping(path = "/fail")
public String sayGood(@RequestParam(name ="name") String username, String password){
System.out.println("username"+username+"password"+password);
System.out.println("你很good");
return "fail";
}
}
@RequestBody
用于获取请求体的内容,直接使用获取得是key=value&key=value…结构得数据,但是他不适用于get请求,get请求没有请求体
在方法参数中使用@RequestBody
System.out.println(body) 输出得是前台输入得数据 例如 username=张&password=123456 key=value&key=value…
@PathVariable
SpringMVC支持restful风格:restful 编程风格
PathVariable 用于绑定URL中占位符,例如请求URL中 delete/{id} ,这个{id}就是占位符。url支持占位符是springmvc支持restful风格的一个重要标志
<a href="user/fail/10">good</a>
@RequestMapping(path = "/fail/{one}")
public String sayGood(@PathVariable(name = "one") String id){
System.out.println(id);
return "fail";
}
HiddentHttpMethodFilter
浏览器from表单只支持get和post请求,而delete 、put 等并不 支持,Spring 3.0添加了一个过滤器,可以将浏览器的 请求改为指定的请求方式,发给我们的控制器。使得浏览器支持get post delete put请求。
@RequestHeader 和@CookieValue
RequestHeader是获取请求头信息的,CookieValue是获取cookie的值的
(不常用)
@ModelAttribute
注解在方法上,有返回值
<form action ="user/fail" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name= "password">
<input type="submit" value="提交">
</form>
注解在参数上,无返回值
注解在参数上实现的功能和注解在方法上实现的功能都是一样的或者说两种不同的写法,但是最终目的都是一样的
@SessionAttributes
@Sessionattributes注解应用到Controller上面,可以将Model中的属性同步到session当中
如果不使用@SessionAttributes,默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。
-------------------------------------它有两个属性:
----------------------------------------------------value:用于指定存入的属性名称
----------------------------------------------------type:用于指定存入的数据类型
@SessionAttributes的使用
@Controller
@RequestMapping(path = {"/user"})
@SessionAttributes(value = "msg") //等于把msg=美美存入到session中
public class HelloController {
/*
* @RequestMapping:请求映射路径,对象创建之后,怎么调用这个方法,*/
@RequestMapping(path = "/hello",method = RequestMethod.POST)
public String sayHello(){
System.out.println("HelloWord");
return "success";//想要跳转某个页面就需要一个视图解析器:xml配置视图解析器
}
@RequestMapping(path = "/fail")
public String sayGood(Model model){
/*
* springmvc默认将模型中的数据存储在request中*/
model.addAttribute("msg","美美");
return "fail";
}
}
下面是获取和删除session中的数据