SpringMVC的常用注解
- @RequestMapping :
- 作用:实现访问路径的控制跳转
- 作用在类上,为一级访问目录,作用在方法上,为二级访问目录
- 例子:在类上@RequestMapping("/test"),在方法上@RequestMapping("/hello"),那么访问路径就是/test/hello
- 细节:若在类上加了,那么方法上的路径名称前一定要加/进行分割,其他情况可以不加,但一般来说加上
- 属性:
path:指定请求的url
value:和path属性一样
method:指定该方法的请求方式
params:指定限制请求参数的条件,它支持简单的表达式。要求请求参数必须和 配置的一模一样
- @RequestParam
- 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
- 一般在表单字段名称和形参名称不一样时使用
- 属性:
value:请求参数中的名称
name:和value相同
required:请求参数中是否必须提供此参数,默认值是true,必须提供 ,如果设置为false是,但型参不能为null式(int)也会报错 - 例子:
public String useRequestParam(@RequestParam("name") String username, @RequestParam(value = "age", required = false) Integer uage)
- @RequestBody
- 作用:用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。 get 请求方式不适用
- 属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null - 例子:
public String useRequestBody(@RequestBody(required = false) String body) {
System.out.println(body);
return "success";
}
- @PathVariable
- 作用:拥有绑定url中的占位符的
- 例如:url中有/delete/{id},{id}就是占位符
- 属性:
value:用于指定 url 中占位符名称
required:是否必须提供占位符,默认值是true,必须提供 - 细节:
required属性配置了false时,不代表路径的占位符可以为空,如果占位符为空也会报错 - 例子
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable(value = "id", required = false) Integer id)
- @RequestHeader
- 作用:获取指定请求头的值
- 属性:
value:指定消息头的名称
required:是否必须有此消息头,默认值是true,必须提供 - 例子:
public String useRequestHeader(@RequestHeader(value = "Accept-Language", required = false) String head)
- @CookieValue
- 作用:用于获取指定cookie的名称的值
- 属性:
指定 cookie 的名称
是否必须有此 cookie,默认值是true,必须提供 - 例子:
public String useCookieValue(@CookieValue(value = "JSESSIONID", required = false) String cookie)
- @ModelAttribute
- 作用:
出现在方法上:表示当前方法会在控制器方法执行前线执行
出现在参数上:获取指定的数据给参数赋值 - 应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据 - 例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题 - 细节:
当提交的表单有数据时,在方法上给数据赋值也是无效的,还是用回表单上面的值,例如表单有password值为123,我在方法上修改为123456,但是还是会输出123,有此注解的方法会比其他方法先执行 - 例子
- 作用:
@RequestMapping("/testModelAttribute1")
public String testModelAttribute1(User user) {
System.out.println("控制器中处理请求的方法:修改用户:" + user);
return "success";
}
// 若请求路径匹配到方法,此方法先执行
// 此时表单只传了date、password、username,没有map和list
// 该方法有返回值
@ModelAttribute
public User showModel() {
//模拟去数据库查询
User user = new User();
List list = new ArrayList<String>();
list.add(0, "bbb");
user.setList(list);
Map<String, String> map = new HashMap<>();
map.put("one", "bbb");
user.setMap(map);
user.setPassword("123456");
System.out.println("执行了 showModel 方法" + user);
return user;
}
// 作用在形参上
@RequestMapping("/testModelAttribute2")
public String testModelAttribute2(@ModelAttribute("abc") User user) {
System.out.println("控制器中处理请求的方法:修改用户:" + user);
return "success";
}
// 该方法没有返回值
@ModelAttribute
public void showModel(String username, Map<String, User> map) {
//模拟去数据库查询
User user = new User();
user.setUsername(username);
List list = new ArrayList<String>();
list.add(0, "bbb");
user.setList(list);
Map<String, String> map1 = new HashMap<>();
map1.put("one", "bbb");
user.setMap(map1);
user.setPassword("123456");
System.out.println("执行了 showModel 方法" + user);
map.put("abc", user);
}
- @SessionAttributes
- 作用:用于多次执行控制器方法间的参数共享
- 属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型 - 细节:
type属性并不是指定属性value的类型,而是与的关系,例如下面的,表示分别将username、password及类型为String的Model放进session中 - 例子:
@SessionAttributes(value = {"username", "password"}, types = {String.class})
public class SessionAttributeController {
/**
* 把数据存入 SessionAttribute
* Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
* 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
* @param model
* @return
*/
@ResponseBody
@RequestMapping(value="/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes...");
// 底层会存储到request域对象中
model.addAttribute("username","test");
model.addAttribute("password","123");
return "success";
}
/**
* 获取值
* @param modelMap
* @return
*/
@ResponseBody
@RequestMapping(value="/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
System.out.println("getSessionAttributes...");
String username = (String) modelMap.get("username");
String password = (String) modelMap.get("password");
System.out.println(username+","+password);
System.out.println(modelMap.getAttribute("username"));
return "success";
}
/**
* 清除session
* @param status
* @return
*/
@ResponseBody
@RequestMapping(value="/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
System.out.println("delSessionAttributes...");
status.setComplete();
return "success";
}
}
SpringMVC请求参数的绑定
- 请求参数的绑定说明
- 绑定机制:
表单提交的数据都是k=v格式的 username=haha&password=123
SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
提交表单的name和参数的名称是相同的 - 支持的数据类型:
基本数据类型和字符串类型 (String)
实体类型(JavaBean)
集合数据类型(List、map集合等)
- 绑定机制:
- 基本数据类型和字符串类型
- 提交表单的name和参数的名称是相同的
- 区分大小写
- 实体类型(JavaBean)
- 提交表单的name和JavaBean中的属性名称需要一致
- 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如: address.name
- 给集合属性数据封装
- JSP页面编写方式:list[0].属性
- 例子
// 实体类User
public class User implements Serializable {
private String username;
private String password;
private Date date;
private List<String> list;
private Map<String,String> map;
}
@RequestMapping("/getUser")
public String testGetUser(User user) {
System.out.println(user);
return "success";
}
<!--from表单-->
<form action="/user/getUser" method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="text" name="date">
<input type="text" name="list[0]">
<input type="text" name="map['one']">
</form>
自定义转换器
- 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明 Spring框架内部会默认进行数据类型转换
- 如果想自定义数据类型转换,可以实现Converter的接口
- 例子:
/**
* 自定义类型转换String转Date
* Converter<String, Date>表示String转Date
* 这方法会把原来的(yyyy/mm/dd)给覆盖
*/
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
if (s == null){
throw new RuntimeException("参数不能为空");
}
try {
DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
return df.parse(s);
} catch (Exception e) {
throw new RuntimeException("类型转换错误");
}
}
}
<!--springmvc.xml配置-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.zsc.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!--开启Spring对MVC注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
过滤器(请求参数乱码问题)
- 配置 web.xml
<!-- 配置 springMVC 编码过滤器 -->
<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>
<!--所有路径都会被拦截,包括静态资源(图片、js等)
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 对静态资源放行(在springmvc.xml配置)
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 --> <mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>