SpringMVC学习(四)
来源:互联网 发布:魔方秀软件下载 编辑:程序博客网 时间:2024/05/22 02:21
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
.
- SpringMVC学习(四)
- SpringMvc学习(四)
- SpringMVC学习笔记(四)
- SpringMvc学习笔记(四)Restful 风格
- SpringMVC学习(四)-处理模型数据
- SpringMVC学习(四)--前端验证Validation
- SpringMVC学习总结(四)
- SpringMVC学习笔记四
- J2EE系列之SpringMVC学习笔记(四)--SpringMVC控制器
- springMVC学习笔记四(数据类型转换和数据验证)
- springmvc学习笔记(四)访问静态资源
- SpringMVC源代码学习(四)九大组件上
- SpringMVC源代码学习(四)九大组件
- 跟踪源码运行流程---SpringMVC学习笔记(四)
- SpringMVC学习(四)之使用POJO作为参数
- SpringMVC学习笔记(四):地址映射RequestMapping
- graphql学习(四)GraphQL和SpringMVC 的整合
- 跟踪源码运行流程---SpringMVC学习笔记(四)
- Exception starting filter struts2 java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUti
- GoGo Tester 2.3.9详细使用教程
- LeetCode 145 Binary Tree Postorder Traversal
- lucas定理
- 【c#第六次作业】猜猜看游戏
- SpringMVC学习(四)
- 给QT 程序的EXE文件添加图标
- LeetCode——House Robber
- 【C语言】字符串右循环移位
- TCP头部解析
- 信号量、互斥体和自旋锁
- div+css截取字符串在规定长度,超出部分用。。。代替
- 在写标签的时候要养成好习惯
- 单向链表的C++实现