前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC(五):SpringMVC的获取请求参数

SpringMVC(五):SpringMVC的获取请求参数

原创
作者头像
Lansonli
发布2022-12-27 00:45:12
7220
发布2022-12-27 00:45:12
举报
文章被收录于专栏:Lansonli技术博客

​SpringMVC的获取请求参数

紧耦合方式(了解)

DispatcherServlet中的service方法直接将此次请求的request对象传递给调用的单元方法即可。同时在单元方法上声明形参HttpServletRequest来接收request实参即可。

解耦合方式(熟练)

DispatcherServlet在其service方法中将请求数据根据需求从request对象中获取出来后,将数据直接传递给对应的单元方法使用。同时在单元方法上直接声明对应的形参接收请求数据即可。在单元方法上声明形参来接收请求数据时,形参名必须和请求数据的键名一致,DispatcherServlet会将调用单元方法的形参名作为请求数据的键名获取请求数据,然后传递给单元方法。

代码语言:javascript
复制
package com.lanson.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@RestController
public class TestDataController {
    /*紧耦合方式参数注入
    * 使用传统的HttpServletRequest对象获取参数  javax.servlet
    * */
    @RequestMapping("/getParamByRequest.do")
    public String getParam1(HttpServletRequest req, HttpServletResponse resp){
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username:"+username+"   password:"+password);
        return "getParamSuccess";
    }
    /*解耦合方式参数注入
    * HttpServletRequest对象获取参数 通过SpringMVC框架功能,自动转换参数
    * 处理单元参数列表中参数名必须和请求中的参数名一致
          * 如不一致,可以通过@RequestParma注解进行转换
    * */
    @RequestMapping("/getParamByArgName.do")
    public String getParam2(String username,@RequestParam("pwd") int password){
        System.out.println("username:"+username+"   password:"+password);
        return "getParamSuccess";
    }
}

一、POJO接收参数

1、form表单

代码语言:javascript
复制
<form action="getDataByPojo">
    <p>姓名<input type="text" name="pname"></p>
    <p>年龄<input type="text" name="page"></p>
    <p>性别:
        <input type="radio" name="gender" value="1" >男
        <input type="radio" name="gender" value="0" >女
    </p>
    <p>爱好
        <input type="checkbox" name="hobby" value="1"> 篮球
        <input type="checkbox" name="hobby" value="2"> 足球
        <input type="checkbox" name="hobby" value="3"> 羽毛球
    </p>生日
    <p>
        <input type="text" name="birthdate">
    </p>
    <input type="submit">
</form>

2、controller处理单元

代码语言:javascript
复制
package com.lanson.controller;
import com.lanson.pojo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@RestController
public class ReceiveDataController {
    /*
    * 使用POJO接收参数时,注意事项
    * 提交的参数名必须和POJO的属性名保持一致
    * springmvc底层通过反射给参数列表的属性赋值
    * 通过set方法设置属性值的,不是直接通过操作属性
    * POJO的属性一定要有set方法,要不然就会接收失败
    * */
    @RequestMapping("/getDataByPojo")
    public String getDataByPojo(Person p){
        System.out.println(p);
        return "success";
    }
}

3、POJO实体类

代码语言:javascript
复制
package com.lanson.controller;
import com.lanson.pojo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@RestController
public class ReceiveDataController {
    /*
    * 使用POJO接收参数时,注意事项
    * 提交的参数名必须和POJO的属性名保持一致
    * springmvc底层通过反射给参数列表的属性赋值
    * 通过set方法设置属性值的,不是直接通过操作属性
    * POJO的属性一定要有set方法,要不然就会接收失败
    * */
    @RequestMapping("/getDataByPojo")
    public String getDataByPojo(Person p){
        System.out.println(p);
        return "success";
    }
}

4、POJO实体类

代码语言:javascript
复制
package com.lanson.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Arrays;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class Person implements Serializable {
    private String pname;
    private String page;
    private String gender;
    private String[] hobby;
    private String birthdate;
}

二、日期类型转换

方式1 : 注解方式(推荐该方式)

@DateTimeFormat(pattern = "yyyy-MM-dd") 可以用于方法参数列表和 类的属性上

方式2: 配置转换器

第一步定义转换器

代码语言:javascript
复制
package com.lanson.util;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class StringToDateConverter implements Converter<String, Date> {
    private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
    @Override
    public Date convert(String source) {
        Date date =null;
        try {
            date = dateFormat.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException("日期转换异常");
        }
        return date;
    }
}

