我们在servlet里面学过,前端数据可以通过请求时的request域获取,获取request对象需要写先要继承HttpServlet,然后重写doGet 或者doPost方法,通过request调用getParameter获取请求参数。下面介绍一些springMVC里面的一些获取请求参数的方法。

文章目录

  • 获取请求参数
    • 1、通过request对象获取
    • 2、通过控制器方法的形参获取
    • 3、@RequestParam注释获取
    • 4、@RequestHeader和@CookieValue获取
    • 5、通过实体类获取请求参数
    • 6、修改默认编码

获取请求参数

1、通过request对象获取

springMVC通过request获取请求参数只需要在传参列表里面加入一个HttpServletRequest对象的参数就可以使用request域里面的方法。

@RequestMapping(value = "/testparam")public String toTestParam(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username="+username+",password="+password);return "testparams";}

2、通过控制器方法的形参获取

这种方法非常简单,你前端页面里面有什么求情,然后就在方法里面构造对应的形式参数就可以获取,需要注意的是请求参数名称必须要和前端请求参数名称一致,否者就获取不到。

@RequestMapping(value = "/testparam")public String toTestParam(String username,String password){System.out.println("username="+username+",password="+password);return "testparams";}

如果将username换成name,但是前端请求参数并没有这个,那就获取不到任何信息。

若请求参数有多个值,servlet里面有getParameterValues可以获取,那请求参数是否需要设置多个呢?但是肯定不是,参数列表处理对这种多个请求参数有两种表示方法,第一种就是直接用一个对应类型的形参接受,接受后的结果会用“,”拼接起来,第二种就是设置数组,用来存放多个值。
第一种:逗号拼接

@RequestMapping(value = "/testparam")public String toTestParam(String username,String password,String hobby){System.out.println("username="+username+",password="+password+",兴趣爱好:"+hobby);return "testparams";}


第二种:数组接收

@RequestMapping(value = "/testparam")public String toTestParam(String username,String password,String[] hobby){System.out.println("username="+username+",password="+password+",兴趣爱好:"+ Arrays.asList(hobby));return "testparams";}

3、@RequestParam注释获取

@RequestParam注释是用在参数列表里面的,只需要在形参前面加上就可以了。@RequestParam里面有三个参数:value=(“param”) required defaultVaulue
第一个属性里面是请求参数名,要和前端name属性一致,第二个参数是设置是否要必须传入请求参数,默认的是TRUE,如果值为TRUE并且前端没有传入value属性里面同名的请求参数,程序就会报错。如果改为false,对应value属性可以没有传入请求参数。第三个参数是设置对应请求参数的默认值,若前端没有传入值就使用这个默认值。

@RequestMapping(value = "/testparam1")public String toTestParam(@RequestParam(value = "username",required = false,defaultValue = "cx") String username,@RequestParam(value = "password",required = false,defaultValue = "123456")String password){System.out.println("username="+username+",password="+password);return "testparams";}

如果没有设置默认值,required 属性是true,并且请求参数没有传输,会报400错误

@RequestMapping(value = "/testparam1")public String toTestParam(@RequestParam(value = "user_name") String username,@RequestParam(value = "password",required = false,defaultValue = "123456")String password){System.out.println("username="+username+",password="+password);return "testparams";}

4、@RequestHeader和@CookieValue获取

@RequestHeader和@CookieValue注解使用方法和@RequestParam一样,里面的参数以及使用方法都完全相同,都有value=(“param”) required defaultVaulue三个属性,这里就不介绍了。@RequestHeader是获取请求头信息的,@CookieValue是通过cookie键获取cookie值的。

@RequestMapping(value = "/testheader1")public String toTestHader(@RequestHeader(value = "Host",required = true,defaultValue = "localhost:8080") String host,@CookieValue(value = "JSESSIONID")String cookie){System.out.println("Host:"+host);System.out.println("Cookie:"+cookie);return "testparams";}

5、通过实体类获取请求参数

我们在前面用到了通过参数列表获取请求参数,与servlet原生的获取方式要简单得多。单这种方式有一个缺点,就是万一前端请求参数有十几个或者更多呢,那参数列表总不能写十几个吧。下面就介绍一种更简单获取请求参数的方法,把表单里面的全部字段封装成一个实体类,通过实体类获取请求参数。需要注意的是实体类定义的属性名必须要和表单name属性一样,否者无法获取。
下面定义一个实体类User,用user对象获取请求参数。

// user属性,注意要先生成set,get方法private int id;private String username;private String password;private String[] hobby;
@RequestMapping(value = "/testparam2")public String toTestParam2(User user){System.out.println(user);return "testparams";}

获取结果:

6、修改默认编码

我们在请求或者响应时会有中文的内容,但是默认的编码不支持中文。在servlet里面我们通过 req.setCharacterEncoding(“utf-8”); resp.setCharacterEncoding(“utf-8”);方法改变请求和响应的编码,那在springMVC里面怎么修改呢。Javaweb三大组件:Servlet、Filter、Listener就是servlet程序,过滤器,监听器,这三大组件加载顺序是Listener——》Filter——》servlet,我们只需要在创建监听器的时候把编码改掉,那servlet里面的编码自然就都被改掉了。下面就是修改监听器编码的配置,将其加入到web.xm文件里面。

<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><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>