SpringMVC的请求

本文详细介绍了SpringMVC如何处理各种类型的请求参数,包括基本类型、对象类型、数组、集合以及复杂类型参数。同时,讲解了中文乱码的过滤器配置、自定义类型转换器的实现,并展示了@RequestParam、@RequestHeader和@CookieValue注解的使用,以及如何获取Servlet相关API。此外,还涵盖了处理日期类型的自定义转换器。

1. 请求参数类型介绍

客户端请求参数的格式是: name=value&name=value……

服务器要获取请求的参数的时候要进行类型转换,有时还需要进行数据的封装

SpringMVC可以接收如下类型的参数:

  • 基本类型参数
  • 对象类型参数
  • 数组类型参数
  • 集合类型参数

2. 获取基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自  动做类型转换;自动的类型转换是指从String向其他类型的转换。

jsp:

<a href="${pageContext.request.contextPath}/user/simpleParam?id=1&username=杰克">

基本类型

</a>

控制器:

@RequestMapping("/simpleParam")
public String simpleParam(Integer id,String username) { 
    System.out.println(id); 
    System.out.println(username);
    return "success";
}

3. 获取对象类型参数

Controller中的业务方法参数的POJO属性名与请求参数的name一致,参数值会自动映射匹配

JSP:

<form action="${pageContext.request.contextPath}/user/pojoParam" method="post">
编号:<input type="text" name="id"> <br>
用户名:<input type="text" name="username"> <br>
<input type="submit" value="对象类型">
</form>

实体类:

package com.lagou.domain;

public class User {

    private Integer id;
    private String username;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

控制器:

package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }


    /*
        获取对象类型请求参数
     */
    @RequestMapping("/pojoParam")
    public String pojoParam(User user){
        System.out.println(user);
        return "success";
    }

   
}

4. 中文乱码过滤器

post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤

<!--在web.xml中配置中文乱码过滤器-->
    <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>

5. 获取数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配

JSP:

<form action="${pageContext.request.contextPath}/user/arrayParam">
编号:<br>
<input type="checkbox" name="ids" value="1">1<br>
<input type="checkbox" name="ids" value="2">2<br>
<input type="checkbox" name="ids" value="3">3<br>
<input type="checkbox" name="ids" value="4">4<br>
<input type="checkbox" name="ids" value="5">5<br>
<input type="submit" value="数组类型">
</form>
package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }



    /*
        获取数组类型请求参数
     */
    @RequestMapping("/arrayParam")
    public String arrayParam(Integer[] ids){

        System.out.println(Arrays.toString(ids));
        return "success";

    }

   
}

6. 获取集合(复杂)类型参数

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

JSP:

<form action="${pageContext.request.contextPath}/user/queryParam" method="post">
搜索关键字:
<input type="text" name="keyword"> <br> user对象:
<input type="text" name="user.id" placeholder="编号">
<input type="text" name="user.username" placeholder="姓名"><br> list集合<br>
第一个元素:
<input type="text" name="userList[0].id" placeholder="编号">
<input type="text" name="userList[0].username" placeholder="姓名"><br>
第二个元素:
<input type="text" name="userList[1].id" placeholder="编号">
<input type="text" name="userList[1].username" placeholder="姓名"><br> map集合<br>
第一个元素:
<input type="text" name="userMap['u1'].id" placeholder="编号">
<input type="text" name="userMap['u1'].username" placeholder="姓名"><br>
第二个元素:
<input type="text" name="userMap['u2'].id" placeholder="编号">
<input type="text" name="userMap['u2'].username" placeholder="姓名"><br>
<input type="submit" value="复杂类型">
</form>

实体类:

package com.lagou.domain;

import java.util.List;
import java.util.Map;

public class QueryVo {

    private String keyword;
    private User user;
    private List<User> userList;
    private Map<String,User> userMap;

    @Override
    public String toString() {
        return "QueryVo{" +
                "keyword='" + keyword + '\'' +
                ", user=" + user +
                ", userList=" + userList +
                ", userMap=" + userMap +
                '}';
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    public Map<String, User> getUserMap() {
        return userMap;
    }

    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }
}

控制器:

package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }


    /*
        获取集合(复杂)类型请求参数
     */

    @RequestMapping("/queryParam")
    public String queryParam(QueryVo queryVo){
        System.out.println(queryVo);
        return "success";
    }

    
}

7.自定义类型转换器

SpringMVC   默认已经提供了一些常用的类型转换器;例如:客户端提交的字符串转换成int型进行参数设置,日期格式类型要求为:yyyy/MM/dd  不然的话会报错,对于特有的行为,SpringMVC提供了自定义类型转换器方便开发者自定义处理。

JSP:

<form action="${pageContext.request.contextPath}/user/converterParam">
生日:<input type="text" name="birthday">
<input type="submit" value="自定义类型转换器">
</form>

日期转换类:

package com.lagou.converter;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String, Date> {

    // s就是表单传递过来的请求参数 2012-12-12
    @Override
    public Date convert(String s) {

        // 将日期字符串转换成日期对象,进行返回
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = simpleDateFormat.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }


        return date;
    }
}

SpringMVC核心配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">


    <!--处理器映射器-处理器适配器 进行了功能的增强:支持json的读写-->
    <mvc:annotation-driven conversion-service="conversionService" />

 <!--自定义类型转换器配置-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">

        <property name="converters">
            <set>
                <bean class="com.lagou.converter.DateConverter"/>
            </set>
        </property>

    </bean>

</beans>

控制器:

package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }

    /*
        获取日期类型参数:(自定义类型转换器)
     */
    @RequestMapping("/converterParam")
    public String converterParam(Date birthday){
        System.out.println(birthday);
        return "success";
    }

}

8. 相关注解

@RequestParam

当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注  解显示的绑定。

JSP:

<a href="${pageContext.request.contextPath}/user/findByPage?pageNo=2">
分页查询
</a>

控制器:

package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }


    
    /*
        演示@RequestParam注解
     */
    /*
        @RequestParam
            name: 匹配页面传递参数的名称
            defaultValue: 设置参数的默认值
            required:设置是否必须传递该参数,默认值为true,如果设置了默认值,值自动改为false
     */
    @RequestMapping("findByPage")
    public String findByPage(@RequestParam(name = "pageNo",defaultValue = "1",required = false)Integer pageNum, @RequestParam(defaultValue = "5")Integer pageSize){
        System.out.println(pageNum); //2
        System.out.println(pageSize); //5
        return "success";
    }

  
}

@RequestHeader

获取请求头的数据。

package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }



    /*
        @ReuqestHeader注解的使用
     */

    @RequestMapping("/RequestHeader")
    public String requestHead(@RequestHeader("cookie") String cookie){
        System.out.println(cookie);
        return "success";
    }


}

@CookieValue

获取cookie中的数据。

package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {


    // http://localhost:8080/springmvc_quickstart/user/quick    /一级访问目录/二级访问目录
    /*
        path :作用等同于value,同样是设置方法的映射地址
        method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
        params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
     */
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
    public String quick(Integer id){
        // 业务逻辑
        System.out.println("springmvc入门成功.....");
        // 视图跳转 逻辑视图名
        return "success";
    }



    /*
        @CookieValue注解的使用
     */
    @RequestMapping("/cookieValue")
    public String cookieValue(@CookieValue("JSESSIONID") String jsessionId){
        System.out.println(jsessionId);
        return "success";
    }

    
}

9. 获取Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下。

/*
        原始serlvetAPI的获取
     */
    @RequestMapping("/servletAPI")
    public String servletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        // posthandler


        return "success";
    }

节选自拉钩教育JAVA系列课程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值