第二步springmvc.xml 中配置转换器

代码语言:javascript
复制
<!--数据转换工厂-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--配置类型转换器-->
        <property name="converters">
            <array>
                <!--注入自定义转换器对象-->
                <bean class="com.lanson.util.StringToDateConverter"></bean>
            </array>
        </property>
    </bean>
    <!--这里配置转换服务工厂-->
    <mvc:annotation-driven conversion-service="conversionService"/>

三、List集合接收参数

1、实体类

代码语言:javascript
复制
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Person implements Serializable {
    private String pname;
    private String page;
    private String gender;
    private String[] hobby;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthdate;
    private List<Pet> pets;
}

2、controller

代码语言:javascript
复制
@RequestMapping("/getDataByPojo")
    public String getDataByPojo(Person p){
        System.out.println(p);
        System.out.println(p.getPets());
        return "success";
    }

3、form表单

代码语言:javascript
复制
<form action="getDataByPojo">
    <p>姓名<input type="text" name="pname"></p>
    <p>年龄<input type="text" name="page"></p>
    <p>性别:
        <input type="radio" name="gender" value="1" >男
        <input type="radio" name="gender" value="0" >女
    </p>
    <p>爱好
        <input type="checkbox" name="hobby" value="1"> 篮球
        <input type="checkbox" name="hobby" value="2"> 足球
        <input type="checkbox" name="hobby" value="3"> 羽毛球
    </p>生日
    <p>
        <input type="text" name="birthdate">
    </p>
    宠物:
    <p>
        宠物1: 名字:<input type="text" name="pets[0].petName" >类型:<input type="text" name="pets[0].petType">
    </p>
    <p>
        宠物2: 名字:<input type="text" name="pets[1].petName" >类型:<input type="text" name="pets[1].petType">
    </p>
    <input type="submit">
</form>

四、Map集合接收参数

1、实体类

代码语言:javascript
复制
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Person implements Serializable {
    private String pname;
    private String page;
    private String gender;
    private String[] hobby;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthdate;
    private List<Pet> pets;
    private Map<String,Pet> petMap;
}

2、form表单

代码语言:javascript
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="getDataByPojo" method="post">
    <p>姓名<input type="text" name="pname"></p>
    <p>年龄<input type="text" name="page"></p>
    <p>性别:
        <input type="radio" name="gender" value="1" >男
        <input type="radio" name="gender" value="0" >女
    </p>
    <p>爱好
        <input type="checkbox" name="hobby" value="1"> 篮球
        <input type="checkbox" name="hobby" value="2"> 足球
        <input type="checkbox" name="hobby" value="3"> 羽毛球
    </p>生日
    <p>
        <input type="text" name="birthdate">
    </p>
    宠物List:
    <p>
        宠物1: 名字:<input type="text" name="pets[0].petName" >类型:<input type="text" name="pets[0].petType">
    </p>
    <p>
        宠物2: 名字:<input type="text" name="pets[1].petName" >类型:<input type="text" name="pets[1].petType">
    </p>
    宠物Map:
    <p>
        宠物1: 名字:<input type="text" name="petMap['a'].petName" >类型:<input type="text" name="petMap['a'].petType">
    </p>
    <p>
        宠物2: 名字:<input type="text" name="petMap['b'].petName" >类型:<input type="text" name="petMap['b'].petType">
    </p>
    <input type="submit">
</form>
</body>
</html>

3、controller

代码语言:javascript
复制
 @RequestMapping("/getDataByPojo")
    public String getDataByPojo(Person p){
        System.out.println(p);
        return "success";
    }

五、编码问题

1、GET乱码问题

2、POST乱码问题

web.xml中配置编码过滤器

代码语言:javascript
复制
<!--Spring 中提供的字符编码过滤器-->
<filter>
   <filter-name>encFilter</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>encFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ​SpringMVC的获取请求参数
    • 一、POJO接收参数
      • 1、form表单
      • 2、controller处理单元
      • 3、POJO实体类
      • 4、POJO实体类
    • 二、日期类型转换
      • 方式1 : 注解方式(推荐该方式)
      • 方式2: 配置转换器
    • 三、List集合接收参数
      • 1、实体类
      • 2、controller
      • 3、form表单
    • 四、Map集合接收参数
      • 1、实体类
      • 2、form表单
      • 3、controller
    • 五、编码问题
      • 1、GET乱码问题
      • 2、POST乱码问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档