(续)SSM整合之springmvc笔记(SpringMVC获取请求参数)(P131-135)
创始人
2024-01-27 23:45:35

目录

一   通过ServletAPI获取

1 . 新建TestParamController类

 2 . index.html

 3 .  在TestParamController类里面写getParamByServletAPI

4. 测试 重新部暑 

二 通过控制器方法的形参获取请求参数

1 .  index.html

2 .  TestParamController

3. 测试

三    @RequestParam

1 .如果当前请求参数的名字 和形参的名字不一样  

2. 解决办法  加@RequestParam注解

3 .测试

4 .  @RequestMapping注解的其他属性之required = true

 5 .  @RequestMapping注解的其他属性之defaultValue = "hello"

四  @RequestHeader

五 @CookieValue

六  通过POJO获取请求参数

1.创建实体类

2. index.html

3 在TestParamController类中写getParamByPojo方法

4  测试

七   解决获取请求参数的乱码问题

1 .配置springMVC的编码过滤器

2 .测试

全部总结


一   通过ServletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

1 . 新建TestParamController类

 

package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/*1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* * * */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}}

 

 2 . index.html



首页


index.html

测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符

用户名:
密码:


 

 3 .  在TestParamController类里面写getParamByServletAPI

用得不多  因为我们已经用了springmvc  就不用在用原生来获取

springmvc封装的是Servlet,然后我们现在作为控制层 就是一个pojo 就是一个普通的java类  我们并没有让他去实现任何的接口  也没有让他去继承任何的类  所以在getParamByServletAPI这个方法里面要获取请求参数的话,如果按照之前Servlet的思路  必须得有请求对象   也就是要有requset对象,可是现在这里面没有  因为目前这个类是一个普通的java类  没有任何的继承和没有任何的实现 

当我们的浏览器发送请求 让DispatcherServlet处理之后  他会拿着请求信息和控制层的@RequestMapping里面的信息进行匹配  如果匹配成功,则调用getParamByServletAPI,处理当前的请求   所以在调用getParamByServletAPI方法的时候也要查看参数的类型   如果我们设置一个 HttpServletRequest request类型的参数    那么在调用getParamByServletAPI方法的时候就会为参数request进行赋值

也就是说我们这里的request表示的是当前要处理的请求对象  换句话说  如果你想用Servlet的API 

那我们直接在的控制器方法getParamByServletAPI里面去设置就可以 

 

package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}}

4. 测试 重新部暑 

 

 

 

 总结:

通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数

通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参

1 .  index.html

 



首页


index.html

测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符

用户名:
密码:


2 .  TestParamController

package com.atguigu.controller;
/* * 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可* * */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param")public  String  getparam(String username,String password){System.out.println("username:"+username+",password:"+password);return "success";}}

3. 测试

 

 

 

 

 

三    @RequestParam

@RequestParam是将请求参数和控制器方法的形参创建映射关系 @RequestParam注解一共有三个属性: value:指定为形参赋值的请求参数的参数名 required:设置是否必须传输此请求参数,默认值为true 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值 为""时,则使用默认值为形参赋值

1 .如果当前请求参数的名字 和形参的名字不一样  

比如下图



首页


index.html

测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符

用户名:
密码:


2. 解决办法  加@RequestParam注解

@RequestParam解释

专门用来设置请求参数和控制器方法的形参 的映射关系的

@RequestParam里面的属性  

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default ValueConstants.DEFAULT_NONE;}
加上注解后

 


/* * 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可*3、@RequestParam:将请求参数和控制器方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 - Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关** */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param")public  String  getparam(@RequestParam("userName") String username,String password){System.out.println("username:"+username+",password:"+password);return "success";}}

3 .测试

 

 

4 .  @RequestMapping注解的其他属性之required = true

required = true  默认值是 true   是否必须传出value所对应的请求参数   如果不传  则直接报错


/* * 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可*3、@RequestParam:将请求参数和控制器方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 - Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关** */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param")public  String  getparam(@RequestParam(value = "userName",required = true) String username,String password){System.out.println("username:"+username+",password:"+password);return "success";}}

 

required:设置是否必须传输此请求参数,默认值为true

若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null

 

 

5 .  @RequestMapping注解的其他属性之defaultValue = "hello"

defaultValue:不管required属性值为true或false,当value所指定的请求参数有传输 则有值  如果没有传输  则使用默认值为形参赋值 required属性值为false   有传输

 

required属性值为true   无传输

 

自己总结:

required:设置是否必须传输此请求参数,默认值为true 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present; 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,但是有设置defaultValue属性,则会输出defaultValue属性值 若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null defaultValue:不管required属性值为true或false,当value所指定的请求参数有传输 则有值  如果没有传输  则使用默认值为形参赋值 总结:
@RequestParam:将请求参数和控制器方法的形参绑定
* @RequestParam注解的三个属性:value、required、defaultValue
* value:设置和形参绑定的请求参数的名字
* required:设置是否必须传输value所对应的请求参数
* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
* 400 - Required String parameter 'xxx' is not present
* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关

 

