annotation-driven
话说annotation-driven
在最初使用的时候仅仅知道它是配合着default-servlet-handler
,但真相是,annotation-driven中配置了各种各样的数据类型转换器和格式化转换器。
它比较常用的属性之一是conversion-service
。当使用conversion-service时候,意味着有自定义的数据类型转换器或格式化转换器。数据类型转换和数据格式化通常是一起发生。
当然,conversion-service是有值的,它的值是一个beanFactory,在这个beanFactory中配置着自定义的转换器,如下:
<!-- 配置ConversionService ,将form中的字符串转换为Employee 对象,发送给controller方法-->
<bean id="employeeConverter" class="com.ghost.spring.employee.converties.EmployeeConverter"></bean>
<!-- 不要使用class="org.springframework.context.support.ConversionServiceFactoryBean"
否则,annotation-driven就只识别该FactoryBean所注册的转换器而不识别自带的如@DateTimeFormat和@NumberFormat等转换器。因此应该使用
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"
-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
对应的EmployeeConverter代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import com.ghost.spring.employee.dao.DepartmentDao;
import com.ghost.spring.employee.entity.Department;
import com.ghost.spring.employee.entity.Employee;
public class EmployeeConverter implements Converter<String, Employee> {
@Autowired
DepartmentDao departmentDao;
@Override
public Employee convert(String employee) {
if(employee!=null){
String[] des = employee.split("-");
String name = des[0];
int age = Integer.parseInt(des[1]);
int gender = Integer.parseInt(des[2]);
int departmentId = Integer.parseInt(des[3]);
Department department = departmentDao.getDepartment(departmentId);
Employee e = new Employee();
e.setAge(age);
e.setGender(gender);
e.setDepartment(department);
e.setName(name);
System.out.println("in convert");
return e;
}
return null;
}
}
这样就将String类型的输入转化成了将要save的对象,当然,这个过程逻辑还是要自定义的。
这说明,前端的数据到我们真正使用@Controller和@RequestMapping定义的方法的过程中,将会经历一系列的过滤器,只不过是在没配置的情况下,他们默认是不起作用的。
上传文件配置
该项需要依赖包:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.0</version>
</dependency>
commons-io是commons-fileupload 的依赖包。maven可能会自动处理连带关系,因此commons-io
有些时候可以不配置。
xml中配置加入该组件,对应属性配置即可,如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1024000"></property>
</bean>
然后在页面中加入form:注意enctype属性。
<form action="testFileUpload" method="post" enctype="multipart/form-data">
File:<input type="file" name="file" />
<br>
Desc:<input type="text" name="desc" />
<br>
<input type="submit" value="Submit" />
</form>
最后在controller方法中这样写:
@RequestMapping("testFileUpload")
public String fileUpload(@RequestParam("desc") String desc,
@RequestParam("file") MultipartFile file) throws IOException{
System.out.println("in fileUpload "+desc);
System.out.println(file.getOriginalFilename());
System.out.println(file.getInputStream());
return "success";
}
从中可以获取到file的输入流,进行处理即可。
springMVC处理ajax请求
ajax在网页应用中十分频繁而且从体验上、美感上都强过刷新整个页面。
因此springMVC也一定会支持ajax。
跟普通请求类似,后台需要用RequestMapping配置。但不同的是,这个方法还需要加上关键的标示:
@RespondBody
这被框架看做相应ajax的相应体。类似的还有@RequestBody标签,通过名字就知道他们是干什么的。
在前端JavaScript中发起ajax请求即可:
$(function() {
$("#testJson").click(function() {
var url = this.href;
var args = {};
$.post(url, args, function(data) {
for (var i = 0; i < data.length; i++) {
var id = data[i].id;
var name = data[i].name;
alert(id + ": " + name);
}
});
return false;
});
})
后台:
@ResponseBody
@RequestMapping("/testJson")
public List<Employee> getJson(){
System.out.println("testest");
List<Employee> rst = employeeDao.selectAll();
return rst;
}
既然例子中有Json,就说一下对Json的支持,注意一下三点:
1.controller返回Collection类。
如上例中返回的List
2.引用依赖包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.5</version>
</dependency>
3.既然跟ajax结合,一定要有@ResponseBody
.