Spring MVC3.0.5搭建全程

 一个简单的搭建Spring MVC3.0的流程(以Spring3.0.5为列),数据库交互使用spring JDBC Template,附件有项目(没有jar包)。整个项目架构如下图所示:


1、去官网下载3.0.5所有jar包,所需jar包,见附件图片,每个jar包得用处如下:

org.springframework.aop- 3.0.0.RELEASE--------------------Spring的面向切面编程,提供AOP(面向切面编程)实现

org.springframework.asm- 3.0.0.RELEASE--------------------Spring独立的asm程序,相遇Spring2.5.6的时候需要asmJar  包.3.0开始提供他自己独立的asmJar

org.springframework.aspects- 3.0.0.RELEASE----------------Spring提供对AspectJ框架的整合\

org.springframework.beans- 3.0.0.RELEASE------------------SpringIoC(依赖注入)的基础实现

org.springframework.context.support- 3.0.0.RELEASE--------Spring-context的扩展支持,用于MVC方面

org.springframework.context- 3.0.0.RELEASE----------------Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业 级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等

扫描二维码关注公众号,回复: 685773 查看本文章

org.springframework.core- 3.0.0.RELEASE-------------------Spring3.0的核心工具包

org.springframework.expression- 3.0.0.RELEASE-------------Spring表达式语言

org.springframework.instrument.tomcat- 3.0.0.RELEASE------Spring3.0对Tomcat的连接池的集成

org.springframework.instrument- 3.0.0.RELEASE-------------Spring3.0对服务器的代理接口

org.springframework.jdbc- 3.0.0.RELEASE-------------------对JDBC的简单封装

org.springframework.jms- 3.0.0.RELEASE--------------------为简化JMS API的使用而作的简单封装

org.springframework.orm- 3.0.0.RELEASE--------------------整合第三方的ORM框架,如hibernate,ibatis,jdo,以及 spring的JPA实现

org.springframework.oxm-3.0.0.RELEASE--------------------Spring 对Object/XMl的映射支持,可以让Java与XML之间来回切

org.springframework.test- 3.0.0.RELEASE--------------------对Junit等测试框架的简单封装

org.springframework.transaction- 3.0.0.RELEASE-------------为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程 式事务管理

org.springframework.web.portlet- 3.0.0.RELEASE-------------SpringMVC的增强

org.springframework.web.servlet- 3.0.0.RELEASE-------------对JEE6.0 Servlet3.0的支持

org.springframework.web.struts- 3.0.0.RELEASE--------------整合Struts的时候的支持

org.springframework.web- 3.0.0.RELEASE--------------------SpringWeb下的工具包



 

2、借鉴spring官网写法,建立一个src-resources Source Folder,再新建目录META-INF,存放springmvc-servlet.xml和jdbc-context.xml文件(事务和数据库连接池的管理);以及database.properties和log4j.properties。


JDBC-context.xml文件:

 

