InternalResourceView
用于同一Web应用程序内的JSP或其他资源的封装器。 将模型对象显示为请求属性,并使用RequestDispatcher将请求转发到指定的资源URL。
伪代码如下:
ModelMap model = .......; //ModelMap继承自LinkedHashMap<java.lang.String,java.lang.Object>
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<java.lang.String,java.lang.Object> 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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.concretepage.controller" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
每一个从控制器方法中返回的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
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Spring MVC Application</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
创建视图
以下创建的JSP文件放在WEB-INF文件夹下。
login.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head><title>Login</title></head>
<body>
<form:form action="pages/userCheck" method="post">
Enter User Name:<input type="text" name="name"> <br/>
Enter Password :<input type="password" name="pwd"/><br/>
<input type="submit">
</form:form>
</body>
</html>
success.jsp
<html>
<head><title>Login Success</title></head>
<body>
Login Message : ${message}
</body>
</html>
源码下载地址:
here
InternalResourceViewResolver官方API