SpringMVC 请求处理 -请求参数相关

179 阅读2分钟

请求处理

请求参数处理

servlet 中使用 request.getParameter("name") 获取参数, 在SpringMVC中 只需要在处理方中声明对应的参数就可以自动接收请求的参数。并且还可以自动转换类型 类型不匹配会报400错误 请求的参数必须和处理参数参数名一致 如果处理方法的参数未传入的情况 会自动传入null

如果处理方法的参数和传入的参数不一致 可以使用 @RequestParam("myage") 作用到传入参数前面 指定url参数名称

@RequestParam("myage") Integer age
@RequestParam(value = "myage",required = false) Integer age
@RequestParam(value = "myage",defaultValue="111") Integer name

int 不能为null Integer 可以

jsp文件 form表单 url参数 项目根目录${"pageContext.request.contextPath"}

<form action="${pageContext.request.contextPath}/params01" method="post">

中文乱码: GET 请求乱码 : Tomcat conf server.xml 修改Connector 添加 URIEncoding="utf-8"

<Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" URIEncoding="utf-8"/>

POST 请求乱码: 在servlet 的时期 在获取参数之前设置 request.setCharsetEncoding("UTF-8"),每个参数都需要设置,所以国门用过滤器设置编码 request.setCharsetEncoding("") 终极解决方式

使用SpringMVC提供的编码过滤器CharacterEncodingFilter来解决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>
    <!--同时开启请求和响应的比那吗规则-->
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    
</filter>
<!--只过滤request1的servlet-->
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <servlet-name>request1</servlet-name>
</filter-mapping>

form表单与spring方法接受对应

package com.kdy.entity;

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

public class User {
    private Integer id;
    private String name;
    private String[] alias;
    private List<String> hobbies;

    private Map<String,String> relatives;

    private  Role role;


    private List<User> friends;
package com.kdy.entity;

public class Role {
    private Integer id;
    private String name;
<h2>复杂类型的参数演示</h2>
<form action="${pageContext.request.contextPath}/params03" method="post">
    ID:<input name="id" type="text"><br />

    姓名:<input name="name" type="text"><br />
    <!--对应String 数组及List-->
    外号: <input name="alias" type="checkbox" value="张三">张三
    <input name="alias" type="checkbox" value="李四">李四
    <input name="alias" type="checkbox" value="王二">王二
    <input name="alias" type="checkbox" value="赵武">赵武
    <input name="alias" type="checkbox" value="孔六">孔六
    <br />
<%--    爱好:<input name="hobbies" type="checkbox" value="唱歌">唱歌--%>
<%--    <input name="hobbies" type="checkbox" value="跳舞">跳舞--%>
<%--    <input name="hobbies" type="checkbox" value="美食">美食--%>
<%--    <input name="hobbies" type="checkbox" value="看电影">看电影--%>
    <!--List 是有索引的-->
    爱好:<input name="hobbies[0]" type="checkbox" value="唱歌">唱歌
    <input name="hobbies[1]" type="checkbox" value="跳舞">跳舞
    <input name="hobbies[2]" type="checkbox" value="美食">美食
    <input name="hobbies[3]" type="checkbox" value="看电影">看电影

    <br />
    亲属:
    <!--对应Map-->
    <input name="relatives[dagu]" type="checkbox" value="大姑">大姑
    <input name="relatives[ergu]" type="checkbox" value="二姑">二姑
    <input name="relatives[sijiuma]" type="checkbox" value="四舅妈">四舅妈
    <input name="relatives[badayi]" type="checkbox" value="八大姨">八大姨
    <!--子类-->
    角色名:<input name="role.name" type="text"><br />
    角色ID:<input name="role.id" type="text"><br />
    <!--子类list-->
    朋友1:<input name="friends[0].id" type="text" value="666">
    <input name="friends[0].name" value="孔德阳01" type="text">

    <input name="friends[1].id"  type="text" value="6667">

    <input name="friends[1].name" value="孔德阳11" type="text">


    <input type="submit" value="提交">
</form>
<!--

如果是包装类型的简单变量   直接输入属性名字 = 表单元素的name
数组 =保证表单元素name是一样的
List不是简单变量 必须加上[索引]     name="list[0].username"
map 必须加上[key] name="map[key]"

实体类  只能给某个属性赋值    name="Object.xxx"

-->

SpringMVC 控制器方法 传入多个参数解决

当传入参数有多个时,多个都会绑定参数

@RequestMapping("params03")
public String params03(User user, Role role){
    System.out.println(user);
    System.out.println(role);
    return "index.jsp";
}

image.png

遇到这种情况 一般再次封装一层 名字一般是ObjectDTO DTO:data translation object数据传输对象

package com.kdy.entity;

public class UserDTO {
    private User user;
    private Role role;