Xml代码     收藏代码
  1. < span   style = "font-size: x-small;" > <? 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:aop = "http://www.springframework.org/schema/aop"     
  5.     xmlns:tx = "http://www.springframework.org/schema/tx"     
  6.     xmlns:context = "http://www.springframework.org/schema/context"     
  7.     xsi:schemaLocation ="     
  8.           http://www.springframework.org/schema/beans     
  9.           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  10.           http://www.springframework.org/schema/tx     
  11.           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd    
  12.           http://www.springframework.org/schema/context     
  13.           http://www.springframework.org/schema/context/spring-context-3.0.xsd     
  14.           http://www.springframework.org/schema/aop     
  15.           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-autowire = "byName" >   
  16.   
  17.      < context:property-placeholder   location = "classpath:database.properties" />   
  18.        
  19.      < bean   id = "dataSource"   class = "com.mchange.v2.c3p0.ComboPooledDataSource"   destroy-method = "close" >   
  20.         < property   name = "driverClass"   value = "${mysql.driverclass}" > </ property >   
  21.         < property   name = "jdbcUrl"   value = "${mysql.jdbcurl}" > </ property >   
  22.         < property   name = "user"   value = "${mysql.user}" > </ property >   
  23.         < property   name = "password"   value = "${mysql.password}" > </ property >   
  24.         < property   name = "acquireIncrement"   value = "5" > </ property >    <!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 -->   
  25.         < property   name = "initialPoolSize"   value = "10" > </ property >    <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 -->   
  26.         < property   name = "minPoolSize"   value = "5" > </ property >   
  27.         < property   name = "maxPoolSize"   value = "20" > </ property >   
  28.         <!-- 最大空闲时间,超过空闲时间的连接将被丢弃  
  29.         [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout = 30 (单位秒)设置连接超时】,这里设置c3p0的超时必须 < 28800 ]   
  30.         -->   
  31.         < property   name = "maxIdleTime"   value = "300" > </ property >     
  32.         < property   name = "idleConnectionTestPeriod"   value = "60" > </ property >   <!-- 每60秒检查连接池中的空闲连接 -->   
  33.         < property   name = "maxStatements"   value = "20" > </ property >    <!-- jdbc的标准参数  用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 -->   
  34.      </ bean >   
  35.        
  36.      < bean   id = "txManager"   class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >   
  37.         < property   name = "dataSource"   ref = "dataSource" > </ property >   
  38.      </ bean >   
  39.        
  40.      <!-- 声明式事务管理 -->   
  41.      < aop:config >   
  42.         < aop:advisor   pointcut = "execution(* com.aokunsang.service.impl.*ServiceImpl.*(..))"   advice-ref = "myAdvice" />   
  43.      </ aop:config >   
  44.      < tx:advice   id = "myAdvice"   transaction-manager = "txManager" >   
  45.         < tx:attributes >   
  46.             < tx:method   name = "add*"   propagation = "REQUIRED" />   
  47.             < tx:method   name = "update*"   propagation = "REQUIRED" />   
  48.             < tx:method   name = "*"   read-only = "true"   rollback-for = "com.aokunsang.util.DaoException" />   
  49.         </ tx:attributes >   
  50.      </ tx:advice >   
  51.        
  52.      <!-- 自动扫描组件,需要把controller去掉,否则影响事务管理 -->   
  53.      < context:component-scan   base-package = "com.aokunsang" >   
  54.         < context:exclude-filter   type = "regex"   expression = "com.aokunsang.web.*" />   
  55.      </ context:component-scan >   
  56.        
  57. </ beans > </ span >   

 springmvc-servlet.xml文件:

 

Xml代码     收藏代码
  1. < span   style = "font-size: xx-small;" > <? 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"   xmlns:p = "http://www.springframework.org/schema/p"     
  4.     xmlns:context = "http://www.springframework.org/schema/context"     
  5.     xmlns:mvc = "http://www.springframework.org/schema/mvc"     
  6.     xsi:schemaLocation ="     
  7.            http://www.springframework.org/schema/beans     
  8.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  9.            http://www.springframework.org/schema/context     
  10.            http://www.springframework.org/schema/context/spring-context-3.0.xsd    
  11.            http://www.springframework.org/schema/mvc     
  12.            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">   
  13.       
  14.     <!-- 启动扫描所有的controller -->   
  15.     < context:component-scan   base-package = "com.aokunsang.web" />   
  16.       
  17.     <!--  主要作用于@Controller,激活该模式  
  18.           
  19.         下面是一种简写形式,完全可以手动配置替代这种简写形式;  
  20.          它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,  
  21.            是spring MVC为@Controllers分发请求所必须的  
  22.      -->   
  23.     < mvc:annotation-driven />   
  24.       
  25.     <!-- 这里拦截器还有一种配置方法【针对路径进行配置】 推荐使用这个,方便直观-->   
  26.     < mvc:interceptors >   
  27.         < mvc:interceptor >   
  28.             < mvc:mapping   path = "/user/MyHome" />   
  29.             < mvc:mapping   path = "/usermanager/*" />   
  30.             < bean    class = "com.aokunsang.web.interceptor.MyInterceptor" > </ bean >   
  31.         </ mvc:interceptor >   
  32.     </ mvc:interceptors >   
  33.       
  34.      <!-- 全局配置   
  35.     < mvc:interceptors >   
  36.         < bean   class = "com.aokunsang.web.interceptor.MyInterceptor" > </ bean >   
  37.     </ mvc:interceptors >   
  38.     -->   
  39.     <!-- 配置js,css等静态文件直接映射到对应的文件夹,不被DispatcherServlet处理   
  40.     mapping --- WebRoot里面的静态文件位置目录  
  41.     location --- 访问地址   
  42.     -->   
  43.     < mvc:resources   location = "/resources/**"   mapping = "/WEB-INF/resources/" />   
  44.   
  45.     <!--  
  46.        配置/WEB-INF/views/目录里面的jsp文件不被DispatcherServlet处理,可以直接通过浏览器访问。  
  47.        view-name --- /WEB-INF/views/里面的jsp文件名(不许后缀即可)  
  48.        path ---  访问地址  
  49.     -->    
  50.     < mvc:view-controller   path = "/header"   view-name = "header" />   
  51.   
  52.     <!-- jsp页面解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在/WEB-INF/views/目录下,查找XXX.jsp文件-->   
  53.     < bean   class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >   
  54.         < property   name = "prefix"   value = "/WEB-INF/views/" > </ property >   
  55.         < property   name = "suffix"   value = ".jsp" > </ property >   
  56.     </ bean >   
  57.       
  58. </ beans > </ span >   

 3、修改web.xml文件如下:

