[導讀]在基於SpringMVC的項目中有時須要同時使用多種視圖格式,如jsp,velocity及freemarker等,經過不一樣的請求路徑配置規則,映射到不一樣的視圖文件。下面我提供一種思路,經過視圖模板文件後綴名的方式來進行處理。例如:@RequestMapping(value = "/hello") public String jspTest(HttpServletRequest request, M...html
在基於SpringMVC的項目中有時須要同時使用多種視圖格式,如jsp,velocity及freemarker等,經過不一樣的請求路徑配置規則,映射到不一樣的視圖文件。下面我提供一種思路,經過視圖模板文件後綴名的方式來進行處理。例如:java
1
2
3
4
|
@RequestMapping
(value =
"/hello"
)
public
String jspTest(HttpServletRequest request, ModelMap map) {
return
"demo.jsp"
;
}
|
將經過」demo.jsp」的後綴自動使用jsp的視圖解析器。web
下面描述下詳細思路:spring
一.自定義視圖解析器apache
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
package
com.jeedev.common.web.springmvc.view;
import
java.util.HashMap;
import
java.util.Locale;
import
java.util.Map;
import
java.util.Set;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
import
org.springframework.web.servlet.View;
import
org.springframework.web.servlet.ViewResolver;
/**
* 自定義視圖解析(經過配置實現多視圖整合,如jsp,velocity,freemarker,pdf,excel...)
* @author huligong
*
*/
public
class
JeeDevViewResolver
implements
ViewResolver {
private
static
Log logger = LogFactory.getLog(JeeDevViewResolver.
class
);
public
View resolveViewName(String viewName, Locale locale)
throws
Exception {
for
(Map.Entry<Set<String>, ViewResolver> map : viewResolverMap.entrySet()){
Set<String> suffixs = map.getKey();
for
(String suffix : suffixs){
if
(viewName.endsWith(suffix)){
ViewResolver viewResolver = map.getValue();
if
(
null
!= viewResolver){
if
(logger.isDebugEnabled()) {
logger.debug(
"found viewResolver '"
+ viewResolver +
"' for viewName '"
+ viewName+
"'"
);
}
return
viewResolver.resolveViewName(viewName, locale);
}
}
}
}
if
(defaultViewResolver !=
null
){
return
defaultViewResolver.resolveViewName(viewName, locale);
}
// to allow for ViewResolver chaining
return
null
;
}
private
Map<Set<String>,ViewResolver> viewResolverMap =
new
HashMap<Set<String>,ViewResolver>();
private
ViewResolver defaultViewResolver =
null
;
public
Map<Set<String>, ViewResolver> getViewResolverMap() {
return
viewResolverMap;
}
public
void
setViewResolverMap(Map<Set<String>, ViewResolver> viewResolverMap) {
this
.viewResolverMap = viewResolverMap;
}
public
ViewResolver getDefaultViewResolver() {
return
defaultViewResolver;
}
public
void
setDefaultViewResolver(ViewResolver defaultViewResolver) {
this
.defaultViewResolver = defaultViewResolver;
}
}
|
在自定義視圖解析器(實際上是視圖中轉器)中,經過對視圖文件的後綴判斷(而不是請求地址的後綴)而返回給不一樣的視圖解析器處理。mvc
二.視圖映射配置dispather-servlet.xmlapp
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<
bean
id
=
"viewResolver"
class
=
"com.jeedev.common.web.springmvc.view.JeeDevViewResolver"
>
<
property
name
=
"defaultViewResolver"
ref
=
"beanNameViewResolver"
/>
<
property
name
=
"viewResolverMap"
>
<
map
>
<
entry
>
<
key
>
<
set
>
<
value
>.jsp</
value
>
</
set
>
</
key
>
<
ref
bean
=
"jspViewResolver"
/>
</
entry
>
<
entry
>
<
key
>
<
set
>
<
value
>.vm</
value
>
<
value
>.htm</
value
>
</
set
>
</
key
>
<
ref
bean
=
"velocityViewResolver"
/>
</
entry
>
<
entry
>
<
key
><
value
>.ftl</
value
></
key
>
<
ref
bean
=
"freeMarkerViewResolver"
/>
</
entry
>
</
map
>
</
property
>
</
bean
>
<
bean
id
=
"beanNameViewResolver"
class
=
"org.springframework.web.servlet.view.BeanNameViewResolver"
/>
<
bean
id
=
"jspViewResolver"
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
>
<!-- Velocity ViewResolver Configuration -->
<
bean
id
=
"velocityViewResolver"
class = "org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<
property
name
=
"order"
value
=
"0"
/>
<
property
name
=
"contentType"
value
=
"text/html;charset=UTF-8"
/>
<
property
name
=
"requestContextAttribute"
value
=
"req"
/>
</
bean
>
<!-- Velocity Configuration -->
<
bean
id
=
"velocityConfig"
class = "org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<
property
name
=
"configLocation"
value
=
"/WEB-INF/velocity.properties"
/>
<
property
name
=
"resourceLoaderPath"
value
=
"/"
/>
</
bean
>
<!-- FreeMarker ViewResolver Configuration -->
<
bean
id
=
"freeMarkerViewResolver"
class
=
"org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
>
<
property
name
=
"order"
value
=
"0"
/>
<
property
name
=
"viewClass"
value
=
"org.springframework.web.servlet.view.freemarker.FreeMarkerView"
/>
</
bean
>
<!-- FreeMarker Configuration -->
<
bean
id
=
"freemarkerConfig"
class
=
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
>
<
property
name
=
"configLocation"
value
=
"/WEB-INF/freemarker.properties"
/>
<
property
name
=
"templateLoaderPath"
value
=
"/WEB-INF/ftl/"
/>
<
property
name
=
"freemarkerVariables"
>
<
map
>
<
entry
key
=
"xml_escape"
value-ref
=
"fmXmlEscape"
/>
</
map
>
</
property
>
</
bean
>
<
bean
id
=
"fmXmlEscape"
class
=
"freemarker.template.utility.XmlEscape"
/>
|
這裏我配置成全部返回.jsp的視圖模板請求都轉到JSP視圖解析器jspViewResolver中去處理,返回.htm,.vm視圖模板請求都轉到velocity視圖解析器中去處理。jsp
三.控制器代碼示例測試
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
|
package
com.jeedev.demo.view;
import
javax.servlet.http.HttpServletRequest;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
import
org.springframework.stereotype.Controller;
import
org.springframework.ui.ModelMap;
import
org.springframework.web.bind.annotation.RequestMapping;
/**
* 多視圖解析器支持示例
* @author huligong
*
*/
@Controller
@RequestMapping
(value =
"/demo"
)
public
class
JeeDevViewResolverTestController {
private
static
Log logger = LogFactory.getLog(JeeDevViewResolverTestController.
class
);
@RequestMapping
(value =
"/test1"
)
public
String test1(HttpServletRequest request, ModelMap map) {
logger.info(
"使用JSP視圖解析器"
);
map.put(
"name"
,
"hello world"
);
return
"jspTest.jsp"
;
}
@RequestMapping
(value =
"/test2"
)
public
String test2(HttpServletRequest request, ModelMap map) {
logger.info(
"使用Freemarker視圖解析器"
);
map.put(
"name"
,
"hello world"
);
return
"hello.ftl"
;
}
@RequestMapping
(value =
"/test3"
)
public
String test3(HttpServletRequest request, ModelMap map) {
logger.info(
"使用Velocity視圖解析器"
);
map.put(
"name"
,
"hello world"
);
return
"/html/demo.htm"
;
}
}
|
四.測試請求ui
我在web.xml裏給DispatcherServlet添加了/view/*,因此,只要在請求前加上/view就能夠了。
http://localhost:8080/view/demo/test1
http://localhost:8080/view/demo/test2
http://localhost:8080/view/demo/test3
皆驗證經過。