SpringMVC——处理请求数据

一、获取请求数据

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,我们需要哪个参数,我们可以直接将参数名称放到方法的参数处,就可以直接获取的到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值