利用Spring MVC进行CRUD增删改查操作,且这个CRUD是符合RESTful风格的
一、环境搭建
利用Spring MVC完整数据的增删改查操作,并且是REST风格的
/emp/1 GET请求:查询id为1的员工
/emp/1 PUT请求:更新id为1的员工
/emp/1 DELETE请求:删除id为1的员工
/emp POST请求:新增员工
/emps GET请求:查询所有员工
1、 标签库
在早期的jsp开发中,是使用java代码来控制逻辑和显示的,但这样会给前端开发人员带来些麻烦并且代码的可读性也会降低。为了解决上述情况,标签库被创造出来了。标签库的目的在于让开发人员能像使用html标签一样的标签来完成前端的逻辑控制和内容显示,而把那些繁琐、复杂的java代码隐藏在背后,返还jsp文件的干净整洁。
使用
在JSP文件中使用<%@ taglib prefix=“c” uri=“myjstl” %>,这句话将JSTL core标签库引入jstltest.jsp。然后可以使用各种标签进行操作,如< c:foreach >标签进行遍历
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="myjstl" %>
二、数据类型转换
页面提交的所有数据都是字符串,因此涉及到数据转换和数据的格式化问题
使用Conversion Service组件负责数据类型的转换及格式化
Spring在格式化模块中定义了一个实现ConversionService的接口的FormattingConversionService实现类,该实现类扩展了Generic Conversion Service的功能,因此他既具有类型转换的功能,又具有格式化的功能。
自定义类型转换器实现:
首先实现Converter的接口,Converter<String, Employee>代表,将string类型转成employee类型,source是页面提交的参数信息
public class String2EmpConverter implements Converter<String, Employee> {
@Autowired
DepartmentDao depDao;
@Override
//String format :"empName-empName@163.com-1-101"
public Employee convert(String source) {
Employee employee = new Employee();
//进行转换
if (source!=null && source.contains("-")) {
String[] src = source.split("-");
employee.setLastName(src[0]);
employee.setEmail(src[1]);
employee.setGender(Integer.parseInt(src[2]));
employee.setDepartment(depDao.getDepartment(Integer.parseInt(src[3])));
}
return employee;
}
}
然后配置ConversionService中,在SpringMVC的配置文件中,告诉SpringMVC别用默认的ConVersion Service,而用我们自定义的converter。ConversionService是由ConversionServiceBean创建的。我们会看到ConversionServiceBean中有个converters的set集合。
<bean id="myConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.edu.component.String2EmpConverter"></bean>
</set>
</property>
</bean>
配置完之后,需要告诉Spring MVC要用哪个Conversion,需要配置下面这段代码
<!-- 使用自己配置的ConversionService组件 -->
<mvc:annotation-driven conversion-service="myConversionService"/>
然后就可以将提交表单内的值进行转换
<form action="${ctp}/quickAddEmp">
<input type="text" name="empInfo" value="empName-empName@163.com-1-101"/>
<input type="submit" value="快速添加"/>
</form>
EmployeeController中处理请求:就可以将empName-empName@163.com-1-101转成Employee
@RequestMapping("/quickAddEmp")
public String quickAdd(@RequestParam("empInfo")Employee emp) {
System.out.println("quick add emp : "+ emp);
empDao.save(emp);
return "redirect:/emps";
}
三、数据格式化
页面提交的数据格式不正确的时候,会报400
日期格式化注解@DateTime Format(pattern=“日期格式”)
该注解是定义在javaBean类中的属性上的。
页面提交的格式必须和注解中的格式是一样的,如果不一样,则提交失败。
如果在使用自定义Conversion的时候,需要使用的是Formatting Conversion Service FactoryBean,这个不仅支持格式转换还支持格式化,如果使用的是ConversionServiceFactoryBean,则不支持格式化功能。
<bean id="myConversionService" class="org.springframework.context.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.edu.component.String2EmpConverter"></bean>
</set>
</property>
</bean>
四、数据校验
只做前端验证是不安全的,必须加入后端数据验证
后端数据验证的方式:
方式1: 写一段程序,对数据进行校验
方式2: Spring MVC 中的JSR303,对数据进行标注解的方式
1、导入校验包 hibernate包
2、然后对JavaBean中的属性进行标注
3、在SpringMVC封装对象的时候,告诉SpringMVC这个JavaBean的属性需要进行校验
4、然后在controller类中的方法中,对需要校验的属性使用@Valid注解,表示这个参数需要校验。对于校验结果,可以使用@BindingResult注解,对结果进行封装该注解紧跟在参数后
@RequestMapping("/emp")
public String addEmp(@Valid Employee employee,@BindingResult result){
boolean hasErrors = result.hasErrors();
if(hasErrors){
List<FiledError> errors = result.getFiledErrors();
for(FiledError filedError : errors){
System.out.println("错误消息提示"+filedError.getDefaultMessage)
System.out.println("错误消息字段"+filedError.getField())
//通过Model、Map、ModelAndView等返回给前端
}else{
//数据校验正确
}
}
自定义国际消息提示
定制自己的消息提示
每一个字段发生错误之后,都会有自己的错误代码,因此国际化配置文件中的错误消息的key必须对应的是错误代码
步骤:
1、 先编写国际化文件properties
2、 让Spring管理国际化资源文件