该篇博客主要阐述请求处理方法的两种参数——POJO和Servlet API
该篇博客主要阐述
1、请求处理方法参数——POJO
2、请求处理方法参数——Servlet API
一、请求处理方法参数——POJO
SpringMVC会按请求参数名(name)和POJO属性名进行自动匹配,自动为该对象填充属性值,支持级联属性
场景
客户端传输学生姓名、年龄、学生导师、导师所授课程
解决方案
两个POJO实体类(学生类、导师类)
Student.java
package linjie.springmvc.handler;
/**
* @author LinJie E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月17日 下午2:33:46
* 学生实体类
*/
public class Student {
private String name;//学生姓名
private int age;//学生年龄
private Teacher teacher;//学生的导师
/**
* 获取姓名
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取年龄
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取导师
* @return the teacher
*/
public Teacher getTeacher() {
return teacher;
}
/**
* @param teacher the teacher to set
*/
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
Teacher.java
package linjie.springmvc.handler;
/**
* @author LinJie E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月17日 下午2:35:25
* 教师实体类
*/
public class Teacher {
public String tname;//姓名
public String course;//教授课程
/**
* 获取姓名
* @return the tname
*/
public String getTname() {
return tname;
}
/**
* @param tname the tname to set
*/
public void setTname(String tname) {
this.tname = tname;
}
/**
* 获取课程
* @return the course
*/
public String getCourse() {
return course;
}
/**
* @param course the course to set
*/
public void setCourse(String course) {
this.course = course;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Teacher [tname=" + tname + ", course=" + course + "]";
}
}
请求前端页面index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>浅然SpringMVC</title>
</head>
<body>
<form action="springmvc/test">
age:<input type="text" name="age"><br>
name:<input type="text" name="name"><br>
<!-- 级联属性:Student的属性teacher,teacher的属性tname和course -->
teachername:<input type="text" name="teacher.tname"><br>
course:<input type="text" name="teacher.course"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
编写处理请求方法(控制器):参数为POJO
package linjie.springmvc.handler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 浅然 E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月17日 下午2:37:08
* 以POJO为参数的控制器方法类
*/
@Controller
@RequestMapping("/springmvc")
public class SpringMVCPojoTest {
@RequestMapping("/test")
public String test(Student student) {
System.out.println("student:"+student+" "+"studnet teacher or course:"+student.getTeacher());
return "hello";
}
}
可以看出通过以上场景的解决方案,使用POJO作为请求处理方法的参数轻松解决了,而且SpringMVC会按请求参数名(name)和POJO属性名进行自动匹配,自动为该对象填充属性值,这一点可以说相当赞了
客户端发送请求:http://localhost:8080/Springmvc_RequestMapping/index.jsp
服务器接收请求结果
二、请求处理方法参数——Servlet API
SpringMVC支持以下Servlet API作为请求处理方法参数
- HttpServletRequest或ServletRequest
- HttpServletResponse或ServletResponse
- HttpSession
- java.io.InputStream或java.io.Reader
- java.io.OutputStream或java.io.Writer
- java.security.Principal
- java.util.Locale
代码示例
如果请求处理方法需要访问HttpSession对象,则可以添加HttpSession作为参数,Spring会将对象正确地传递给方法
@RequestMapping("/uri")
public String myMethod(HttpSession session) {
...
session.addAttribute(key,value);
...
}
若需要访问客户端语言环境和HttpServletRequest对象,则可以在方法签名上包括这样的参数
@RequestMapping("/uri")
public String myOtherMethod(HttpServletRequest request,Locale locale){
...
//access Locale and HttpServletRequest here
...
}
场景
简单获取request对象的内存地址,获取response对象的内存地址
简单应用writer浏览器输出
解决方案
package linjie.springmvc.handler;
import java.io.IOException;
import java.io.Writer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 浅然 E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月17日 下午2:37:08
* 以Servlet API为参数的控制器方法类
*/
@Controller
@RequestMapping("/springmvc")
public class SpringMVCPojoTest {
@RequestMapping("/test2")
public void test2(HttpServletRequest request,HttpServletResponse response ,Writer out) throws IOException {
System.out.println(request+" "+response);
out.write("hello");
out.write("world");
}
}
浏览器输入: http://localhost:8080/Springmvc_RequestMapping/springmvc/test2
客户端响应情况
服务端接收情况
参考
《Spring MVC学习指南》