天天看点

【SpringMVC】请求数据和响应数据的处理系列文章目录【前言】【正文】【总结】

系列文章目录

文章目录

  • 系列文章目录
  • 【前言】
  • 【正文】
    • 一、处理请求数据
      • (1)请求处理方法签名
      • (2)@RequestParam注解
        • 代码实例
      • (3)@RequestHeader 注解
        • 代码实例
      • (4)@CookieValue 注解
        • 代码实例
      • (5)使用POJO作为参数
        • 代码实例
        • 注意:中文乱码处理
      • (5)使用Servlet原生API作为参数
        • 代码实例
    • 二、处理响应数据
      • (1)SpringMVC 输出模型数据概述
        • 途径:
      • (2)处理模型数据之 ModelAndView
        • 介绍
        • 代码实例
      • (3)处理模型数据之 Map Model
        • Map介绍
        • 代码实例
  • 【总结】

【前言】

今天来介绍一下mvc中请求和响应数据是如何处理的。

提示:以下是本篇文章正文内容,下面案例可供参考

【正文】

一、处理请求数据

请求数据 : 请求参数 cookie信息 请求头信息……

JavaWEB :

HttpServletRequest

Request.getParameter(参数名); Request.getParameterMap();

Request.getCookies();

Request.getHeader();

(1)请求处理方法签名

1) Spring MVC 通过分析处理方法的签名(方法名+ 参数列表),HTTP请求信息绑定到处理方法的相应形参中。

2) Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。

3) 必要时可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)

4) Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

(2)@RequestParam注解

1)在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法

2)

value

:参数名

3)

required

:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常

4)

defaultValue

:默认值,当没有传递参数时使用该值

代码实例

1) 添加控制器方法

/**
 * @RequestParam 注解用于映射请求参数
 *         value 用于映射请求参数名称
 *         required 用于设置请求参数是否必须的
 *         defaultValue 设置默认值,当没有传递参数时使用该值
 */
@RequestMapping(value="/testRequestParam")
public String testRequestParam(
	@RequestParam(value="username") String username,
	@RequestParam(value="age",required=false,defaultValue="0") int age){
	System.out.println("testRequestParam - username="+username +",age="+age);
	return "success";
}
           

2) 添加页面链接

<!--测试 请求参数 @RequestParam 注解使用 -->
<a href="springmvc/testRequestParam?username=txg&age=10">testRequestParam</a>
           

(3)@RequestHeader 注解

1) 使用 @RequestHeader 绑定请求报头的属性值

2) 请求头包含了若干个属性,服务器可据此获知客户端的信息,通过@RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中

代码实例

1) 添加控制器方法

@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language") String al){
	System.out.println("testRequestHeader - Accept-Language:"+al);
	return "success";
}
           

2) 添加页面链接

<!-- 测试 请求头@RequestHeader 注解使用 -->
<a href="springmvc/testRequestHeader">testRequestHeader</a>
           

(4)@CookieValue 注解

1) 使用 @CookieValue 绑定请求中的 Cookie 值

2) @CookieValue 可让处理方法入参绑定某个 Cookie 值

代码实例

1) 添加控制器方法

//了解:@CookieValue: 映射一个 Cookie 值. 属性同 @RequestParam
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
	System.out.println("testCookieValue: sessionId: " + sessionId);
	return "success";
}
           

2) 添加页面链接

<!--测试 请求Cookie @CookieValue 注解使用 -->
<a href="springmvc/testCookieValue">testCookieValue</a>
           

(5)使用POJO作为参数

1) 使用 POJO 对象绑定请求参数值

2) Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等

代码实例

1) 添加控制器方法

/**
 * Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。
 * 支持级联属性
 *                 如:dept.deptId、dept.address.tel 等
 */
@RequestMapping("/testPOJO")
public String testPojo(User user) {
	System.out.println("testPojo: " + user);
	return "success";
}
           

2)添加实体类

package com.springlearn.pojo;

/**
 * @program: springMVC01
 * @description:
 * @author: txg
 * @create: 2021-09-05 18:02
 **/
public class Address {
    private String province;
    private String city;

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}
           
package com.springlearn.pojo;

/**
 * @program: springMVC01
 * @description:
 * @author: txg
 * @create: 2021-09-05 18:01
 **/
public class User {
    private Integer id;
    private String username;
    private String password;

    private String email;
    private int age;

    //所属的某个地址
    private Address address;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
           

3) 添加前端页面

【SpringMVC】请求数据和响应数据的处理系列文章目录【前言】【正文】【总结】
<!-- 测试 POJO 对象传参,支持级联属性 -->
<form action="testPOJO" method="POST">
	username: <input type="text" name="username"/><br>
	password: <input type="password" name="password"/><br>
	email: <input type="text" name="email"/><br>
	age: <input type="text" name="age"/><br>
	city: <input type="text" name="address.city"/><br>
	province: <input type="text" name="address.province"/>
	<input type="submit" value="Submit"/>
</form>
           

4)执行结果:

【SpringMVC】请求数据和响应数据的处理系列文章目录【前言】【正文】【总结】

注意:中文乱码处理

