#Spring 视图 ##1. 概念介绍
###1.1 Servlet ####1.1.1 概念 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
####1.1.2 生命周期
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
###1.2 Servlet 跳转 ####1.2.1 redirect重定向 response对象的sendRedirect()方法
跳转路径: response.sendRedirect("/projectName/XXXX")
传值方式: 只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
浏览器地址栏: 会发生变化,这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令。
####1.2.2 forward转发
RequestDispatcher对象的forward()方法
跳转路径: request.getRequestDispatcher("/a.jsp").forward(request, response);
传值方式: url中带parameter,session,request.setAttribute。
浏览器地址栏: 不会发生变化,这种方式是在服务器端作的重定向。
##2. Spring 视图 ###2.1 Spring 视图返回方式
//返回String,利用Model对象
@RequestMapping("/toBuilding")
public String toBuilding(HttpServletRequest request,Model model){
String buildingId = request.getParameter("buildingId");
model.addAttribute("buildingId",buildingId);
return "/basedata/index.jsp";
}
//返回的是一个包含模型和视图的ModelAndView对象;
@RequestMapping(value = "/toEdit", method = RequestMethod.GET)
public ModelAndView toEdit(HttpServletRequest request,
ModelMap model, Integer restaurantId) {
ModelAndView mav = new ModelAndView();
mav.setViewName("/basedata/edit");
return mav;
}
//返回一个模型对象
//主要包含spring封装好的model和modelMap,以及java.util.Map,
@RequestMapping(value="/toUpdate",method=RequestMethod.GET)
public Map<String, String> toUpdate(){
Map<String, String> map = new HashMap<String, String>();
map.put("1", "1");
//map.put相当于request.setAttribute方法
return map;
}
//返回Json对象,返回字符串表示一个视图名称,如果需要在渲染视图的过程中需要模型的话,
//就可以给处理器添加一个模型参数,然后在方法体往模型添加值就可以了。
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public String delete(Integer Id) {
return "success";
}
2.2 Spring 视图解析器
在Spring MVC 4控制器中,所有的处理方法必须返回一个逻辑视图名称,无论是显式的(返回String,View或ModelAndView)还是隐式的。Spring中的视图由视图解析器处理这个逻辑视图名称。
处理视图最重要的两个接口ViewResolver和View。ViewResolver接口在视图名称和真正的视图之间提供映射; 而View接口则处理请求将真正的视图呈现给用户。
2.2.1 UrlBasedViewResolver
public static final String REDIRECT_URL_PREFIX = "redirect:";
public static final String FORWARD_URL_PREFIX = "forward:";
protected View createView(String viewName, Locale locale) throws Exception {
if(!this.canHandle(viewName, locale)) {
return null;
} else {
String forwardUrl;
//决定是重定向还是转发。
if(viewName.startsWith("redirect:")) {
forwardUrl = viewName.substring("redirect:".length());
RedirectView view = new RedirectView(forwardUrl, this.isRedirectContextRelative(), this.isRedirectHttp10Compatible());
return this.applyLifecycleMethods(viewName, view);
} else if(viewName.startsWith("forward:")) {
forwardUrl = viewName.substring("forward:".length());
return new InternalResourceView(forwardUrl);
} else {
return super.createView(viewName, locale);
}
}
}
2.2.2 InternalResourceViewResolver
它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持. InternalResourceViewResolver会把返回的视图名称都解析为 InternalResourceView对象, InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher 在服务器端把请求forword转发到目标URL 。