SpringMVC理解(二)


利用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管理国际化资源文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值