springMVC之InternalResourceViewResolver

本文介绍Spring MVC框架中InternalResourceView及其解析器的工作原理,包括如何配置视图解析器,创建控制器处理登录验证流程,并展示如何使用InternalResourceView显示JSP页面。

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(真实路径和逻辑路径)

在IT行业中,C语言是一种基础且强大的编程语言,尤其在嵌入式系统和单片机开发领域中广泛应用。本项目“C语言+万年历+公历转农历+时钟函数”聚焦于C语言实现的实用功能,主要涵盖以下几个关键知识点:1. C语言基础:C语言是计算机科学的基础,其语法简洁、效率高,适用于编写系统级程序。在本项目中,开发者使用了C语言来编写公历到农历转换的算法和时钟函数,展示了C语言在处理时间和日期问题上的能力。2. 日期和时间处理:程序需要处理日期和时间数据,这涉及到对日期结构体的理解和操作。在C语言中,通常需要自定义结构体来表示日期和时间,并提供相应的操作函数,如比较、加减等。3. 农历算法:公历到农历的转换需要复杂的数学和天文知识。农历与公历的计算涉及月相、闰年和农历月份的天数等,开发者需要实现一套算法来准确地进行转换。在实际应用中,这样的算法可能基于历史数据和天文规律。4. 文件操作:“从公历转农历.txt”可能是程序的输入或输出文件。C语言提供了标准I/O库,包括`fopen`, `fprintf`, `fscanf`等函数,用于读写文件,实现数据的持久化存储。5. 单片机编程:由于标签提到了“单片机”,这表明该程序可能设计为在嵌入式环境中运行,如在微控制器上。在单片机上,需要考虑资源限制,例如内存、处理器速度等,因此代码需要优化以适应这些限制。6. 物联网应用:物联网(IoT)设备通常依赖于低功耗、低成本的硬件,其中C语言是常见的编程选择。本项目中的功能可能用于物联网设备的时间显示或者作为物联网应用的一部分,例如智能农业中农作物生长周期的农历追踪。7. 时间函数:除了自定义的农历转换算法,C语言标准库中也有提供时间处理的函数,如`time()`、`localtime()`和`strftime()`等。开发者可能结合这些标准库函数和自定义代码来实现更丰富的时钟功能。通过这个项目,开发者不仅可以学习C语言编程,还能深入理解日期和时间处理,特别是农历算法的实现,这对于拓展到其他相关领域,如物联网设备的软件开发,都是非常有价值的。同时,这也为想要了解C语言在实际项目中如何应用的学习者提供了宝贵的实践案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值