springMVC之InternalResourceViewResolver

InternalResourceView

用于同一Web应用程序内的JSP或其他资源的封装器。 将模型对象显示为请求属性,并使用RequestDispatcher将请求转发到指定的资源URL。

伪代码如下:

ModelMap  model = .......;       //ModelMap继承自LinkedHashMap
model.addAttribute("message", "logged in");   //model添加属性是在Controller方法中完成的

HttpServletRequest  request = ......;

Iterator iterator = model.entrySet().iterator();
while(iterator.hasNext()){
      Map.Entry entry = (Map.Entry) iterator.next();
      request.setAttribute(entry.getKey(), entry.getValue());
}
request.getRequestDispatcher(url);

该视图的URL应该指定Web应用程序内的资源,适用于RequestDispatcher的forward或include方法。

InternalResourceView的几个重要方法:

  • InternalResourceView(java.lang.String url)

      使用给定的URL创建一个新的InternalResourceView。

  • protected void renderMergedOutputModel(java.util.Map model,                               HttpServletRequest request,  HttpServletResponse response)

       基于给定的model参数渲染内部的资源。这包括将model设置为request的attribute属性。

  • protected RequestDispatcher getRequestDispatcher(HttpServletRequest request, java.lang.String path)

    获取RequestDispatcher,并通过forward/include方法跳转到指定的资源URL。默认实现很简单,内部直接调用 ServletRequest.getRequestDispatcher(String).


InternalResourceViewResolver

InternalResourceViewResolver是UrlBasedViewResolver的子类,支持InternalResourceView和JstlView。

最佳实践是将JSP文件放在WEB-INF文件夹下,从而避免JSP文件可以通过手动输入的URL被直接访问,只有控制器才能访问它们。

spring支持多个view resolver。当多个ViewResolver形成一条链时,InternalResourceViewResolver总是自动放在链的最后一个,因为它将尝试解析任何视图名称,而不管底层资源是否真实存在。

InternalResourceViewResolver用于访问诸如JSP、HTML、XHTML这样的view。它扩展了UrlBasedViewResolver,因此有2个属性:prefix和suffix。UrlBasedViewResolver使用前缀和后缀中定义的值,将逻辑视图转换成真实路径的资源URL。有2种方式配置InternalResourceViewResolver:XML配置和java配置。在我们的例子中使用的是XML配置。

XML配置:

dispatcher-servlet.xml



   
   
	  
	   
   
 

每一个从控制器方法中返回的logical view name都会被转换成JSP资源,例如:"myView" -> "/WEB-INF/jsp/myView.jsp"。

java配置:

@Configuration
@ComponentScan("com.concretepage")
@EnableWebMvc
public class AppConfig {
    @Bean  
    public InternalResourceViewResolver viewResolver() {  
	InternalResourceViewResolver resolver = new InternalResourceViewResolver();  
        resolver.setPrefix("/WEB-INF/pages/");  
        resolver.setSuffix(".jsp");
        return resolver;  
    }	
} 

创建Controller:

LoginController.java

package com.concretepage.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class LoginController {
	@RequestMapping(value="login", method = RequestMethod.GET)
	public String login(){
		return "login";
	}
	@RequestMapping(value="pages/userCheck", method = RequestMethod.POST)
	public String userCheck(ModelMap model, HttpServletRequest request) {
		String name=request.getParameter("name");
		String pwd=request.getParameter("pwd");
		if("concretepage".equalsIgnoreCase(name)&&"concretepage".equalsIgnoreCase(pwd)){
			model.addAttribute("message", "Successfully logged in.");
		}else{
			model.addAttribute("message", "Username or password is wrong.");
		}
		return "success";
	}
} 

web.xml



	Spring MVC Application
	
		dispatcher
		org.springframework.web.servlet.DispatcherServlet
		1
	
	
		dispatcher
		/
	
	
		contextConfigLocation
		/WEB-INF/dispatcher-servlet.xml
	
	
		org.springframework.web.context.ContextLoaderListener
	
 

创建视图

以下创建的JSP文件放在WEB-INF文件夹下。

login.jsp

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

Login

  
   Enter User Name: 
Enter Password :

success.jsp


Login Success

   Login Message : ${message}

 
源码下载地址: here


参考:InternalResourceView官方API

InternalResourceViewResolver官方API

spring官方文档22.5.2节

InternalResourceViewResolver Spring MVC Example

SpringMVC 视图解析器InternalResourceViewResolver(真实路径和逻辑路径)

你可能感兴趣的:(j2ee与Java,web)