起初的目的是想在配置了InternalResourceViewResolver默认到web-info/views下的情况下,能不能让后台跳出web-info/views这个目录去webContent这个目录下去找页面呢,于是接触到了spirng视图解析器,最后找到了可以通过实现ViewResolver这个借口来进行视图的分发处理。
原理是在实现ViewResolver这个借口的前提下,在spring中配置这个类,然后在这个类中去截获springmvc中所返回的字符串,并在返回的字符串中做特俗处理,比如你要返回的这个页面是在web-info/views下,你就返回hello_views,这样在resolveViewName这个接口方法中去对截取到的字符串进行处理,如果发现已views这个结尾的,就让接下来的解析去去找相对应的视图解析器,这样基本就完成了。下面是具体实现
spring的具体配置文件如下
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<bean id="viewResolver" class="com.spring.action.MultiViewResover"> <property name="resolvers"> <map> <entry key="views"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </entry> <entry key="webapp"> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true"/> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </entry> </map> </property> </bean>
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45package com.spring.action; import java.util.Locale; import java.util.Map; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; /** * @author Jeson * @blog :http://www.gbsou.com * @date:Oct 20, 2009 8:39:27 AM * @version :1.0 * */ public class MultiViewResover implements ViewResolver { private Map<String, ViewResolver> resolvers; @Override public View resolveViewName(String viewName, Locale locale) throws Exception { int n = viewName.lastIndexOf("_"); // 获取 // viewName(modelAndView中的名字)看其有没有下划线 if (n == (-1)) return null; // 没有则直接返回空 // 有的话截取下划线后面的字符串 这里是自定义的views、webapp与配置文件中的<entry key="views">的key一致 String suffix = viewName.substring(n + 1); // 根据下划线后面的字符串去获取托管的视图解析类对象 ViewResolver resolver = resolvers.get(suffix); // 取下划线前面的部分 那时真正的资源名.比如我们要使用web-info/views/目录下的hello.jsp 那viewName就应该是hello_views viewName = viewName.substring(0, n); if (resolver != null) return resolver.resolveViewName(viewName, locale); return null; } public Map<String, ViewResolver> getResolvers() { return resolvers; } public void setResolvers(Map<String, ViewResolver> resolvers) { this.resolvers = resolvers; } }
controller层的代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33package com.spring.action; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorldAction { @RequestMapping(value = "/helloworld.do") public ModelAndView hello() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("hello_views"); modelAndView.addObject("message", "Hello,SpringMvc"); return modelAndView; } @RequestMapping(value = "/welcome.do") public ModelAndView helloVm() { // ModelAndView modelAndView=new ModelAndView(); // modelAndView.setViewName("hello_webapp"); // modelAndView.addObject("message", "Hello,Velocity"); // return modelAndView; Map map = new HashMap(); return new ModelAndView("freemarker_webapp", map); // 根据之前的解释这里就是去寻找 // user.ftl资源 } }
我这里没有进行多视图解析,而是用了多视图解析去解决了我目录跳转的问题,有问题随时留言,欢迎大家一起学习交流!
参考文献http://www.2cto.com/kf/201206/136736.html
最后
以上就是体贴银耳汤最近收集整理的关于spring MVC多视图配置的全部内容,更多相关spring内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复