SpringMVC___参数绑定以及配置过滤器解决POST乱码

该demo是动态web的project

Controller

@Controller
public class MyController{
/**
     * 可以通过对象来获取参数,前端只需直接使用与对象里属性名相同的参数名来传值 例如:name=xxx
     * HandleAdept处理器适配器利用反射从request里把与对象里属性名相同的进行了取值与封装
     * 如果对象里是属性还是一个对象,那么我们前端页面可以使用如:StuClass.address=xxx的形式进行参数传递
     * 
     * 可以通过设置形参来接受数据,前端只需要传入参数名与后台的形参对象中的属性名一致即可自动映射
     * 
     * @param stu
     */
    @RequestMapping(value="/indexJ",method=RequestMethod.GET)
    @ResponseBody//不加,表示进行页面跳转,由于后台这里我们没有进行跳转或者重定向的处理,前端会报错
    public void indexJ(Student stu) {
        // TODO Auto-generated method stub
        System.out.println("进入了indexI(),参数为:"+stu.getName()+" "
        +stu.getStuId()+" "
                +stu.getStuClass());
    }
    
    /**
     * 使用基本数据类型时,参数的名称必须和浏览器传来的参数的key一致,这样才能实现自动映射
     * 
     * 前端输入与参数名相同的参数controller就可以直接获取到对应的参数name=xxx
     * 
     * @param name
     * @param id
     */
    @GetMapping(value="/indexK")
    @ResponseBody
    public void indexK(String name,String id) {
        // TODO Auto-generated method stub
        System.out.println("参数为:"+name+" "+id);
    }
    
    /**
     * @RequestParam(value="Name",required=true)
     * value="xxx"给参数取别名,required为必填
     * 
     * 1、如果参数名和浏览器传来的key不一致,可以通过@RequestParam来解决。
     * 
     * 
     * 2、加了@RequestParam之后,如果未重新指定参数名,则默认的参数名依然是原本的参数名。
     * 添加了@RequestParam注解后,对应的参数默认将成为必填参数。
     * 如果没有传递相关的参数,则会抛出400 Bad Request
     * 
     * 3、可以通过设置required=false来设置该参数不是必填;@RequestParam(value="Name",required=false)
     * 
     * 4、可以设置给参数默认值,使用defaultValue,@RequestParam(value="Name",defaultValue="zsl")
     * @param name
     * @param id
     */
    @RequestMapping(value="/indexL",method=RequestMethod.GET)
    @ResponseBody
    public void indexL(@RequestParam(value="Name") String name,String id) {
        // TODO Auto-generated method stub
        System.out.println("参数:"+name+" "+id);
    }
    
    /**
     * 参数为数组可以直接接受前端传入的数组参数
     * 
     * 例如前端是复选框等,后台就需要使用到数组形参
     * 
     * @param games
     */
    @PostMapping("/indexM")
    @ResponseBody
    public void indexM(String[] games) {
        // TODO Auto-generated method stub
        for (String string : games) {
            System.out.println(string);
        }
    }
    
    /**
     * 参数为list集合需要把list设为对象的属性,
     * 
     * 不能直接使用list集合作为后台形参进行接受参数
     * 
     * @param stua
     */
    @PostMapping("/indexN")
    @ResponseBody
    public void indexN(StudentA stua) {
        // TODO Auto-generated method stub
        List<String> games = stua.getGames();
        for (String string : games) {
            System.out.println(string);
        }
    }
    
    /**
     * 当前端传入时间值为String而后台形参为Date类型时需要配置时间转换器进行类型转换
     * 
     * 
     * 配置时间转换器
     * 
     * 
     * 将前端传入的String类型的yyyy-MM-dd转换成Date类型
     * @param date
     */
    @GetMapping("/indexO")
    @ResponseBody
    public void indexO(Date date) {
        // TODO Auto-generated method stub
        System.out.println(date);
    }
    
    /**
     * 使用Model向页面传值
     * Model有addAttribute添加一个map或者一个对象
     * msg为Key,value可以是对象或者其他类型
     * 
     * 这里我的前端没有使用ajax,返回的也不是json
     * 
     * 
     * @param model
     * @param stu
     * @return
     */
    @GetMapping("/indexQ")
    public String indexQ(Model model,Student stu) {
        // TODO Auto-generated method stub
        model.addAttribute("msg",stu);
        return "index";
    }
    
    /**
     * 使用ModelAndView返回对象进行带参页面跳转
     * 
     * 类型可以变化
     * 
     * 
     * @param name
     * @return
     */
    @GetMapping("/indexR")
    public ModelAndView indexR(String name) {
        // TODO Auto-generated method stub
        ModelAndView mav = new ModelAndView();
        mav.addObject("msg",name);
        mav.setViewName("index");
        return mav;
    }
    
    /**
     * 使用Map作为参数接受
     * 
     *  这里我的前端没有使用ajax,返回的也不是json
     * @param map
     * @param stu
     * @return
     */
    @GetMapping("/indexS")
    public String indexS(Map<String, Student> map,Student stu) {
        // TODO Auto-generated method stub
        map.put("msg", stu);
        return "index";
    }
    
    /**
     * 使用参数类型ModelMap
     * 
     * 具体添加值有很多种,可以根据业务走
     * 
     *  这里我的前端没有使用ajax,返回的也不是json
     * @param m
     * @return
     */
    @GetMapping("/indexT")
    public String indexT(ModelMap m,String name) {
        // TODO Auto-generated method stub
        m.addAttribute("msg", name);
        return "index";
    }
}

时间转换器,要实现:
org.springframework.core.convert.converter.Converter接口
查看Converter<S,T>源码可以发现根据S和T泛型的不同,所需实现的方法不同:
SpringMVC___参数绑定以及配置过滤器解决POST乱码

public class StringToDate implements Converter<String,Date>{

    @Override
    public Date convert(String arg0) {
        // TODO Auto-generated method stub
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = dateFormat.parse(arg0);
            return date;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    
    
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!-- 开启扫描 -->
    <context:component-scan base-package="com.controller"/>
    
    <!-- 开启SpringMVC注解的方式 -->
    <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"/>
    
    <!-- 配置转换器 -->
    <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="formattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.utils.StringToDate" name="stringToDate"></bean>
            </set>
        </property>
    </bean> 
    
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 设置前后缀 -->
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

SpringMVC___参数绑定以及配置过滤器解决POST乱码

如果你以POST方式请求与响应出现了乱码,可以在web.xml里配置过滤器来设置字符编码:
spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>SpringDemo08</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <!-- *处理器or前端控制器 -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- 配置文件 -->
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <!-- 映射路径 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- spring框架提供的字符集过滤器 -->
    <!-- spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <!-- 过滤器映射 -->
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <!-- file的匹配规则 -->
<!-- 拦截url去除上下文后的映射路径/后的所有 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
上一篇:MATLAB如何使用对话框选择文件或文件夹,uigetdir-文件夹选择对话框,uigetfile-文件选择对话框


下一篇:Bug 佛祖镇楼