SpringMVC 获得请求数据

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>Titletitle>
    <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配置文件中指定放行的资源

• 使用标签

2.请求数据乱码问题

 
    
    <filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    
    <servlet>
        <servlet-name>DispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:spring-mvc.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServletservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>
    
    
    
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:applicationContext.xmlparam-value>
    context-param>
    
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-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>

在中引用转换器

总结

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

你可能感兴趣的:(java,springmvc,spring)