在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不会执行了。
相关推荐
1. SpringMVC.xml配置文件:这是SpringMVC的核心配置,包含了各种组件的定义,如HandlerMapping、HandlerAdapter、ViewResolver等。在配置文件中,可以定义bean,设置拦截器、转换器和格式化器等。 2. Web.xml配置...
SpringMVC的主要组件包括DispatcherServlet(调度器)、HandlerMapping(处理器映射)、HandlerAdapter(处理器适配器)、ViewResolver(视图解析器)等。开发者可以自定义拦截器、模型、视图和控制器,实现高度定制...
在“SpringMVC学习(一)——SpringMVC入门小程序”中,我们首先会接触到SpringMVC的基本概念。这通常包括以下几个核心组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,负责接收HTTP请求,并根据配置...
【SpringMVC——demo】 SpringMVC是Spring框架的一个核心模块,主要用于构建Web应用程序。它是一种基于模型-视图-控制器(MVC)设计模式的轻量级Java Web开发框架,能够有效地分离业务逻辑和展示逻辑,使得代码更加...
接下来,我们需要在`web.xml`文件中配置Spring MVC的核心组件——`DispatcherServlet`。`DispatcherServlet`是所有请求的入口点,它负责将请求分发给相应的处理器(Handler)。在`web.xml`中,我们定义`...
2. 配置Spring:创建Spring的配置文件,如`beans.xml`,配置Bean的定义,包括SpringMVC的相关组件,如DispatcherServlet、HandlerMapping、ViewResolver等。 3. 配置SpringMVC:设置SpringMVC的配置文件,如`servlet...
SpringBoot简化了SpringMVC的配置,通过自动配置和起步依赖,使开发更加高效。 通过深入理解和熟练掌握这些SpringMVC的核心概念和实践技巧,将大大提升你在Java面试中的竞争力。记得在面试中结合实际项目经验,...
SpringMVC通过DispatcherServlet接收请求,通过HandlerMapping找到对应的Controller,Controller处理业务逻辑后,通过ViewResolver解析视图,最后将结果返回给用户。 接下来是MyBatis,这是一个轻量级的持久层框架...
- **配置SpringMVC**:在SpringMVC配置文件中设置视图解析器、HandlerMapping、Controller等。 - **编写Controller**:创建一个简单的Controller,用@Controller注解标识,添加处理方法,通常使用@RequestMapping...
SpringMVC利用Spring的核心特性——依赖注入(DI),使得控制器和其他服务之间的协作更加灵活。通过@Autowired注解,可以自动装配所需的bean。 6. **异常处理** SpringMVC提供了全局异常处理机制,通过@...
1. 配置文件:如`applicationContext.xml`(Spring配置)、`springmvc-dispatcher-servlet.xml`(SpringMVC配置)和`mybatis-config.xml`(Mybatis配置)。 2. 数据库连接配置:如`db.properties`,包含数据库连接的...
此外,SpringMVC 3.1还引入了ModelAndView对象的替代品——`Model`和`ViewResolver`,这使得模型和视图的分离更加清晰。开发者可以直接在处理器方法中添加模型属性,而无需创建ModelAndView对象。 在异常处理方面,...
本教程涵盖了两个关键的Java Web开发框架——SpringMVC和Mybatis的全面解析,旨在帮助开发者从基础知识到深入实践,全面提升对这两项技术的理解和应用能力。 首先,让我们从SpringMVC开始。SpringMVC是Spring框架的...
在这个话题中,我们将深入探讨SpringMVC与两种常用的模板引擎——Velocity和FreeMarker的集成与应用。 首先,让我们了解SpringMVC的基本架构。在SpringMVC中,DispatcherServlet是入口点,它负责接收HTTP请求并根据...
SpringMVC的工作流程包括:接收到请求后,DispatcherServlet负责调度,通过HandlerMapping找到对应的Controller,Controller处理请求并返回ModelAndView对象,接着ViewResolver解析视图,最后将结果展示给用户。...
在这个"最容易理解的SpringMVC代码"中,我们将深入探讨SpringMVC的核心组件——ModelAndView。 ModelAndView是SpringMVC中的一个关键类,它结合了模型数据和视图逻辑。在处理用户请求时,控制器通常会创建一个...
#### 六、SpringMVC核心组件——DispatcherServlet - **截获URL请求**:DispatcherServlet能够识别符合特定格式的URL请求。 - **初始化WebApplicationContext**:初始化与DispatcherServlet相关的...
【SpringMVC精品资源——Maven、Mysql、Shiro、SpringMVC与Spring整合详解】 在当前的Java Web开发领域,SpringMVC框架因其强大的功能和灵活性而被广泛使用。这个压缩包“SpringMVC精品资源--Maven + Mysql + Shiro...
这个请求被SpringMVC中的前端控制器——`DispatcherServlet`捕获。`DispatcherServlet`是整个SpringMVC架构的核心,所有的请求都必须经过它来分发到具体的处理器。 2. **处理器映射器(Handler Mapping)**:当`...
在本示例中,我们探讨的是“springMVC-JDBC例子”,这主要涉及Spring框架的一个重要组成部分——Spring MVC,以及如何结合JDBC进行数据库操作。Spring MVC是Spring框架中的一个模块,专门用于构建Web应用程序,它...