SpringMVC注解
@RequestMapping
- 在类上:给模块添加根路径
- 在方法上:方法具体的路径
属性:
- value:默认属性,value属性主要指定的是方法被访问的具体路径
- method:可以指定方法对应的请求方式,如果客户端请求的方式和方法设置的方式不同,请求不成功(405错误)
可以将数据存放到request中,也可以将数据存放到session中,返回类型是javabean类型,
@RequestMapping("/emps")
public String getUsersPage(Model model, HttpSession session){
List<Emp> list = empService.getAllEmps();
model.addAttribute("list", list);
session.setAttribute("list", list);
return "emp.jsp";
}
@RequestParam
表单参数处理的注解
属性:
- value属性:默认属性,value属性主要用于方法参数名和表单参数名不一致时
- defaultvalue属性:如果客户端没有在请求传参,那么我们将得到null,我们不 希望得到null,希望得到一个默认值,这个时候,我们还需要使用@RequestParam defaultValue属性进行对应的设置。
@GetMapping("/deleteById/{id}")
传单个值的参数
获取值
public String deleteByEid(@PathVariable int eid){}
@PostMapping("/***")
能够接收表单参数,要求表单的name于bean成员变量一致
@PostMapping("/updateEmp")
public String updateEmp(Emp e){
//System.out.println(request.getParameter("eid"));
System.out.println(e);
boolean flag = empService.updateEmp(e);
if(flag){
return "redirect:/emp/emps";
}
return "";
}
校验与国际化
添加一个配置文件,此文件的效果是前天出现输入错误时,错误信息会根据不同的语言进行表达,文件名已msg开头、语言居中、国家简写在后
msg_en_US.properties
emp.eid=the eid of employee cannot be empty.
emp.name=the name of employee cannot be empty.
emp.salary=the salary of employee cannot be empty.
emp.salary.invalidate=the salary of employee cannot be negative.
在spring配置文件中添加,id必须为messageSource
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/msg" />
</bean>
添加一个实现Validator的类,里面包含两个方法,supports和validate,supports方法的意思是当前类用来对于哪个类实现校验,Emp.class.isAssignableFrom(clazz);意思是完成对与Emp类的校验,validate方法,完成真正的校验,一定是满足了supports方法之后才会进入该方法来进行校验
public class EmpValidate implements Validator {
/**
* 指定当前类是否支持指定类型的校验
* @param clazz
* @return
*/
@Override
public boolean supports(Class<?> clazz) {
return Emp.class.isAssignableFrom(clazz);
}
/**
* 真正的校验方法
* @param target,校验对象
* @param errors,存储错误信息
*/
@Override
public void validate(Object target, Errors errors) {
Emp e = (Emp) target;
/**
*
* 非空校验
*
* 使用ValidationUtils工具类来实现对于某些非空字段的校验,该方法包含三个参数:
* 1. 错误对象,用来收集并存储错误信息
* 2. 要校验的字段
* 3. 错误码,在msg配置文件中配置的key信息
*/
ValidationUtils.rejectIfEmpty(errors, "eid", "emp.eid");
ValidationUtils.rejectIfEmpty(errors, "name", "emp.name");
ValidationUtils.rejectIfEmpty(errors, "salary", "emp.salary");
double salary = e.getSalary();
/**
* 合法性校验,使用errors对象的rejectValue()方法完成合法性校验,里面包含了两个参数
*
* 1. field,在哪个字段上完成校验
* 2. 错误码,会在msg文件中找到该key对应的错误信息
*/
if(salary < 0){
errors.rejectValue("salary", "emp.salary.invalidate");
}
}
在这个方法中创建了一个EmplooyeeValidate对象用于进行校验,这个方法接收三个参数,第一个参数是前台页面传过来的,第二个参数类型是一个接口,继承于Errors,用于保存错误信息,第三个参数用于向request域中添加属性。
@PostMapping("/saveEmp")
public String saveEmp(Emp e, BindingResult errors, Model model){
/**
* 调用自己写好的校验类来完成对于Emp对象的校验
*/
EmpValidate ev = new EmpValidate();
ev.validate(e, errors);
if(errors.hasErrors()){
model.addAttribute("emp", e);
return "saveEmp.jsp";
}
return "redirect:/emp/emps";
}
页面上也需添加错误信息的标签,先需要导入标签,然后使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<form action="" method="post">
eid:<input type="text" name="eid" />
</form>--%>
<f:form method="post" action="/emp/saveEmp" commandName="emp">
eid:<f:input path="eid" /><font color="red"><f:errors path="eid" /></font> <br>
name:<f:input path="name" /><font color="red"> <f:errors path="name" /></font><br>
salary:<f:input path="salary" /><font color="red"> <f:errors path="salary" /></font><br>
<input type="submit" value="submit" /> <br>
</f:form>
</body>