代码环境(Tomcat5.5,Eclipse3.2,MyEclipse5.2GA)
Spring1.2
不多说,看实例:
这个是我写完后的代码结构:注意Spring的配置文件springServlet-servlet.xml是不能改的。
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<!
DOCTYPE beans PUBLIC
"
-//SPRING//DTD BEAN//EN
"
"
http://www.springframework.org/dtd/spring-beans.dtd
"
>
<
beans
>
<
bean id
=
"
myHandlerInterceptor
"
class
=
"
com.web.handlerMapping.MyHandlerInterceptor
"
/>
<
bean id
=
"
publicUrlMapping
"
class
=
"
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
"
>
<
property name
=
"
interceptors
"
>
<
list
>
<
ref local
=
"
myHandlerInterceptor
"
/>
</
list
>
</
property
>
<
property name
=
"
mappings
"
>
<
props
>
<
prop key
=
"
/index.do
"
>
indexController
</
prop
>
<
prop key
=
"
/controller/common.do
"
>
commonController
</
prop
>
<
prop key
=
"
/controller/view.do
"
>
multiController
</
prop
>
<
prop key
=
"
/param.do
"
>
parameterController
</
prop
>
<
prop key
=
"
/controller/p*.do
"
>
propertiesController
</
prop
>
<!--
注意:前面加文件夹是限制从哪里发出的请求,如我这个是捕获从
/
controller发出的common.do请求
-->
</
props
>
</
property
>
</
bean
>
<
bean id
=
"
indexController
"
class
=
"
com.web.controller.IndexController
"
/>
<
bean id
=
"
commonController
"
class
=
"
com.web.controller.CommonController
"
/>
<
bean id
=
"
multiController
"
class
=
"
com.web.controller.DefaultMultiActionController
"
/>
<
bean id
=
"
parameterController
"
class
=
"
com.web.controller.ParameterMethodController
"
>
<
property name
=
"
methodNameResolver
"
>
<
ref local
=
"
parameterMethodNameResolver
"
/>
</
property
>
</
bean
>
<
bean id
=
"
propertiesController
"
class
=
"
com.web.controller.PropertiesMethodController
"
>
<
property name
=
"
methodNameResolver
"
>
<
ref local
=
"
propertiesMethodNameResolver
"
/>
</
property
>
</
bean
>
<
bean id
=
"
parameterMethodNameResolver
"
class
=
"
org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver
"
>
<
property name
=
"
paramName
"
>
<
value
>
method
</
value
>
</
property
>
<
property name
=
"
defaultMethodName
"
>
<
value
>
paramMethod
</
value
>
</
property
>
</
bean
>
<
bean id
=
"
propertiesMethodNameResolver
"
class
=
"
org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver
"
>
<
property name
=
"
mappings
"
>
<
props
>
<
prop key
=
"
/controller/proper.do
"
>
proper
</
prop
>
<
prop key
=
"
/controller/p*.do
"
>
pro
</
prop
>
</
props
>
</
property
>
</
bean
>
</
beans
>
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<
web
-
app version
=
"
2.4
"
xmlns
=
"
http://java.sun.com/xml/ns/j2ee
"
xmlns:xsi
=
"
http://www.w3.org/2001/XMLSchema-instance
"
xsi:schemaLocation
=
"
http://java.sun.com/xml/ns/j2ee
http:
//
java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<
servlet
>
<
servlet
-
name
>
springServlet
</
servlet
-
name
>
<
servlet
-
class
>
org.springframework.web.servlet.DispatcherServlet
</
servlet
-
class
>
<
load
-
on
-
startup
>
1
</
load
-
on
-
startup
>
</
servlet
>
<
servlet
-
mapping
>
<
servlet
-
name
>
springServlet
</
servlet
-
name
>
<
url
-
pattern
>*
.
do
</
url
-
pattern
>
</
servlet
-
mapping
>
</
web
-
app
>
package
com.web.handlerMapping;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public
class
MyHandlerInterceptor
extends
HandlerInterceptorAdapter
{ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView view) throws Exception { // TODO 自动生成方法存根 super .postHandle(request, response, object, view); } }
/* 这个就是拦截器了,他负责拦截servlet的请求,我这里是直接继承的HandlerInterceptor接口的实现类(他提供了接口中所有默认的实现方法), 注意拦截器一定要和URL映射(HandlerMapping)配合使用,URL映射有两种BeanNameUrlHandlerMapping和SimplerUrlHandlerMapping,第一种 是根据Bean的名字来映射,如:我这个例子URL是/index.do,那么处理该请求的控制器的id也应该是/index.do,这种只适合小型的应用。我一般使 用的是SimpleUrlHandlerMapping,他就允许用全名和通配符指定请求,并指定用哪个控制器来处理。 */
1.直接继承Controller
package
com.web.controller;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.Controller;
public
class
IndexController
implements
Controller
{ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { response.getWriter().print( " IndexController!!! " ); return null ; } }
//
这个控制器只能处理简单的请求,我们一般是用另一个Controller接口的实现类AbstractController控制器
2.继承AbstractController类
package
com.web.controller;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.AbstractController;
public
class
CommonController
extends
AbstractController
{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { setCacheSeconds( 10 ); System.out.println( " aaaaaaaaaa " ); response.getWriter().print( " CommonController!! " + System.currentTimeMillis()); // 要看到浏览器10秒后 才加载的效果需要禁用客户端浏览器缓存 return null ; } }
/* 他继承自WebContentGenerator→WebApplicationObjectSupport并实现了ApplicationContextAware接口→ApplicationObjectSupport 换句话说你的控制器继承它的话将允许你访问ServletContext,WebApplicationContext,ApplicationContext,Log,MessageSourceAccessor 不用说他强得多! */
3.默认的MultiActionController类的实现
package
com.web.controller;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public
class
DefaultMultiActionController
extends
MultiActionController
{ public ModelAndView view(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println( " aaaaaaaaaa " ); response.getWriter().println( " DefaultMultiActionController view() " + request.getParameter( " number " )); return null ; } }
/* 注意:AbstractController的另外两个属性:delegate和methodNameResolver,为MultiActionController 指明了每次请求调用哪个方法。如果delegate属性保持为默认值null,那么会在MultiActionController 的子类型中寻找该方法(即在methodNameResolver属性中定义的方法)并调用。如果不是null,那么该方法 将被代理的对象调用。 我们这个例子是直接实现了MultiActionController类,它的默认实现子类是InternalPathMethodNameResolver ,他依赖与请求的URL,所以他的请求的名字(注意:方法名不包括扩展名)即为要调用的方法名. 而delegate为空的情况下会直接由我们这个类来实现请求的方法/controller/view.do,,所以我们这里即view为请求的方法,他会被调用。如果请求的方法名而在实现的控制 器类中没有实现的话,会报错的,如:我们这里如果请求/controller/mutile.do的话就会报找不到请求源 的错。 MultiActionController他还有两种实现类:ParameterMethodNameResolver和PropertiesMethodNameResolver 在后面两个例子里实现了 */
4.注入ParameterMethodNameResolver类的实现
package
com.web.controller;
import
java.io.IOException;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import
org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver;
public
class
ParameterMethodController
extends
MultiActionController
{ public ModelAndView view(HttpServletRequest request,HttpServletResponse response) throws Exception { response.setCharacterEncoding( " GBK " ); response.getWriter().print( this .getClass().getName() + " view() 参数值: " + request.getParameter( " number " )); return null ; } }
/* 注意:这个控制器继承的这个MultiActionController类是由ParameterMethodNameResolver实现的(见配 置文件,我们是通过把ParameterMethodNameResolver注入这个控制器来实现的). parameterMethodNameResolver类的属性defaultMethodName可以设置他的默认的(默认是Action)方法名, 而paramName属性是指定一个参数,如果请求没有给这个参数指定一个方法名或者指定的这个方法没有实现 的话,就会去找默认的defaultMethodName的方法名(参考配置文件)。 */
5.注入PropertiesMethodNameResolver类的实现
package
com.web.controller;
import
java.io.IOException;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public
class
PropertiesMethodController
extends
MultiActionController
{ public ModelAndView proper(HttpServletRequest request,HttpServletResponse response) throws Exception { response.getWriter().print( this .getClass().getName() + " proper() " ); return null ; } public ModelAndView pro(HttpServletRequest request,HttpServletResponse response) throws Exception { response.getWriter().print( this .getClass().getName() + " pro() " ); return null ; } }
/* 注意:这个控制器继承的这个MultiActionController类是由PropertiesMethodNameResolver类实现的(见配 置文件,我们是通过把PropertiesMethodNameResolver注入这个控制器来实现的). PropertiesMethodNameResolver类主要是通过配置mappings属性来实现的,看到mappings你应该想到肯定是个集合 类型,这里的要请求的方法名都是String类型,所以我们在配置文件里用的是<props></props>标记,这对标记里 就是设置请求的URL要调用的方法的名字,这个类的实现也要依赖于URL,但是他最大的好处是可以使用同配符(见 配置文件你就明白了),我们在这个类里定义了两个方法,分别被不同的请求调用了。 学到这里我们已经实现了Spring的5种主要的控制器,不难发现Spring的强大,不过每类控制器他的具体该使用在 实际应用的哪些地方还要靠我们的实践积累,总之他提供了比Struts更强的控制功能! */
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>
<
html
>
<
head
>
<
title
>
index.html
</
title
>
<
meta
http-equiv
="keywords"
content
="keyword1,keyword2,keyword3"
>
<
meta
http-equiv
="description"
content
="this is my page"
>
<
meta
http-equiv
="content-type"
content
="text/html; charset=GB18030"
>
<!--
<link rel="stylesheet" type="text/css" href="./styles.css">
-->
</
head
>
<
body
>
This is my HTML page.
<
br
>
</
body
>
<
a
href
="index.do"
>
index
</
a
><
br
>
<
a
href
="param.do?method=view&number=100"
>
param
</
a
>
</
html
>
这是controller下的index.html
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>
<
html
>
<
head
>
<
title
>
index.html
</
title
>
<
meta
http-equiv
="keywords"
content
="keyword1,keyword2,keyword3"
>
<
meta
http-equiv
="description"
content
="this is my page"
>
<
meta
http-equiv
="content-type"
content
="text/html; charset=GB18030"
>
<!--
<link rel="stylesheet" type="text/css" href="./styles.css">
-->
</
head
>
<
body
>
This is my HTML page.
<
br
>
</
body
>
<
a
href
="common.do"
>
bbbb
</
a
><
br
>
<
a
href
="view.do?number=10"
>
multi
</
a
><
br
>
<
a
href
="proper.do"
>
proper
</
a
>
</
html
>