SpringMVC 获得请求数据

  • 前言
  • 一、SpringMVC 获得请求数据?
  • 二、SpringMVC接收参数
  • 1.获得各种参数
  • 2.请求数据乱码问题
  • 3.剩下是其他的一些方式
  • 4.自定义类型转换器
  • 总结



前言

通过学习前面的SpringMVC 的数据相应,通过页面看到了结果,但是编程不能只通过自己看到,要通过SpringMVC 获得请求数据,通过这样请求,达到跳转页面,增加更好的效果


一、SpringMVC 获得请求数据?

获得请求参数
客户端请求参数的格式是:name=value&name=value… …
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
1 基本类型参数
2 POJO类型参数
3 数组类型参数
4 集合类型参数

二、SpringMVC接收参数

1.获得各种参数

代码如下(示例):

//获得集合类型参数
    @RequestMapping(value="/quick15")
    @ResponseBody
    public void save15(@RequestBody List<User> userList) throws IOException {
        System.out.println(userList);
    }

    //获得集合类型参数
    @RequestMapping(value="/quick14")
    @ResponseBody
    public void save14(VO vo) throws IOException {
        System.out.println(vo);
    }

    //获得数组类型
    @RequestMapping(value="/quick13")
    @ResponseBody
    public void save13(String[] strs) throws IOException {
        System.out.println(Arrays.asList(strs));
    }

    //POJO参数类型
    @RequestMapping(value="/quick12")
    @ResponseBody
    public void save12(User user) throws IOException {
        System.out.println(user);
    }

    //基本数据类型
    @RequestMapping(value="/quick11")
    @ResponseBody
    public void save11(String username,int age) throws IOException {
        System.out.println(username);
        System.out.println(age);
    }

其中获得集合参数时,要将集合参数包装到一个POJO中才可以。

<form action="${pageContext.request.contextPath}/quick12" method="post">
	<input type="text" name="userList[0].username"><br>
	<input type="text" name="userList[0].age"><br>
	<input type="text" name="userList[1].username"><br>
	<input type="text" name="userList[1].age"><br>
	<input type="submit" value="提交"><br>
</form>

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
    <script>
        var userList = new Array();
        userList.push({username: "zhangsan", age: 18});
        userList.push({username: "lisi", age: 18});

        $.ajax({
            type: "POST",
            url: "${pageContext.request.contextPath}/user/quick15",
            data: JSON.stringify(userList),
            contentType: "application/json;charset=utf-8"
        });
    </script>
</head>
<body>
</body>
</html>

注意:通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器
DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种
方式指定放行静态资源:
• 在spring-mvc.xml配置文件中指定放行的资源
<mvc:resources mapping="/js/**" location="/js/"/>
• 使用<mvc:default-servlet-handler/ >标签

2.请求数据乱码问题

<!--配置全局过滤的filter-->
    <!--中文乱码-->
    <filter>
        <filter-name>CharacterEncodingFilter</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>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--配置SpringMVC的前端控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    <!--全局初始化参数-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <!--配置监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

3.剩下是其他的一些方式

//多文件上传
    @RequestMapping(value="/quick22")
    @ResponseBody
    public void save22(String username, MultipartFile uploadFile,MultipartFile uploadFile2) throws IOException {
        System.out.println(username);
        //获得上传文件的名称
        String originalFilename = uploadFile.getOriginalFilename();
        uploadFile.transferTo(new File("D:\\"+originalFilename));
        String originalFilename2 = uploadFile2.getOriginalFilename();
        uploadFile2.transferTo(new File("D:\\"+originalFilename2));
    }

    //使用@CookieValue可以获得指定Cookie的值
    @RequestMapping(value="/quick21")
    @ResponseBody
    public void save21(@RequestHeader(value = "JSESSIONID",required = false) String jsessionID) throws IOException {
        System.out.println(jsessionID);
    }

    //使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
    @RequestMapping(value="/quick20")
    @ResponseBody
    public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
        System.out.println(user_agent);
    }

    //SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入
    @RequestMapping(value="/quick19")
    @ResponseBody
    public void save19(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
    }

    @RequestMapping(value="/quick18")
    @ResponseBody
    public void save18(Date date) throws IOException {
        System.out.println(date);
    }

    //localhost/user/quick17/zhangsan
    @RequestMapping(value="/quick17/{username}")
    @ResponseBody
    public void save17(@PathVariable(value = "username") String username) throws IOException {
        System.out.println(username);
    }


    @RequestMapping(value="/quick16")
    @ResponseBody
    public void save16(@RequestParam(value="name",required=false,defaultValue = "itcast") String username) throws IOException {
        System.out.println(username);
    }

4.自定义类型转换器

SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。

自定义类型转换器的开发步骤:
① 定义转换器类实现Converter接口
② 在配置文件中声明转换器
③ 在中引用转换器

定义转换器类实现Converter接口

public class DateConverter implements Converter<String, Date> {
    public Date convert(String dateStr) {
        //将容器字符串转换成日期对象,返回
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date=format.parse(dateStr);
        }catch(ParseException e){
            e.printStackTrace();
        }

        return date;
    }
}

在配置文件中声明转换器

<bean id="converterService" 
	class="org.springframework.context.support.ConversionServiceFactoryBean">
	<property name="converters">
		<list>
			<bean class="com.itheima.converter.DateConverter"/>
		</list>
	</property>
</bean>

在中引用转换器

<mvc:annotation-driven conversion-service="converterService"/

总结

通过学习SpringMVC 获得请求数据,了解到各个SpringMVC可以接受类型的参数。还有各种可以获得的请求,或者上传文件等,为接下来的学习,开发,提供了基础。增加了学习激情。