文章目录
一、获取请求数据
1.1、直接获取数据
在SpringMVC中,由于所有的Servlet现在都只需要进行注解配置,我们发现没有办法进行参数的获取,可是真的是这样嘛?
我们看一下下面的例子
@RequestMapping("haha")
public String test01(String user){
System.out.println("user: " + user);
return "success";
}
jsp页面
<a href="haha?user=123">testPara</a>
我们可以看到:我们就知道了,需要什么就给方法加什么参数
1.2、获取请求参数注解:@RequestParam 注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
/**AliasFor
*用到注解 属性上,表示两个属性互相为别名,互相为别名的属性值必须相同,若设置成不同,则会报错
*/
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true; //是否这个参数是必须的
String defaultValue() default ValueConstants.DEFAULT_NONE; //默认值,当没有传递参数时使用该值
}
测试:
@RequestMapping("/paras")
public String test02(@RequestParam(name = "user", required = false, defaultValue = "haha")String username,
@RequestParam(name = "age")Integer age){
System.out.println("user: " + username + " age:" + age);
return "success";
}
//RequestParam(name = "age") = HttpServletRequest.getParameter("age");
jsp页面
<a href="test/paras?user=12345&age=16">testRequestParam</a><br>
<a href="test/paras">testRequestParamNoParas</a><br>
结果
1.3、获取请求头:@RequestHeader 注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default ""; //获取的请求头的名称
boolean required() default true; //这个参数是否是必须的
String defaultValue() default ValueConstants.DEFAULT_NONE; //默认值
}
测试:
@RequestMapping("head")
public String test03(@RequestHeader(name = "JSESSIONID")String JSESSIONID) {
System.out.println(JSESSIONID);
return "success";
}
// @RequestHeader(name = "JSESSIONID") = request.getHeader("JSESSIONID");
jsp:
<a href="test/head">测试请求头</a><br>
结果
1.4、获取Cookie:@CookieValue注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
测试代码
//java
@RequestMapping("cookie")
public String test04(@CookieValue(name = "JSESSIONID")String cookie) {
System.out.println(cookie);
return "success";
}
//jsp
<a href="/test/cookie">测试Cookie</a><br>
1.5、使用POJO作为参数
Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。且支持联机属性
POJO类
public class Student {
private String name;
private Integer age;
private String email;
private String phone;
private Address address;
}
public class Address {
private String city;
private String province;
}
Controller代码
@RequestMapping("pojo")
public String test05(Student student) {
System.out.println(student);
return "success";
}
jsp代码
<form action="test/pojo" method="post">
姓名<input type="text" name="name"><br>
年龄<input type="text" name="age"><br>
邮箱<input type="text" name="email"><br>
电话<input type="text" name="phone"><br>
city<input type="text" name="address.city"><br>
province<input type="text" name="address.province"><br>
<input type="submit" value="提交">
</form>
1.6、使用 Servlet 原生 API 作为参数
MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader
- Writer
二、补充
如果输出台出现乱码,我们需要进行编码的设置。分为get和post方式方式进行提交
2.1、GET方式提交
在tomcat的conf目录下找到server.xml中找到下面的语句,加上 **URIEncoding=“utf-8”**这句话
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="utf-8"
connectionTimeout="20000"
redirectPort="8443" />
2.2、POST方式提交
POST就比较麻烦了,就需要配置字符编码过滤器,且配置在其他过滤器之前。并且SpringMVC中已经提供了这个过滤器
CharacterEncodingFilter
public class CharacterEncodingFilter extends OncePerRequestFilter {
@Nullable
private String encoding; //编码格式
private boolean forceRequestEncoding = false; //是否更改请求编码格式
private boolean forceResponseEncoding = false; //是否更改相应编码格式
//在请求进servlet之前,先对编码格式是否进行更改做出判断,如果需要更改,就更改他
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String encoding = getEncoding();
if (encoding != null) {
if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}
}
我们在web.xml中进行配置
<!-- 配置字符过滤器,在所有的过滤器之前配置-->
<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>forceRequestEncoding</param-name>
<param-value>true</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中,只要我们给方法加上@RequestMapping注解后,这个方法就成为了一个controller,我们需要哪个参数,我们可以直接将参数名称放到方法的参数处,就可以直接获取的到。