    public User getUser() {
        return user;
    }

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

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "UserDTO{" +
                "user=" + user +
                ", role=" + role +
                '}';
    }
}

此时form表单根据封装加上 user.xxx role.xxxx

<h2>复杂类型的参数演示</h2>
<form action="${pageContext.request.contextPath}/params04" method="post">
    ID:<input name="user.id" type="text"><br />

    姓名:<input name="user.name" type="text"><br />
    <!--对应String 数组及List-->
    外号: <input name="user.alias" type="checkbox" value="张三">张三
    <input name="user.alias" type="checkbox" value="李四">李四
    <input name="user.alias" type="checkbox" value="王二">王二
    <input name="user.alias" type="checkbox" value="赵武">赵武
    <input name="user.alias" type="checkbox" value="孔六">孔六
    <br />
<%--    爱好:<input name="hobbies" type="checkbox" value="唱歌">唱歌--%>
<%--    <input name="hobbies" type="checkbox" value="跳舞">跳舞--%>
<%--    <input name="hobbies" type="checkbox" value="美食">美食--%>
<%--    <input name="hobbies" type="checkbox" value="看电影">看电影--%>
    <!--List 是有索引的-->
    爱好:<input name="user.hobbies[0]" type="checkbox" value="唱歌">唱歌
    <input name="user.hobbies[1]" type="checkbox" value="跳舞">跳舞
    <input name="user.hobbies[2]" type="checkbox" value="美食">美食
    <input name="user.hobbies[3]" type="checkbox" value="看电影">看电影

    <br />
    亲属:
    <!--对应Map-->
    <input name="user.relatives[dagu]" type="checkbox" value="大姑">大姑
    <input name="user.relatives[ergu]" type="checkbox" value="二姑">二姑
    <input name="user.relatives[sijiuma]" type="checkbox" value="四舅妈">四舅妈
    <input name="user.relatives[badayi]" type="checkbox" value="八大姨">八大姨
    <!--子类-->
    角色名:<input name="user.role.name" type="text"><br />
    角色ID:<input name="user.role.id" type="text"><br />
    <!--子类list-->
    朋友1:<input name="user.friends[0].id" type="text" value="666">
    <input name="user.friends[0].name" value="孔德阳01" type="text">

    <input name="user.friends[1].id"  type="text" value="6667">

    <input name="user.friends[1].name" value="孔德阳11" type="text">

    <br ><br ><br >
    角色ID:<input name="role.id" type="text"><br />

    角色姓名:<input name="role.name" type="text"><br />
    <input type="submit" value="提交">
</form>

方法改进


@RequestMapping("params04")
public String params03(UserDTO userdto){
    System.out.println(userdto);
    return "index.jsp";
}

请求参数 其他注解 @RequestHeader 获取header头 @CookieValue 获取cookie中的值


//    @RequestMapping("params05")
//    public String params05(@RequestHeader("Host")  String host){
//        System.out.println(host);
//        return "index.jsp";
//    }
//
//
    @RequestMapping("params05")
    public String params06(@RequestHeader Map<String,String> headers){
        Set<Map.Entry<String, String>> entries = headers.entrySet();
        for(Map.Entry<String, String> entry:entries){
            System.out.println(entry.getKey()+"##-->>"+entry.getValue());
        }

        return  "index.jsp";
    }
    //获取cookie

    @RequestMapping("params06")
    public String cookie(@CookieValue("JSESSIONID") String seesionid){
        System.out.println(seesionid);
        return "index.jsp";
    }

SpringMVC 原生servlet的支持

@RequestMapping("/org")
public String orgServlet(HttpServletRequest request, HttpServletResponse response){

    Cookie[] cookies = request.getCookies();

    for (Cookie cookie : cookies) {
        System.out.println(cookie.getName() + ":"+cookie.getValue());
    }
    String name = request.getParameter("name");

    return "index.jsp";
}

除了HttpServletRequest HttpServletResponse 还有 HttpSession

Principal 获取安全协议相关

Local 当前语言

ServletInputStream OutputStream 等

springmvc 可以和 servlet api 一起用

技巧

JRebel插件 方便调试 Intellj 快捷键 Ctrl+Shift +Alt +N 查找类