注: 若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串 数组或者字符串类型的形参接收此请求参数 若使用字符串数组类型的形参,此参数的数组中包含了每一个数据 若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果 @RequestParam是将请求参数和控制器方法的形参创建映射关系 @RequestParam注解一共有三个属性: value:指定为形参赋值的请求参数的参数名 required:设置是否必须传输此请求参数,默认值为true 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值 为""时,则使用默认值为形参赋值

四  @RequestHeader

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系 @RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

 

/* * 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可*3、@RequestParam:将请求参数和控制器方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 - Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值    无关*4、@RequestHeader:将请求头信息和控制器方法的形参绑定* 5、@CookieValue:将cookie数据和控制器方法的形参绑定* */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param")public  String  getparam(@RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,@RequestHeader("referer") String referer){System.out.println("referer:"+referer);System.out.println("username:"+username+",password:"+password);return "success";}}

 

 

 

@CookieValue

@CookieValue是将cookie数据和控制器方法的形参创建映射关系 @CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

/* * 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可*3、@RequestParam:将请求参数和控制器方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 - Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4、@RequestHeader:将请求头信息和控制器方法的形参绑定* 5、@CookieValue:将cookie数据和控制器方法的形参绑定* */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param")public  String  getparam(@RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,@RequestHeader("referer") String referer,@CookieValue("JSESSIONID") String jsessionId){System.out.println("referer:"+referer);System.out.println("jsessionId:"+jsessionId);System.out.println("username:"+username+",password:"+password);return "success";}}

 

 

 

Path=/springMVC; HttpOnly   有效路径

 

 

总结:

@RequestHeader:将请求头信息和控制器方法的形参绑定
@CookieValue:将cookie数据和控制器方法的形参绑定

六  通过POJO获取请求参数

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值

1.创建实体类

package com.atguigu.pojo;public class User {private Integer id;private String username;private String password;public User() {}public User(Integer id, String username, String password) {this.id = id;this.username = username;this.password = password;}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;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

2. index.html



首页


index.html

测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符

用户名:
密码:


3 在TestParamController类中写getParamByPojo方法

/* * 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可*3、@RequestParam:将请求参数和控制器方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 - Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4、@RequestHeader:将请求头信息和控制器方法的形参绑定5、@CookieValue:将cookie数据和控制器方法的形参绑定6、通过控制器方法的实体类类型的形参获取请求参数* 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致* 可以通过实体类类型的形参获取请求参数* */@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param")public  String  getparam(@RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,@RequestHeader("referer") String referer,@CookieValue("JSESSIONID") String jsessionId){System.out.println("referer:"+referer);System.out.println("jsessionId:"+jsessionId);System.out.println("username:"+username+",password:"+password);return "success";}@RequestMapping("/param/pojo")public String getParamByPojo(User user){System.out.println(user);return "success";}}

4  测试

 

总结

通过控制器方法的实体类类型的形参获取请求参数
* 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致
* 可以通过实体类类型的形参获取请求参数

七   解决获取请求参数的乱码问题

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

1 .配置springMVC的编码过滤器


CharacterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrueCharacterEncodingFilter/*SpringMVCorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc.xml1SpringMVC/

过滤器CharacterEncodingFilter的源码

CharacterEncodingFilter extends OncePerRequestFilter

OncePerRequestFilter extends GenericFilterBean

GenericFilterBean implements Filter

整合

CharacterEncodingFilter extends OncePerRequestFilter

OncePerRequestFilter extends GenericFilterBean

GenericFilterBean implements Filter

Alt + 7   查看类中结构  源码问题这里面不讲

2 .测试

 

 

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

 总结:

解决获取请求此参数的乱码问题
* 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter

全部总结

/*** 获取请求参数的方式:* 1、通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参* 就可以在控制器方法中使用request对象获取请求参数* 2、通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可* 3、@RequestParam:将请求参数和控制器方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 - Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关* 4、@RequestHeader:将请求头信息和控制器方法的形参绑定* 5、@CookieValue:将cookie数据和控制器方法的形参绑定* 6、通过控制器方法的实体类类型的形参获取请求参数* 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致* 可以通过实体类类型的形参获取请求参数* 7、解决获取请求此参数的乱码问题* 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter*/

 

                
            

相关内容

热门资讯

万的繁体字怎么写 繁体字怎么写... 一、繁体字大全简化偏旁讠[訁] 饣[飠] [昜] 纟[糹] [臤] 只[戠] 钅[釒] 呙[咼]A爱...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
桂林市属于哪个省 桂林为什么划... 桂林 [guì lín]广西壮族自治区下辖市桂林,简称桂,是世界著名风景游览城市、全国重要高新技术产...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...