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.

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7岁儿童厌食怎么办 小孩吃饭少消瘦怎么办 小孩吃饭少挑食怎么办 小孩吃饭太少怎么办 孩子不正经吃饭怎么办 月经少卵巢早衰怎么办 四个月婴儿厌食怎么办 孩子读书成绩差怎么办 小孩学习记不住怎么办 儿童不爱吃菜怎么办 10儿童不爱吃饭怎么办 儿童不爱吃蔬菜怎么办 婴儿不爱吃饭怎么办啊 初中不爱写作业怎么办 老是不想写作业怎么办 一年级孩子不爱学怎么办 一年级孩子不爱学习怎么办 我不想读书了怎么办 孩子读书读不懂怎么办 一岁多宝宝不吃奶粉怎么办 小孩不讲话怎么办 舌头 看书记不住内容怎么办 看不下去书怎么办 职高读不下去怎么办 小孩不主动说话怎么办 不喜欢自己的儿子怎么办 生了儿子不喜欢怎么办 孩子不愿意去幼儿园怎么办 内向妈妈带孩子怎么办 从小就不爱学习怎么办 孩子老爱玩不爱学习怎么办? 孩子不爱做题怎么办 看书静不下心怎么办 孩子不自觉学习怎么办 不自觉的孩子怎么办 不学习的孩子怎么办 电脑不受老师控制怎么办 儿子不尊重老师怎么办 小孩不喜欢吃蔬菜怎么办 小孩不愿练钢琴怎么办 孩子不喜欢幼儿园老师怎么办