spirngmvc的注解:
重要注解@RequestMapping:
@RequestMapping: 通过RequestMapping注解可以定义不同的处理器映射规则。
URL路径映射
@RequestMapping(value="/item")或@RequestMapping("/item)
value的值是数组,可以将多个url映射到同一个方法
value数组:
eg:
@RequestMapping(value={"url","resturl"})
@ResponseBody
public String url() {
return "url";
}
窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:
@RequestMapping放在类名上边,设置请求前缀
@Controller
@RequestMapping("/item")
方法名上边设置请求映射url:
@RequestMapping放在方法名上边,如下:
@RequestMapping("/queryItem ")
实际访问地址为:/item/queryItem
请求方法限定
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过Post访问则报错:
HTTP Status 405 - Request method 'POST' not supported
例如:
@RequestMapping(value="/editItem",method=RequestMethod.GET)
限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过Post访问则报错:
HTTP Status 405 - Request method 'GET' not supported
GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
@Service注解的使用:
首先,在applicationContext.xml文件中加一行:
<context:component-scan base-package="com.hzhi.clas"/>
加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。
比如下面这个类:
@Service("courseDAO")
@Scope("prototype")
public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{
......
}
其作用就相当于applicationContext.xml文件里面的:
<bean id="courseDAO"
class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype">
......
</bean>
1.1.2 配置validator
<!-- 加载校验信息资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件的基础名称 -->
<property name="basenames">
<list>
<value>classpath:UserValidationMessage</value>
</list>
</property>
<!-- 资源文件的编码集 -->
<property name="fileEncodings" value="UTF-8"></property>
<!-- 资源文件的缓存时间 -->
<property name="cacheSeconds" value="120"></property>
</bean>
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<property name="validationMessageSource" ref="messageSource"></property>
</bean>
1.1.3 将validator加到处理器适配器
<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>
1.1.4 添加验证规则
public class User{
private Integer id;
@Size(min=6,max=20,message="{username.length.error}")
private String userName;
@NotEmpty(message="{userpass.isnull.error}")
private String userPass;
}
1.1.5 错误消息文件CustomValidationMessages
username.length.error=用户名必须在1到30个字符之间!
userpass.isnull.error=密码不能为空!
如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件。
1.1.6 捕获错误
修改Controller方法:
@RequestMapping("/add")
public String add(@Validated User user,BindingResult result,Model model)
throws Exception {
//如果存在校验错误则转到商品修改页面
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for(ObjectError objectError:errors){
System.out.println(objectError.getCode());
System.out.println(objectError.getDefaultMessage());
model.addAttribute("errors", errors);
}
return "add";
}
//省略业务代码
return "success";
}
注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。
1.1.7新建add.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<font color="red">
<c:forEach items="${errors}" var="err">
${err.defaultMessage}<br>
</c:forEach>
</font>
<form action="user/add" method="post">
用户名:<input type="text" name="userName"><br>
密码:<input type="text" name="userPass"><br>
<input type="submit" value="新增">
</form>
</body>
</html>
1.2 分组校验
如果两处校验使用同一个User类则可以设定校验分组,通过分组校验可以对每处的校验个性化。
需求:用户新增提交只校验用户名称长度
定义分组:
分组就是一个标识,这里定义一个接口,接口里面啥也没有:
public interface ValidGroup1 {
}
public interface ValidGroup2 {
}
指定分组校验:
public class User {
private Integer userId;
//这里指定分组ValidGroup1,此@Size校验只适用ValidGroup1校验
@Size(min=1,max=30,message="{username.length.error}",groups={ValidGroup1.class})
private String userName;
//新增用户
@RequestMapping("/add")
public String add(@Validated(value={ValidGroup1.class}) User user,BindingResult result,
Model model)throws Exception {
在@Validated中添加value={ValidGroup1.class}表示商品修改使用了ValidGroup1分组校验规则,
也可以指定多个分组中间用逗号分隔,@Validated(value={ValidGroup1.class,ValidGroup2.class })
1.3校验注解
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内