随笔 - 0, 文章 - 11, 评论 - 0, 引用 - 0
数据加载中……

徒手搭建 SpringMVC XML AND Annotation 版

准备环境:(此例所有Spring版本:spring-framework-3.2.6)
1、将spring-framework-3.2.6中的lib全部导入工程
2、将Apache的Common-logging 导入工程
3、将JSTL标签库包导入工程(可选,这里只是为了方便读数据而已)

如下图所示:


Spring MVC XML 配置:

1、在 Web.xml 中 配置启动SpringMVC的Servlet映射。
 1 <!-- Spring MVC DispatcherServlet Init -->
 2     <servlet>
 3         <servlet-name>springMVC</servlet-name>
 4         <servlet-class>
 5             org.springframework.web.servlet.DispatcherServlet
 6         </servlet-class>
 7         <init-param>
 8             <param-name>contextConfigLocation</param-name>
 9             <param-value>
10                 /WEB-INF/ApplicationContext-Controller.xml  <!-- SpringMVC的配置文件,文件名自定义 -->
11             </param-value>
12         </init-param>
13         <load-on-startup>1</load-on-startup>
14     </servlet>
15     <servlet-mapping>
16         <servlet-name>springMVC</servlet-name>
17         <url-pattern>/</url-pattern>
18     </servlet-mapping>

2、在/WEB-INF/ 中创建 ApplicationContext-Controller.xml , 配置文件放在 /WEB-INF/下是约定俗成的。
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9
10 </beans>

3、在src下创建 Contorllor 类 (Action)实现 Controller 接口 。向ModelAndView的构造传入页面名称完成 转发 操作
 1 package com.spring.mvc.web;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 import org.springframework.web.servlet.ModelAndView;
 6 import org.springframework.web.servlet.mvc.Controller;
 7 
 8 public class UserController implements Controller{
 9 
10     public ModelAndView handleRequest(HttpServletRequest req,
11             HttpServletResponse res) throws Exception {
12         System.out.println("HelloWorld");
13         return new ModelAndView("index.jsp");
14     }
15 }



4、在 ApplicationContext-Controller.xml 中注册 UserController 类
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <bean id="/user" class="com.spring.mvc.web.UserController"></bean>
11 
12 </beans>

HelloWorld完成,运行效果如下图:
-----------------------------------------------------------------------------------

接着对优化,SpringMVC 提供配置 ViewResolver 用来管理视图层
下面在 ApplicationContext-Controller.xml 配置 ViewResolver 对页面转发的控制

首先在目录结构/WEB-INF/jsp/中 添加 user.jsp 页面,用于转发页面,页面内容随便。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <bean id="/user" class="com.spring.mvc.web.UserController"></bean>
11 
12     <!-- 页面View层基本信息设定 -->
13     <bean id="viewResolver"
14         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
15         <property name="prefix" value="/WEB-INF/jsp" /> <!-- 前缀 -->
16         <property name="suffix" value=".jsp" />              <!-- 后缀 -->
17     </bean>
18 </beans>

对应更改 com.spring.mvc.web.UserController :
 1 package com.spring.mvc.web;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 import org.springframework.web.servlet.ModelAndView;
 6 import org.springframework.web.servlet.mvc.Controller;
 7 
 8 public class UserController implements Controller{
 9     // 因为配置了 ViewResolver  所以转发会自动加上 前缀 + user + 后缀 既: /WEB-INF/jsp/user.jsp
10     public ModelAndView handleRequest(HttpServletRequest req,
11             HttpServletResponse res) throws Exception {
12         return new ModelAndView("user"); 
13     }
14 }

看运行效果:

