Spring 视图

#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 。

转载于:https://my.oschina.net/u/2265027/blog/728768

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值