Xml代码     收藏代码
  1. <!-- Log4j的配置(在同一容器中部署多个应用时,  
  2.     不能使用默认的webAppRootKey,必须指定唯一KEY,以免冲突)   
  3. -->     
  4. < context-param >   
  5.     < param-name > webAppRootKey </ param-name >   
  6.     < param-value > springmvc.root </ param-value >   
  7. </ context-param >   
  8.   
  9. < context-param >   
  10.     < param-name > contextConfigLocation </ param-name >   
  11.     < param-value > classpath:/META-INF/jdbc-context.xml </ param-value >   
  12.   </ context-param >     
  13.     
  14.   < listener >   
  15.     < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >   
  16.   </ listener >   
  17.   
  18.   < servlet >   
  19.     < servlet-name > spring-mvc </ servlet-name >   
  20.     < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >   
  21.     < init-param >   
  22.         < param-name > contextConfigLocation </ param-name >   
  23.         < param-value > classpath:/META-INF/springmvc-servlet.xml </ param-value >   
  24.     </ init-param >   
  25.     < load-on-startup > 1 </ load-on-startup >   
  26.   </ servlet >   
  27.     
  28.   < servlet-mapping >   
  29.     < servlet-name > spring-mvc </ servlet-name >   
  30.     < url-pattern > / </ url-pattern >   
  31.   </ servlet-mapping >   
  32.     
  33.   < filter >   
  34.     < filter-name > encodingFilter </ filter-name >   
  35.     < filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class >   
  36.   </ filter >   
  37.     
  38.   < filter-mapping >   
  39.     < filter-name > encodingFilter </ filter-name >   
  40.     < url-pattern > /* </ url-pattern >   
  41.   </ filter-mapping >   
 

 4、从springmvc-servlet.xml中可以知道,我把jsp页面放在WEB-INF/views目录中,静态文件(图片,js,css等)放在Resources目录中,便于管理。

 

5、以上配置文件基本完成,下面开始代码编写:

首先说几个常用的注解:

 

Java代码     收藏代码
  1. @Autowired @Qualifier   自动注入[根据类型注入]  
  2.   @Autowired  可以对成员变量、方法以及构造函数进行注释,  
  3.   @Qualifier  的标注对象是成员变量、方法入参、构造函数入参。  
  4.   ps:两者结合使用相当于@Resourcede 效果。  
  5. @Resource    自动注入[根据名称注入],可写参数name= ""   
  6. @Controller  表示控制器  
  7. @Service     表示业务处理层[一般在serviceImpl]  
  8. @Repository  表示持久层[一般在daoImpl]  
  9. @Component   当你的类不清楚是哪一层的时候使用该注解  
  10. @ResponseBody   异步返回数据类型为json  
  11. @RequestMapping   路径,请求类型等设置  
  12. @InitBinder    数据绑定  
 

 注解的详细介绍:http://blog.csdn.net/zhongxiucheng/article/details/6662300  

 也可以参考: https://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/

 

<a>首先写一个BaseController,可做一些数据绑定之类的全局操作(如:把日期字符串转换为Date日期)。

 

Java代码     收藏代码
  1. @Controller   
  2. public   class  BaseController {  
  3.   
  4.     @InitBinder   
  5.     protected   void  ininBinder(WebDataBinder binder){  
  6.         SimpleDateFormat sdf = new  SimpleDateFormat( "yyyy-MM-dd" );  
  7.         binder.registerCustomEditor(Date.class new  CustomDateEditor(sdf, true ));  
  8.     }  
  9. }  
 

<b>然后写一个拦截器,拦截器有两种实现方式,1、继承HandlerInterceptorAdapter类,2、实现HandlerInterceptor接口。

 

Java代码     收藏代码
  1. /**  
  2.  * 自定义拦截器  
  3.  * @author tushen  
  4.  * @date Nov 5, 2011  
  5.  */   
  6. public   class  MyInterceptor  extends  HandlerInterceptorAdapter {  
  7.   
  8.     /**  
  9.      * 最后执行,可用于释放资源  
  10.      */   
  11.     @Override   
  12.     public   void  afterCompletion(HttpServletRequest request,  
  13.             HttpServletResponse response, Object handler, Exception ex)  
  14.             throws  Exception {  
  15.         // TODO Auto-generated method stub   
  16.         super .afterCompletion(request, response, handler, ex);  
  17.     }  
  18.   
  19.     /**  
  20.      * 显示视图前执行  
  21.      */   
  22.     @Override   
  23.     public   void  postHandle(HttpServletRequest request,  
  24.             HttpServletResponse response, Object handler,  
  25.             ModelAndView modelAndView) throws  Exception {  
  26.           
  27.         System.out.println(request.getContentType()+"-----" +request.getCharacterEncoding()+ "------" +request.getContextPath());  
  28.         System.out.println("MyInterceptor.postHandle()---viewName:" +modelAndView.getViewName());  
  29.         super .postHandle(request, response, handler, modelAndView);  
  30.     }  
  31.   
  32.     /**  
  33.      * Controller之前执行  
  34.      */   
  35.     @Override   
  36.     public   boolean  preHandle(HttpServletRequest request,  
  37.             HttpServletResponse response, Object handler) throws  Exception {  
  38.           
  39.         String url = request.getRequestURI();  
  40.           
  41.         System.out.println("MyInterceptor.preHandle()" +url);  
  42.           
  43.         return   super .preHandle(request, response, handler);  
  44.     }  
  45. }  
 

