SpringMVC实现Controller的两种方法:配置和约定
http://www.liuzk.com/197.html毕业几年来,一直在公司的WF框架上修修补补,做的大多都是业务,发现好久没接触过Spring了,当年的春天是否 涛声依旧呢??Spring的是一个优秀的框架,说其实一个框架,不如说其是一个容器,一个完美容纳百川的容器。在J2EE开发的春天里,一个基于Spring的MVC框架–Spring MVC应运而生。想当年恰逢毕业的时候,Sp
http://www.liuzk.com/197.html
毕业几年来,一直在公司的WF框架上修修补补,做的大多都是业务,发现好久没接触过Spring了,当年的春天是否 涛声依旧呢??Spring的是一个优秀的框架,说其实一个框架,不如说其是一个容器,一个完美容纳百川的容器。在J2EE开发的春天里,一个基于Spring的MVC框架–Spring MVC应运而生。想当年恰逢毕业的时候,Spring+Struts+Hibernate框架的组合相当火热,大家都争相学习。。当然本人也是其中一枚。真正到了公司,发现很多公司并没有用这三个框架,相反Spring MVC的应用到是十分广泛。其出自Spring之手,当然也是和 Spring框架最最无缝结合的一个了。
下面,闲话少说,开始写代码吧。。。。(脱离不了程序猿的命^_^)
1、开始,用eclipse建一个Web工程,或者 Maven 工程。
2、添加 必需 的jar 包
3、修改web.xml添加拦截器,把所有的请求统一交给 org.springframework.web.servlet.DispatcherServlet 来处理。
1
2
3
4
5
6
7
8
9
10
11
12
|
<servlet>
<servlet-name>
viewspace
</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>
viewspace
</servlet-name>
<url-pattern>
/
</url-pattern>
</servlet-mapping>
|
4、根据 servlet-name,还得在web.xml 的同一目录里建一个 {servlet-name}-servlet.xml 的文件(先贴上文件内容后面在解释)
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
|
<?
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
:
p
=
"http://www.springframework.org/schema/p"
xmlns
:
context
=
"http://www.springframework.org/schema/context"
xsi
:
schemaLocation
=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd"
>
<!-- 扫描web包,应用Spring的注解 -->
<context:component-scan
base-package
=
"com.corp.chimera.web"
/>
<!-- HandlerMapping -->
<bean
class
=
"org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"
/>
<!-- HandlerAdapter -->
<bean
class
=
"org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"
/>
<bean
id
=
"defaultAnnotationHandlerMapping"
class
=
"org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
/>
<bean
id
=
"annotationMethodHandlerAdapter"
class
=
"org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
/>
<!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
<!--
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/>
</bean>
-->
<bean
class
=
"org.springframework.web.servlet.view.velocity.VelocityConfigurer"
>
<property
name
=
"resourceLoaderPath"
value
=
"/views/"
/>
<property
name
=
"configLocation"
value
=
"classpath:common/velocity.properties"
/>
</bean>
<bean
class
=
"org.springframework.web.servlet.view.velocity.VelocityViewResolver"
>
<property
name
=
"viewClass"
value
=
"org.springframework.web.servlet.view.velocity.VelocityView"
/>
<property
name
=
"suffix"
value
=
".html"
/>
</bean>
<bean
name
=
"/index"
class
=
"com.corp.chimera.web.controllers.IndexController"
/>
</beans>
|
5、下面开始写代码了,首先是 Controller,作为MVC的 view层,是最直接和用户交互的,也是最外面的一层。Controller这里有两种写法,一种是基于配置的,一种是基于注解的。
首先说下基于配置的,这个好像是Spring 很早的版本之前的功能,所有的url都必须在配置文件里配置一下。配置其使用的HandlerMapping和HandlerAdapter以及,改URL对应的Controller类。
并且该Controller类必须实现(implements)org.springframework.web.servlet.mvc.Controller 并 重写 其 ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception的方法。
首先看配置文件:viewspace-servlet.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- HandlerMapping -->
<bean
class
=
"org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"
/>
<!-- HandlerAdapter -->
<bean
class
=
"org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"
/>
<bean
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<property
name
=
"viewClass"
value
=
"org.springframework.web.servlet.view.JstlView"
/>
<property
name
=
"prefix"
value
=
"/views/"
/>
<property
name
=
"suffix"
value
=
".jsp"
/>
</bean>
<bean
name
=
"/index"
class
=
"com.corp.chimera.web.controllers.IndexController"
/>
|
Controller类:IndexController.java
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
|
package
com
.
corp
.
chimera
.
web
.
controllers
;
import
javax
.
servlet
.
http
.
HttpServletRequest
;
import
javax
.
servlet
.
http
.
HttpServletResponse
;
import
org
.
springframework
.
web
.
servlet
.
ModelAndView
;
import
org
.
springframework
.
web
.
servlet
.
mvc
.
Controller
;
/**
* 基于配置的 Controller,Spring最原始的 用法
* 必须实现 org.springframework.web.servlet.mvc.Controller 并 重写 handleRequest 方法。
* 需要在 xxx-servlet.xml 里进行配置:<bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />
* 并且对于HandlerMapping 需要使用 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
* HandlerAdapter 需要配置 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
*
* @author kevin
*
*/
public
class
IndexController
implements
Controller
{
@Override
public
ModelAndView
handleRequest
(
HttpServletRequest
arg0
,
HttpServletResponse
arg1
)
throws
Exception
{
// 1、收集参数、验证参数
// 2、绑定参数到命令对象
// 3、将命令对象传入业务对象进行业务处理
// 4、选择下一个页面
ModelAndView
mv
=
new
ModelAndView
(
)
;
// 添加模型数据 可以是任意的POJO对象
mv
.
addObject
(
"message"
,
"I am liuzk"
)
;
// 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
mv
.
setViewName
(
"index"
)
;
return
mv
;
}
}
|
这样 启动tomcat 就可以 访问了。。。 其HandlerMapping映射使用的是 BeanNameUrlHandlerMapping 和 SimpleControllerHandlerAdapter 并且使用 JSTLView 作为 ViewResolver视图解析器。。
这样写的一个缺点就是:
所有的url都得需要在文件里做配置。当系统庞大页面多的时候,这种效率上以及代码可读性上都大打折扣。于是,基于注解的方法就来了。。。
基于注解的实现:
1
2
3
4
5
6
7
8
9
10
|
<
bean
id
=
"defaultAnnotationHandlerMapping"
class
=
"org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
/
>
<
bean
id
=
"annotationMethodHandlerAdapter"
class
=
"org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
/
>
<
!
--
ViewResolver
配置视图解析器,将
ModelAndView及字符串解析为具体的页面
--
>
<
bean
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<
property
name
=
"viewClass"
value
=
"org.springframework.web.servlet.view.JstlView"
/
>
<
property
name
=
"prefix"
value
=
"/views/"
/
>
<
property
name
=
"suffix"
value
=
".jsp"
/
>
<
/
bean
>
|
Controller类:ListController.java
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
|
package
com
.
corp
.
chimera
.
web
.
controllers
;
import
javax
.
servlet
.
http
.
HttpServletRequest
;
import
javax
.
servlet
.
http
.
HttpServletResponse
;
import
org
.
springframework
.
stereotype
.
Controller
;
import
org
.
springframework
.
web
.
bind
.
annotation
.
RequestMapping
;
import
org
.
springframework
.
web
.
servlet
.
ModelAndView
;
/**
* 基于注解的 Controller
* 和 基于配置的Controller 不同的是,靠注解就可以实现所有Url,相比之下,基于注解的Controller 更方便,灵活
* 无需实现 和 继承任何类,只需要 @Controller 既可以标记该类位Controller
* @RequestMapping 注解 实现对于url的 path 进行注册
*
* 但是使用前仍然需要配置 Spring 的配置文件:
* HandlerMapping 使用的是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
* HandlerAdapter 需要指定 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
*
* @author kevin
*
*/
@Controller
@RequestMapping
(
value
=
"/list"
)
public
class
ListController
{
@RequestMapping
(
value
=
"/index"
)
public
ModelAndView
listIndex
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
Exception
{
// 1、收集参数、验证参数
// 2、绑定参数到命令对象
// 3、将命令对象传入业务对象进行业务处理
// 4、选择下一个页面
ModelAndView
mv
=
new
ModelAndView
(
)
;
// 添加模型数据 可以是任意的POJO对象
mv
.
addObject
(
"message"
,
"This is a Spring Constraint with annotation.<br/> @Controller <br/>@RequestMapping"
)
;
// 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
mv
.
setViewName
(
"list"
)
;
return
mv
;
}
}
|
看上面方式:一个@Controller 一个 @RequestMapping 两个注解解决了所有的配置,但是 前提呢,是 在配置文件里配置 使用 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 作为 url映射控制器。
当然以上这两种方式在一个系统里也是可以一块是用的,具体 看你心情咯。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
文章到此还没结束吗,真的还没结束。。
细心的童鞋发现了,我在viewspace-servlet.xml配置的图形解析器,并不是 JstlView而是换成 VelocityView 。。这是因为本人用了好几年Velocity了,不太习惯原声的Jstl。。虽然语法上相当无几,所以还是研究了下,把他改成了VelocityView。
下面共享下方法:其实很简单,就是更换了配置信息,ViewResolver 使用 org.springframework.web.servlet.view.velocity.VelocityConfigurer ,并且 viewClass 使用 org.springframework.web.servlet.view.velocity.VelocityView,,在此之前,还得加个配置文件 velocity.properties 放在了 classpath:common/velocity.properties 目录下。
详细代码如下:
velocity.properties文件:
1
2
3
4
5
6
7
8
9
|
#
encoding
input
.
encoding
=
UTF
-
8
output
.
encoding
=
UTF
-
8
contentType
=
text
/
html
;
charset
=
UTF
-
8
#
autoreload
when
vm
changed
file
.
resource
.
loader
.
cache
=
false
file
.
resource
.
loader
.
modificationCheckInterval
=
1
velocimacro
.
library
.
autoreload
=
false
|
viewspace-servlet.xml文件:
1
2
3
4
5
6
7
8
9
10
11
|
<bean
class
=
"org.springframework.web.servlet.view.velocity.VelocityConfigurer"
>
<property
name
=
"resourceLoaderPath"
value
=
"/views/"
/>
<property
name
=
"configLocation"
value
=
"classpath:common/velocity.properties"
/>
</bean>
<bean
class
=
"org.springframework.web.servlet.view.velocity.VelocityViewResolver"
>
<property
name
=
"viewClass"
value
=
"org.springframework.web.servlet.view.velocity.VelocityView"
/>
<property
name
=
"suffix"
value
=
".html"
/>
</bean>
|
好的,。到此结束了,这次真的结束了。
更多推荐
- 5953
- 0
- 0
- 0
扫一扫分享内容
- 分享
顶部
所有评论(0)