`
suichangkele
  • 浏览: 200487 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

springMVC 配置——viewResolver

阅读更多

在springmvc的配置中,很重要的一个就是viewResolver,中文叫做视图解析器。他的作用就是处理MVC模式下从C到V的连接。视图可以使jsp的,也可以是velocity的,也可以是freemarker的,针对于不同的视图,springmvc定义了不同的视图解析器,所有的这些在org.springframework.web.servlet.view.UrlBasedViewResolver类的源码中都可以找到。今天我就把我对这个类的源码的总结记录下来。

视图解析器有很多个,一般的我们使用jsp作为视图的时候会使用org.springframework.web.servlet.view.InternalResourceViewResolver,使用velocity作为视图时会选择org.springframework.web.servlet.view.velocity.VelocityViewResolver,他们的共同的配置都在这个UrlBasedViewResolver中。

普遍的配置如下:prefix="/WEB-INF/JSP/" suffix=".jsp" 从controller返回的viewname是test,那么最终的跳转到的是/WEB-INF/jsp/test.jsp。

1、redirect:

如果一个路径是以redirect开头的,比如“redirect:myAction.do”,会出发一个重定向的指令,即302,而不是和普通的路径一样找视图。

2、forward:

如果一个路径是以forward开头的,比如forward:myAction.do就会出发一次新的访问,就是重新访问一次springmvc的servlet,这个就像是我们在使用servlet开发时的forward,只不过servlet中的forward是跳转的有jsp生成的servlet。

3、配置多个resolver

如果配置多个viewResolver的话,可以使用下面的order或者是viewNames,但是不能使用前缀或者是后缀,因为这两个都是用来添加到viewName上的的,不是用来区别viewName的。 

在配置多个resolver的时候,还有个需要注意的地方,即当没有找打指定的url对应的资源的时候,除了InternalViewResolver外,都会让停止解析,但是InternalViewResolver不会,所以源码中说要将InternalViewResolver放在最后,不过我觉得最好的办法还是使用viewNames来判断,比如我们有jsp和velocity的,我们可以在jsp的InternalViewResolver中设置suffix为“”,(默认就是“”),viewNames为“*.jsp”,然后再controller中返回的是xxx.jsp,在velocity的viewResolver中设置suffix为.vm,然后再controller中返回的就是xxx.vm,这样就不存在解析顺序的问题两天。

4、contentType属性

设置所有视图的属性,也就是jsp中的<meta Content-Type..../>,源码中的javadoc中说这个可能被忽略,如果视图已经有了这个配置的话,比如jsp中。

5、redirectContextRelative

这个属性很重要,默认是true,表示的是在重定向时,要不要以当前的contextPath以相对路径,如果是在servlet中的重定向时,我们必须写上当前应用的contextPath,但是在springmvc中我们在重定向时不用写,我想起来刚开始学习springmvc时我还烦了错误,现在知道了原来springmvc默认自动给我们加上了contextPath,当然我们是可以通过这个配置为false的。

6、viewNames  

是一个字符串的数组

这个属性是我今天第一次发现,他的意思是这样的,在我们配置的viewResolver中,在解析视图时先回调用这个类中的canHandle方法,这个方法内部就是调用正则表达式判断要解析的viewName能不能匹配当前viewResolver的newNames,只有在能解析的时候才会继续解析。

canhandle的源码:

 

protected boolean canHandle(String viewName, Locale locale) {
    String[] viewNames = getViewNames();
    return (viewNames == null || PatternMatchUtils.simpleMatch(viewNames, viewName));
}

 可以发现当viewName是null就会解析,PatternMatchUtils.simpleMath的源码如下:

 

 

public static boolean simpleMatch(String[] patterns, String str) {
	if (patterns != null) {
		for (int i = 0; i < patterns.length; i++) {
			if (simpleMatch(patterns[i], str)) {
				return true;
			}
		}
	}
	return false;
}

这个的判定条件是正则表达式匹配,只要有个匹配即可。 在viewResolver的viewName中可以使用简单的通配符,比如*。

 

我这里做了一个实验:

我的springmvc的配置文件是这样的:

 

<!-- 跳转到jsp的viewResolver -->
<bean
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/jsp/" />
	<property name="suffix" value=".jsp" />
	<property name="viewNames">
	    <array>
	       <value>a*</value>
	    </array>
	</property>
</bean>

 我的意图是这个viewResolver只能解析以a开头的试图,其他的都不能解析,我的controller是这样的

 

 

@Controller
@RequestMapping("/hello")
public class HelloWorldController {
	
	@RequestMapping("aaa.do")
	public String aaa(){
		return "aaa";
	}
	
	@RequestMapping("bbb.do")
	public String bbb(){
		return "bbb";
	}

 

 

当我访问aaa.do的时候,正常访问,但是当我访问bbb.do的时候就报了一下的错误:

[Could not resolve view with name 'bbb' in servlet with name 'springDispatcherServlet'] with root cause

 

javax.servlet.ServletException: Could not resolve view with name 'bbb' in servlet with name 'springDispatcherServlet',于是我们的理解得到验证。

7、order属性

 int类型的,源码的doc中说的是制定这个resolver的执行顺序,我做了如下的测试

我在springmvc的配置文件中加入了两个viewResolver,然后给他们不同的前缀和order,看一下到底是哪一个执行还是两个都执行

我的配置的截图如下:

 

<bean  name="resolver1"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="1"></property>
</bean>

<bean name="resolver2"
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/jsp2/" />
	<property name="suffix" value=".jsp" />
	<property name="order" value="2"></property>
</bean>

 然后在/WEB-INF下创建了一个jsp2的文件夹,然后再访问之前的aaa.do,发现是配置的order=1的resolver起作用了,然后我又把原先order=1的resolver改为order=3,发现是仅仅执行了order=2的resolver,可以总结order小的先执行,而且执行完了之后其他的resolver不会执行了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    SpringMVC——执行原理及简单配置实现.docx

    1. SpringMVC.xml配置文件:这是SpringMVC的核心配置,包含了各种组件的定义,如HandlerMapping、HandlerAdapter、ViewResolver等。在配置文件中,可以定义bean,设置拦截器、转换器和格式化器等。 2. Web.xml配置...

    springMVC整合MyBatis——SSM

    SpringMVC的主要组件包括DispatcherServlet(调度器)、HandlerMapping(处理器映射)、HandlerAdapter(处理器适配器)、ViewResolver(视图解析器)等。开发者可以自定义拦截器、模型、视图和控制器,实现高度定制...

    SpringMVC学习(一)——SpringMVC入门小程序

    在“SpringMVC学习(一)——SpringMVC入门小程序”中,我们首先会接触到SpringMVC的基本概念。这通常包括以下几个核心组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,负责接收HTTP请求,并根据配置...

    SpringMVC——demo

    【SpringMVC——demo】 SpringMVC是Spring框架的一个核心模块,主要用于构建Web应用程序。它是一种基于模型-视图-控制器(MVC)设计模式的轻量级Java Web开发框架,能够有效地分离业务逻辑和展示逻辑,使得代码更加...

    SpringMVC配置详解.pdf

    接下来,我们需要在`web.xml`文件中配置Spring MVC的核心组件——`DispatcherServlet`。`DispatcherServlet`是所有请求的入口点,它负责将请求分发给相应的处理器(Handler)。在`web.xml`中,我们定义`...

    SpringMVC精品资源-- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis).zip

    2. 配置Spring:创建Spring的配置文件,如`beans.xml`,配置Bean的定义,包括SpringMVC的相关组件,如DispatcherServlet、HandlerMapping、ViewResolver等。 3. 配置SpringMVC:设置SpringMVC的配置文件,如`servlet...

    java面试——SpringMVC面试专题.zip

    SpringBoot简化了SpringMVC的配置,通过自动配置和起步依赖,使开发更加高效。 通过深入理解和熟练掌握这些SpringMVC的核心概念和实践技巧,将大大提升你在Java面试中的竞争力。记得在面试中结合实际项目经验,...

    SSM框架——项目详细搭建(Spring+SpringMVC+MyBatis + oracle)

    SpringMVC通过DispatcherServlet接收请求,通过HandlerMapping找到对应的Controller,Controller处理业务逻辑后,通过ViewResolver解析视图,最后将结果返回给用户。 接下来是MyBatis,这是一个轻量级的持久层框架...

    spring和springMVC整合源码

    - **配置SpringMVC**:在SpringMVC配置文件中设置视图解析器、HandlerMapping、Controller等。 - **编写Controller**:创建一个简单的Controller,用@Controller注解标识,添加处理方法,通常使用@RequestMapping...

    SpringMVC3.1实例源码

    SpringMVC利用Spring的核心特性——依赖注入(DI),使得控制器和其他服务之间的协作更加灵活。通过@Autowired注解,可以自动装配所需的bean。 6. **异常处理** SpringMVC提供了全局异常处理机制,通过@...

    基于springMVC+spring+mybatis+mysql框架的增删改查demo

    1. 配置文件:如`applicationContext.xml`(Spring配置)、`springmvc-dispatcher-servlet.xml`(SpringMVC配置)和`mybatis-config.xml`(Mybatis配置)。 2. 数据库连接配置:如`db.properties`,包含数据库连接的...

    SpringMVC 3.1 体验

    此外,SpringMVC 3.1还引入了ModelAndView对象的替代品——`Model`和`ViewResolver`,这使得模型和视图的分离更加清晰。开发者可以直接在处理器方法中添加模型属性,而无需创建ModelAndView对象。 在异常处理方面,...

    传智播客_Springmvc+Mybatis由浅入深全套视频代码

    本教程涵盖了两个关键的Java Web开发框架——SpringMVC和Mybatis的全面解析,旨在帮助开发者从基础知识到深入实践,全面提升对这两项技术的理解和应用能力。 首先,让我们从SpringMVC开始。SpringMVC是Spring框架的...

    SpringMVC模板 

    在这个话题中,我们将深入探讨SpringMVC与两种常用的模板引擎——Velocity和FreeMarker的集成与应用。 首先,让我们了解SpringMVC的基本架构。在SpringMVC中,DispatcherServlet是入口点,它负责接收HTTP请求并根据...

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    SpringMVC的工作流程包括:接收到请求后,DispatcherServlet负责调度,通过HandlerMapping找到对应的Controller,Controller处理请求并返回ModelAndView对象,接着ViewResolver解析视图,最后将结果展示给用户。...

    最容易理解的SpringMVC代码

    在这个"最容易理解的SpringMVC代码"中,我们将深入探讨SpringMVC的核心组件——ModelAndView。 ModelAndView是SpringMVC中的一个关键类,它结合了模型数据和视图逻辑。在处理用户请求时,控制器通常会创建一个...

    SpringMVC.docx

    #### 六、SpringMVC核心组件——DispatcherServlet - **截获URL请求**:DispatcherServlet能够识别符合特定格式的URL请求。 - **初始化WebApplicationContext**:初始化与DispatcherServlet相关的...

    SpringMVC精品资源--Maven + Mysql + Shiro + SpringMVC + Spring.zip

    【SpringMVC精品资源——Maven、Mysql、Shiro、SpringMVC与Spring整合详解】 在当前的Java Web开发领域,SpringMVC框架因其强大的功能和灵活性而被广泛使用。这个压缩包“SpringMVC精品资源--Maven + Mysql + Shiro...

    springmvc 的工作流程.docx

    这个请求被SpringMVC中的前端控制器——`DispatcherServlet`捕获。`DispatcherServlet`是整个SpringMVC架构的核心,所有的请求都必须经过它来分发到具体的处理器。 2. **处理器映射器(Handler Mapping)**:当`...

    springMVC-JDBC例子

    在本示例中,我们探讨的是“springMVC-JDBC例子”,这主要涉及Spring框架的一个重要组成部分——Spring MVC,以及如何结合JDBC进行数据库操作。Spring MVC是Spring框架中的一个模块,专门用于构建Web应用程序,它...

Global site tag (gtag.js) - Google Analytics