1.1. 响应数据封装
1.1.1. Servlet API 对象(了解)
重定向
转发
将请求数据直接封装到Request 对象
/spring-mvc-v1/src/main/webapp/WEB-INF/pages/response.jsp
pageEncoding="UTF-8"%>
响应页面response page
${data}
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/resp/")
@Controller
public class ResponseHandleController {
//响应数据的封装
@RequestMapping("doRespData01")
public String doRespData01(HttpServletRequest request){
//直接将数据封装到标准servlet api对象中
request.setAttribute("data", "sys log message");
return "response";//view name
//返回的view会通过视图解析器进行解析
//前端控制器基于视图解析器返回的页面,进行请求转发
}
}
response page
sys log message
pageEncoding="UTF-8"%>
响应页面response page
${data1}
${data2}
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/resp/")
@Controller
public class ResponseHandleController {
//响应数据的封装
@RequestMapping("doRespData01")
public String doRespData01(HttpServletRequest request){
//直接将数据封装到标准servlet api对象中
request.setAttribute("data1", "sys log message");
return "response";//view name
//返回的view会通过视图解析器进行解析
//前端控制器基于视图解析器返回的页面,进行请求转发
}
@RequestMapping("doRespData02")
public String doRespData02(HttpServletRequest request){
//直接将数据封装到标准servlet api对象中
request.setAttribute("data2", "request redirect message");
//当需要重定向到某个url时,需要添加redirect前缀
return "redirect:doRespData01.do";//view name
}
}
localhost/spring-mvc-v1/resp/doRespData02.do
data2的数据没拿到
response page
sys log message
pageEncoding="UTF-8"%>
响应页面response page
${data1}
${data2}
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/resp/")
@Controller
public class ResponseHandleController {
//响应数据的封装
@RequestMapping("doRespData01")
public String doRespData01(HttpServletRequest request){
//直接将数据封装到标准servlet api对象中
request.setAttribute("data1", "sys log message");
return "response";//view name
//返回的view会通过视图解析器进行解析
//前端控制器基于视图解析器返回的页面,进行请求转发
}
@RequestMapping("doRespData02")
public String doRespData02(HttpServletRequest request){
//直接将数据封装到标准servlet api对象中
request.getSession().setAttribute("data2", "request redirect message");
//当需要重定向到某个url时,需要添加redirect前缀
return "redirect:doRespData01.do";//view name
//返回此方法时客户端向服务器端底层发起了两次请求
}
}
localhost/spring-mvc-v1/resp/doRespData02.do
response page
sys log message
request redirect message
1.1.2. ModelAndView 对象(重点)
在对服务端响应数据进行封装时,可以直接在方法参数中定义一个ModelAndView类型的参数,借助ModelAndView对象封装响应数据。
前端控制器接着对mv进行视图解析
前端控制器会调用视图解析器对mv中的view进行解析,前端控制器会将请求数据转发到视图解析器的view页面
public class ModelMap extends LinkedHashMap {
}
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@RequestMapping("/resp/")
@Controller
public class ResponseHandleController {
@RequestMapping("doRespData03")
public ModelAndView doRespData03(ModelAndView mv)
{
//系统底层会将数据存储到request作用域
mv.addObject("data1","model and view data");
//当系统返回mv时,经过视图解析获取view页面,并将请求转发到此页面
mv.setViewName("response");
return mv;//此方法的返回值返回给调用方:前端控制器DispatcherServlet,前端控制器会调用视图解析器对mv中的view进行解析,前端控制器会将请求数据转发到视图解析器的view页面
}
}
response page
model and view data
下面的配置叫视图解析器
/spring-mvc-v1/src/main/resources/spring-configs.xml
@RequestMapping("doRespData04")
public String doRespData04(Model m)
{
System.out.println(m.getClass().getName());
m.addAttribute("data1","model message");
System.out.println(m.getClass().getName());
return "response";//此方法的返回值返回给调用方:前端控制器
}
response page
model message
控制台
org.springframework.validation.support.BindingAwareModelMap
org.springframework.validation.support.BindingAwareModelMap
1.1.3. Map对象(了解)
将响应数据封装到Map中(我建议假如使用map对数据进行封装,可直接采用model对象)。
@RequestMapping("doRespData05")
public String doRespData05(Map map)
{
map.put("data1", "map..");
return "response";
}
response page
map..