SpringMVC学习(四)

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值