接下来把 URL 请求的控制 也交给Spring处理:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <!-- 这前 id='/user',现在给bean起个别名,交给Spring的urlMapping来管理此ControllerAction -->
11     <bean id="userController" class="com.spring.mvc.web.UserController"></bean>
12 
13     <!-- 页面View层基本信息设定 -->
14     <bean id="viewResolver"
15         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
16         <property name="prefix" value="/WEB-INF/jsp/" />
17         <property name="suffix" value=".jsp" />
18     </bean>
19     
20     <!-- servlet映射列表,所有控制层Controller的servlet在这里定义 -->
21     <bean id="urlMapping"
22         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
23         <property name="mappings">
24             <props>
25                 <!-- key 就是访问路径, userController 就是 ControllerAction 类的别名-->
26                 <prop key="/user">userController</prop>
27             </props>
28         </property>
29     </bean>
30 </beans>

配置到此,访问效果与前面没有区别,只是把URL交给Spring的UrlMapping管理,并介绍userController给UrlMapping认识。

很多时候,ControllerAction 需要处理不同的方法,显然一个Controller处理一种逻辑不太现实,Spring提供了解决此类问题的配置:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <bean id="userController" class="com.spring.mvc.web.UserController">
11         <!-- Controller Bean 配置property的methodNameResolver属性 -->
12         <!-- ref bean 中就是把 同一个Controller多个方法的解析器 注入给 Controller-->
13         <property name="methodNameResolver">
14             <ref bean="paraMethodResolver"/>
15         </property>
16     </bean>
17 
18     <bean id="viewResolver"
19         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
20         <property name="prefix" value="/WEB-INF/jsp/" />
21         <property name="suffix" value=".jsp" />
22     </bean>
23     
24     <bean id="urlMapping"
25         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
26         <property name="mappings">
27             <props>
28                 <prop key="/user">userController</prop>
29             </props>
30         </property>
31     </bean>
32     
33     <!-- Controller方法调用规则定义 -->
34     <bean id="paraMethodResolver"
35         class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
36         <!-- value="method" 的作用好比 http://localhost/SpringMVC/user?method=add -->
37         <property name="paramName" value="method" />
38     </bean>
39 </beans>

更改Controller类
 1 package com.spring.mvc.web;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 import org.springframework.web.servlet.ModelAndView;
 6 import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
 7 
 8 // extends MultiActionController 类
 9 public class UserController extends MultiActionController {
10 
11     public ModelAndView add(HttpServletRequest req,
12             HttpServletResponse res) throws Exception {
13         return new ModelAndView("user");
14     }
15     
16     // 返回类型可以是 ModelAndView , String , List , Map , Set , ModelMap , Object , viod 等等
17     public String list(HttpServletRequest req,
18             HttpServletResponse res) throws Exception {
19         return "user";
20     }
21 }

效果如下图:



SpringMVC Annotation 配置:


前面 SpringMVC XML 的配置方法,只保留 ViewResolver的配置,其他全部不用;Spring提供的Annotation的两处配置即可代替大部分配置代码:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
11     <context:component-scan base-package="com.spring.mvc.web"/>
12     <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
13     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
14     
15     <bean id="viewResolver"
16         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
17         <property name="prefix" value="/WEB-INF/jsp/" />
18         <property name="suffix" value=".jsp" />
19     </bean>
20     
21     <!-- SpringMVC XML 的配置方法,只保留 ViewResolver 的配置,其他全部不用-->
22     <!-- <bean id="userController" class="com.spring.mvc.web.UserController">
23         <property name="methodNameResolver">
24             <ref bean="paraMethodResolver"/>
25         </property>
26     </bean>
27     <bean id="urlMapping"
28         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
29         <property name="mappings">
30             <props>
31                 <prop key="/user">userController</prop>
32             </props>
33         </property>
34     </bean>
35     <bean id="paraMethodResolver"
36         class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
37         <property name="paramName" value="method" />
38     </bean> -->
39 </beans>

Annotation Controller 类的实现:
 1 package com.spring.mvc.web;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 import org.springframework.stereotype.Controller;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.servlet.ModelAndView;
 9 
