springMVC之InternalResourceViewResolver

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


参考:InternalResourceView官方API

InternalResourceViewResolver官方API

spring官方文档22.5.2节

InternalResourceViewResolver Spring MVC Example

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值