我们在servlet里面学过,前端数据可以通过请求时的request域获取,获取request对象需要写先要继承HttpServlet,然后重写doGet 或者doPost方法,通过request调用getParameter获取请求参数。下面介绍一些springMVC里面的一些获取请求参数的方法。
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";
}
这种方法非常简单,你前端页面里面有什么求情,然后就在方法里面构造对应的形式参数就可以获取,需要注意的是请求参数名称必须要和前端请求参数名称一致,否者就获取不到。
@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";
}
@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";
}
@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";
}
我们在前面用到了通过参数列表获取请求参数,与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";
}
我们在请求或者响应时会有中文的内容,但是默认的编码不支持中文。在servlet里面我们通过 req.setCharacterEncoding(“utf-8”); resp.setCharacterEncoding(“utf-8”);方法改变请求和响应的编码,那在springMVC里面怎么修改呢。Javaweb三大组件:Servlet、Filter、Listener就是servlet程序,过滤器,监听器,这三大组件加载顺序是Listener——》Filter——》servlet,我们只需要在创建监听器的时候把编码改掉,那servlet里面的编码自然就都被改掉了。下面就是修改监听器编码的配置,将其加入到web.xm文件里面。
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>forceRequestEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>