@requestmapping如何获取请求参数呢?

重生 Spring 发布时间:2024-01-27 09:56:36 阅读数:2398 1
下文笔者讲述requestmapping获取请求参数的方法及示例分享,如下所示
1.获取HttpServletRequest对象中的信息获取参数值
2.参数名对其的方式 一一对应,Spring自动绑定值
例:

从前端页面,向控制器方法中传递参数

1.原生servlet 
 @RequestMapping(value = {"/param_yuansheng"})
public String get_param(HttpServletRequest request)
{ //servlet原生的方式   注意不能使用占位符方式传递参数,因为在传值时,
    // 占位符参数没办法获得参数名,只能是获得之后再赋名字
    //原生方式一般都不用,太麻烦
    String uname= request.getParameter("username");
    System.out.println(uname);
    return "test_param";
}

2.直接获取参数
参数名和name要一一对应
<a th:href="@{v}">点我跳转到形参获取参数值测试方法</a>
<form th:action="@{param_yuansheng}">
    <input type="text" name="username">
<input type="text" name="password">
    <input type="submit" value="直接获取请求参数">
</form>

//借助请求的形参来获得请求参数  形参的参数名 和控件的name名一定要对应
@RequestMapping(value = {"/param_xingcan"})
public String get_param(String username,String password)
{
    System.out.println(username);
    System.out.println(password);
    return "test_param";
}

//用一个map集合来接收所有的请求参数
@RequestMapping(value = {"/param_xingcan"})
public Map<String, String> get_param(@RequestParam("username") String username,
    @RequestParam("password") String password, @RequestParam Map<String,String> allparam)
{
    return allparam;
}

javaweb基础中,可使用request.getparamer加上名称获取参数值

    String name= request.getParameter("name");
       String pwd=request.getParameter("pwd");
对应的是@RequestParam注解

  //    /param_xingcan?username=mike&password=pwd
    @RequestMapping(value = {"/param_xingcan"})
    public Map<String, String> get_param(@RequestParam("username") String username, 
    @RequestParam("password") String password,
     @RequestParam Map<String, String> allparam) {
        return allparam;
    }

获得request请求的setattribute参数
需要 request.getparamer,对应@RequestAttribute注解

    @RequestMapping("/testrequestattribute2")
    public String test_requestattribute2(HttpServletRequest request) {
        request.setAttribute("msg","msg");
 
        return "forward:/testrequestattribute3";
    }
    @RequestMapping("/testrequestattribute3")
    @ResponseBody
    public String test_requestattribute3(@RequestAttribute("msg") String  msg) {
 
        return  msg;
    }

3.如果有多个name相同的控件,比如说多选框
发送的get请求会是这样的
 http://localhost:8080/Springmvcdemo2/param_duogetongmingcanshu?uname=123&upwd=123&hobbis=b&hobbis=c&hobbis=a

 发送的post请求会是这样

html页面:

多个同名参数
<form  th:action="@{param_duogetongmingcanshu}">
    用户名<input type="text" name="uname"></input>
    数组获取
    <input type="checkbox" name="hobbis2" value="b">
    <input type="checkbox" name="hobbis2" value="c">
    <input type="checkbox" name="hobbis2" value="a">
    字符串获取
    <input type="checkbox" name="hobbis" value="b">
    <input type="checkbox" name="hobbis" value="c">
    <input type="checkbox" name="hobbis" value="a">
    <input type="submit" content="click me">
</form>
1.可以用string接收,会得到选中的控件的value b,a,c的字符串 中间用,号隔开
2.可以用数组接收,会得到选中控件的value的数组[b, c,a]

 @RequestMapping(value = {"param_duogetongmingcanshu"})
    public String get_duogetongmingcanshu1(
                    String uname, String hobbis, String[] hobbis2)
    {System.out.println("------传递多个参数-----");
        System.out.println("uname:"+uname);
        System.out.println("字符串获取hobbis:"+hobbis);
        System.out.println("数组获取hobbis2:"+Arrays.toString( hobbis2));
        return "test_param";
    }
 

 4.按类传输
如果要传输的数据可以写成一个类时,可以新建一个user类,类中声明这三个参数和无参构造

注意类中的属性名和我要传的参数的名字一定要一一对应

 @RequestMapping(value = {"/param_class"})
    public String get_params(User user, HttpServletResponse response)
    {
        PrintWriter out = null;
        try {
            out = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        out.println(user);
        System.out.println(user);
        return "target";
    }
<hr>直接传输类
<form th:action="@{param_class}" method="get">
    用户名<input type="text" name="uunamed3">
    爱好<input type="radio" name="hobbis3" value="篮球" checked="true">
    <input type="radio" name="hobbis3" value="足球">
    用户id<input type="text" name="uid3" >
    <input type="submit" content="click me">
</form>
 当我有个user类,有 id和name和 pwd三个属性
   但我在获取用户输入时,不需要获取id(id在数据库表中自增)\
   那我就需要给user类写一个name和pwd的两参数的构造函数
     就可以传递user类
  @RequestMapping("/register_check")
    public String register_check(user user1)
    {
        System.out.println(user1);
        return null;
    }
<form th:action="@{/register_check}">
    用户名:<input type="text" name="userName">
    密码:<input type="text" name="userPwd">
    <input type="submit">
</form>


当user类中有int类型的属性
会自动将该属性强转为int类型
如果可以转换
  不报错
如果不能转换
 如:
  输入一个字符串,会报400
  
5. 用/传递参数 ,经常用于result风格的请求
SpringMVC支持路径中的占位符(重点)
原始方式:/deleteUser?id=1

restful方式:/deleteUser/1

SpringMVC路径中的占位符常用于Restful风格中
  当请求路径中将某些数据通过路径的方式传输到服务器中
    就可以在相应的@RequestMapping注解的value属性中
     通过占位符{xxx}表示传输的数据
  再通过@PathVariable注解
  将占位符所表示的数据赋值给控制器方法的形参

@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, 
  @PathVariable("username") String username){
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
//最终输出的内容为-->id:1,username:uanme1
<a th:href="@{/testRest/1/uname1}">测试路径中的占位符-->/testRest</a><br>
 如果路径中两个有参数中间夹着一个不是参数的,也是可以的

  @RequestMapping("/pathvarible/{name1}/and/{name2}")
    public String post(@PathVariable("name1")String name1,@PathVariable("name2") String name2)
    {
        return name1+name2;
    }
 

6.@RequestHeader  可以获取所有的请求头信息
@RequestMapping("/pathvarible/{name1}/and/{name2}")
public Map<String, String> post(@PathVariable("name1")String name1,
 @PathVariable("name2") String name2, @RequestHeader Map<String,String> header)
{
    return header;
}
 

 7.@CookieValue  获取cookie的信息
@RequestMapping("/testcookie")
public String testcookie(@CookieValue("_ga") String _ga)
{
    return _ga;
}
8.reuqsetbody  获取请求体信息
只能用于post请求,get请求没有请求体 

 

    @RequestMapping("/test")
    public String test(@RequestBody String body)
    {
        return body;
    }

9.解决获取请求参数的乱码问题
解决获取请求参数的乱码问题
可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter
但是必须在web.xml中进行注册  

拦截所有请求,并交给编码过滤器处理,将请求设置为param-value中指定的编码格式

<!--配置springMVC的编码过滤器-->
<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>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/Spring/202401/7813.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者