<c>在Util包中DBUtil.java中实现Spring JDBC Template的封装,操作数据库;写一个DaoException继承spring的运行时异常类NestedRuntimeException,在数据库操作异常时抛出该异常,在controller层进行处理。

<d>写一个抽象的BaseDao接口和BaseDaoImpl实现类,让所有模块共享使用(详见附件)。

 

Java代码     收藏代码
  1. /**  
  2.  *   
  3.  */   
  4. package  com.aokunsang.dao;  
  5.   
  6. import  java.io.Serializable;  
  7. import  java.util.List;  
  8. import  java.util.Map;  
  9.   
  10. /**  
  11.  * @author tushen  
  12.  * @date Nov 5, 2011  
  13.  */   
  14. public   interface  BaseDao {  
  15.   
  16.     /**  
  17.      * 保存或者更新实体  
  18.      * @param sql  
  19.      * @param entry  
  20.      */   
  21.     <T extends  Serializable>  void  saveOrUpdateObject(String sql,T entry);  
  22.       
  23.     /**  
  24.      * 查询实体列表  
  25.      * @param sql  
  26.      * @param className  
  27.      * @param obj  
  28.      * @return  
  29.      */   
  30.     <T extends  Serializable> List<T> getObjList(String sql,Class<T> className,Object[] objs);  
  31.       
  32.     /**  
  33.      * 查询实体  
  34.      * @param <T>  
  35.      * @param sql  
  36.      * @param objs  
  37.      * @return  
  38.      */   
  39.     <T extends  Serializable> T getObject(String sql,Class<T> clazz,Object[] objs);  
  40.       
  41.     /**  
  42.      * 查询一个Map集合  
  43.      * @param sql  
  44.      * @param objs  
  45.      * @return  
  46.      */   
  47.     Map<String,?> find(String sql,Object[] objs);  
  48.       
  49.     /**  
  50.      * 批量操作  
  51.      * @param sql  
  52.      * @param objLs  
  53.      */   
  54.     void  batchOperate(String sql,List<?> objLs);  
  55.       
  56.     /**  
  57.      * 判断实体是否存在  
  58.      * @param sql  
  59.      * @param obj  
  60.      * @return  
  61.      */   
  62.     int  isExist(String sql,Object[] obj);  
  63.       
  64.     /**  
  65.      * 编辑操作  
  66.      * @param sql  
  67.      * @param obj  
  68.      * @return  
  69.      */   
  70.     int  editObject(String sql,Object[] obj);  
  71. }  
 

 

6、一切就绪,启动tomcat,访问http://localhost:8080/springmvc,看是否访问到了WEB-INF中的index.jsp页面。

7、然后根据Controller中的路径配置,依次访问WEB-INF/views中的页面。

 

另外:再附上一张他人画得springMVC3.0的流程图,我感觉画得还是挺好的,收藏了。


 

 

猜你喜欢

转载自wangxr66.iteye.com/blog/1608168