用于同一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的几个重要方法:
使用给定的URL创建一个新的InternalResourceView。
基于给定的model参数渲染内部的资源。这包括将model设置为request的attribute属性。
获取RequestDispatcher,并通过forward/include方法跳转到指定的资源URL。默认实现很简单,内部直接调用 ServletRequest.getRequestDispatcher(String).
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(真实路径和逻辑路径)