为了避免出现中文乱码情况,需要配置字符编码过滤器,且需要在配置其他过滤器之前,如(HiddenHttpMethodFilter),否则不起作用。

<!-- 配置字符集 -->
	<filter>
		<filter-name>encodingFilter</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>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
           

(5)使用Servlet原生API作为参数

1) MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数

  1. HttpServletRequest
  2. HttpServletResponse
  3. HttpSession
  4. java.security.Principal
  5. Locale
  6. InputStream
  7. OutputStream
  8. Reader
  9. Writer

2) 源码参考:AnnotationMethodHandlerAdapter L866

【SpringMVC】请求数据和响应数据的处理系列文章目录【前言】【正文】【总结】
@Override
    protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);

        if (ServletRequest.class.isAssignableFrom(parameterType) ||
                MultipartRequest.class.isAssignableFrom(parameterType)) {
            Object nativeRequest = webRequest.getNativeRequest(parameterType);
            if (nativeRequest == null) {
                throw new IllegalStateException(
                        "Current request is not of type [" + parameterType.getName() + "]: " + request);
            }
            return nativeRequest;
        }
        else if (ServletResponse.class.isAssignableFrom(parameterType)) {
            this.responseArgumentUsed = true;
            Object nativeResponse = webRequest.getNativeResponse(parameterType);
            if (nativeResponse == null) {
                throw new IllegalStateException(
                        "Current response is not of type [" + parameterType.getName() + "]: " + response);
            }
            return nativeResponse;
        }
        else if (HttpSession.class.isAssignableFrom(parameterType)) {
            return request.getSession();
        }
        else if (Principal.class.isAssignableFrom(parameterType)) {
            return request.getUserPrincipal();
        }
        else if (Locale.class.equals(parameterType)) {
            return RequestContextUtils.getLocale(request);
        }
        else if (InputStream.class.isAssignableFrom(parameterType)) {
            return request.getInputStream();
        }
        else if (Reader.class.isAssignableFrom(parameterType)) {
            return request.getReader();
        }
        else if (OutputStream.class.isAssignableFrom(parameterType)) {
            this.responseArgumentUsed = true;
            eturn response.getOutputStream();
        }
        else if (Writer.class.isAssignableFrom(parameterType)) {
            this.responseArgumentUsed = true;
            return response.getWriter();
        }
        return super.resolveStandardArgument(parameterType, webRequest);
    }
           

代码实例

1) 添加控制器方法

@RequestMapping("/testServletAPI")
public void testServletAPI(HttpServletRequest request,HttpServletResponse response, Writer out) throws IOException {
	System.out.println("testServletAPI, " + request + ", " + response);
	out.write("hello springmvc");
	//return "success";
}
           

2) 添加页面链接

<!-- 测试 Servlet API 作为处理请求参数 -->
<a href="springmvc/testServletAPI">testServletAPI</a>
           

二、处理响应数据

javaWEB: request.setAttribute(xxx) request.getRequestDispatcher(“地址”).forward(req,resp);

(1)SpringMVC 输出模型数据概述

途径:

1) ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据

2) Map 或 Model: 入参为 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

(2)处理模型数据之 ModelAndView

介绍

控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。

1) 两个重要的成员变量:

private Object view;

视图信息

private ModelMap model;

模型数据

3)添加模型数据:

MoelAndView addObject(String attributeName, Object attributeValue)

设置模型数据

ModelAndView addAllObject(Map<String, ?> modelMap)

4)设置视图:

void setView(View view)

设置视图对象

void setViewName(String viewName)

设置视图名字

5)获取模型数据

protected Map<String, Object> getModelInternal()

获取模型数据

public ModelMap getModelMap()

public Map<String, Object> getModel()

代码实例

1) 添加控制器方法

/**
 * 目标方法的返回类型可以是ModelAndView类型
 *                 其中包含视图信息和模型数据信息
 */
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
	System.out.println("testModelAndView");
	String viewName = "success";
	ModelAndView mv = new ModelAndView(viewName );
	mv.addObject("time",new Date().toString()); //实质上存放到request域中 
	return mv;
}
           

2) 添加页面链接

<!--测试 ModelAndView 作为处理返回结果 -->
<a href="springmvc/testModelAndView">testModelAndView</a>
           

3) 添加成功页面,显示数据

time: ${requestScope.time }
           

(3)处理模型数据之 Map Model

Map介绍

1)Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据

具体使用步骤

2)Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。

3)如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。

4)在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据

代码实例

1) 添加控制器方法

//目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){ //【重点】
	System.out.println(map.getClass().getName());
	//org.springframework.validation.support.BindingAwareModelMap
	map.put("names", Arrays.asList("Tom","Jerry","Kite"));
	return "success";
}
           

2) 增加页面链接

<!-- 测试 Map 作为处理返回结果 -->
<a href="springmvc/testMap">testMap</a>
           

3) 增加成功页面,显示结果

4) 显示结果截图

【SpringMVC】请求数据和响应数据的处理系列文章目录【前言】【正文】【总结】

【总结】

以上就是今天要讲的内容,本文仅仅简单介绍了请求数据和响应数据应该如何处理,望大佬们斧正!

感谢你的阅读!