10 /*
11  * @Controller 声明此类为Controller类交给Spring管理
12  * @RequestMapping 请求路径
13  */
14 @Controller
15 @RequestMapping("/user")
16 public class UserController {
17 
18     /*
19      * @RequestMapping(params="method=add")
20      * 此方法的对应访问方式 
21      * http://localhost:8080/SpringMVC/user?method=add
22      */
23     @RequestMapping(params="method=add")
24     public ModelAndView add(HttpServletRequest req,
25             HttpServletResponse res) throws Exception {
26         return new ModelAndView("user");
27     }
28     
29     @RequestMapping(params="method=list")
30     public String list(String uName , HttpServletRequest req,
31             HttpServletResponse res) throws Exception {
32     /*     默认为转发,重定向:返回这个串:"redirect:http://www.google.com.hk/"
33
      * 1、Controller 就是从HttpServlet 继承而来,所以可以把它当Servlet用
34      * 2、需要什么对象,直接在方法的参数中写,uName是前台传过来的。
35      * 3、ModelAndView 底层的View是Object Model是Map,默认放在Request中可通过el表达式拿值
36      */
37         req.getSession() ;
38         return "user";
39     }
40 }

效果如下图:

添加 Spring 3.0 的 新 Annotation 注解:
1:XML 文件的 schema 更新添加 mvc 标签 ,标红”
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:mvc="http://www.springframework.org/schema/mvc"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans
 7          http://www.springframework.org/schema/beans/spring-beans.xsd
 8          http://www.springframework.org/schema/mvc 
 9          http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
10          http://www.springframework.org/schema/context
11          http://www.springframework.org/schema/context/spring-context.xsd">
12 
13     <!-- 支持spring3.0新的mvc注解 -->
14     <mvc:annotation-driven />
15     
16     <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
17     <context:component-scan base-package="com.spring.mvc.web" />
18     
19     <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
20     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
21 
22     <bean id="viewResolver"
23         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
24         <property name="prefix" value="/WEB-INF/jsp/" />
25         <property name="suffix" value=".jsp" />
26     </bean>
27 </beans>

配置Spring Interceptor 拦截器:
添加自定义拦截器类:com.spring.mvc.interceptors.RuleInterceptor
 1 package com.spring.mvc.interceptors;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 import org.springframework.web.servlet.HandlerInterceptor;
 6 import org.springframework.web.servlet.ModelAndView;
 7 
 8 public class RuleInterceptor implements HandlerInterceptor {
 9 
10     public void afterCompletion(HttpServletRequest request,    HttpServletResponse response, Object handler, Exception ex)    throws Exception {
11         System.out.println("最后执行!!!一般用于释放资源!!");
12         
13     }
14 
15     public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,    ModelAndView modelAndView) throws Exception {
16         System.out.println("Action执行之后,生成视图之前执行!!");
17     }
18 
19     public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
20         System.out.println("action之前执行!!!");
21         return true;  //继续执行action
22     }
23 }

配置文件注册:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:mvc="http://www.springframework.org/schema/mvc"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans
 7          http://www.springframework.org/schema/beans/spring-beans.xsd
 8          http://www.springframework.org/schema/mvc 
 9          http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
10          http://www.springframework.org/schema/context
11          http://www.springframework.org/schema/context/spring-context.xsd">
12 
13     <mvc:interceptors>
14         <bean class="com.spring.mvc.interceptors.RuleInterceptor"></bean> <!-- 拦截所有springmvc的url! -->
15         <mvc:interceptor>
16             <mvc:mapping path="/user" />
17             <!--<mvc:mapping path="/test/*" />-->
18             <bean class="com.spring.mvc.interceptors.RuleInterceptor"></bean>
19         </mvc:interceptor>
20     </mvc:interceptors>
21 
22     <!-- 支持spring3.0新的mvc注解 -->
23     <mvc:annotation-driven />
24     
25     <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
26     <context:component-scan base-package="com.spring.mvc.web" />
27     
28     <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
29     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
30 
31     <bean id="viewResolver"
32         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
33         <property name="prefix" value="/WEB-INF/jsp/" />
34         <property name="suffix" value=".jsp" />
35     </bean>
36 </beans>

posted on 2014-05-12 12:29 00001000 阅读(592) 评论(0)  编辑  收藏 所属分类: SpringMVC3/Spring3/MyBatis3