SpringMvc(环境搭建)

 用了大半年的Spring MVC3.0,用着感觉不错。简单写一个搭建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集成、远程访问、缓存以及各种视图层框架的封装等

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. <context:property-placeholder location="classpath:database.properties"/>
  17. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  18. <property name="driverClass" value="${mysql.driverclass}"></property>
  19. <property name="jdbcUrl" value="${mysql.jdbcurl}"></property>
  20. <property name="user" value="${mysql.user}"></property>
  21. <property name="password" value="${mysql.password}"></property>
  22. <property name="acquireIncrement" value="5"></property> <!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 -->
  23. <property name="initialPoolSize" value="10"></property> <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 -->
  24. <property name="minPoolSize" value="5"></property>
  25. <property name="maxPoolSize" value="20"></property>
  26. <!-- 最大空闲时间,超过空闲时间的连接将被丢弃
  27. [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout=30(单位秒)设置连接超时】,这里设置c3p0的超时必须<28800]
  28. -->
  29. <property name="maxIdleTime" value="300"></property>
  30. <property name="idleConnectionTestPeriod" value="60"></property> <!-- 每60秒检查连接池中的空闲连接 -->
  31. <property name="maxStatements" value="20"></property> <!-- jdbc的标准参数 用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 -->
  32. </bean>
  33. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  34. <property name="dataSource" ref="dataSource"></property>
  35. </bean>
  36. <!-- 声明式事务管理 -->
  37. <aop:config>
  38. <aop:advisor pointcut="execution(* com.aokunsang.service.impl.*ServiceImpl.*(..))" advice-ref="myAdvice"/>
  39. </aop:config>
  40. <tx:advice id="myAdvice" transaction-manager="txManager">
  41. <tx:attributes>
  42. <tx:method name="add*" propagation="REQUIRED"/>
  43. <tx:method name="update*" propagation="REQUIRED"/>
  44. <tx:method name="*" read-only="true" rollback-for="com.aokunsang.util.DaoException"/>
  45. </tx:attributes>
  46. </tx:advice>
  47. <!-- 自动扫描组件,需要把controller去掉,否则影响事务管理 -->
  48. <context:component-scan base-package="com.aokunsang">
  49. <context:exclude-filter type="regex" expression="com.aokunsang.web.*"/>
  50. </context:component-scan>
  51. </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. <!-- 启动扫描所有的controller -->
  14. <context:component-scan base-package="com.aokunsang.web"/>
  15. <!-- 主要作用于@Controller,激活该模式
  16. 下面是一种简写形式,完全可以手动配置替代这种简写形式;
  17. 它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,
  18. 是spring MVC为@Controllers分发请求所必须的
  19. -->
  20. <mvc:annotation-driven/>
  21. <!-- 这里拦截器还有一种配置方法【针对路径进行配置】 推荐使用这个,方便直观-->
  22. <mvc:interceptors>
  23. <mvc:interceptor>
  24. <mvc:mapping path="/user/MyHome"/>
  25. <mvc:mapping path="/usermanager/*"/>
  26. <bean class="com.aokunsang.web.interceptor.MyInterceptor"></bean>
  27. </mvc:interceptor>
  28. </mvc:interceptors>
  29. <!-- 全局配置
  30. <mvc:interceptors>
  31. <bean class="com.aokunsang.web.interceptor.MyInterceptor"></bean>
  32. </mvc:interceptors>
  33. -->
  34. <!-- 配置js,css等静态文件直接映射到对应的文件夹,不被DispatcherServlet处理
  35. mapping --- WebRoot里面的静态文件位置目录
  36. location --- 访问地址
  37. -->
  38. <mvc:resources location="/resources/**" mapping="/WEB-INF/resources/"/>
  39. <!--
  40. 配置/WEB-INF/views/目录里面的jsp文件不被DispatcherServlet处理,可以直接通过浏览器访问。
  41. view-name --- /WEB-INF/views/里面的jsp文件名(不许后缀即可)
  42. path --- 访问地址
  43. -->
  44. <mvc:view-controller path="/header" view-name="header"/>
  45. <!-- jsp页面解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在/WEB-INF/views/目录下,查找XXX.jsp文件-->
  46. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  47. <property name="prefix" value="/WEB-INF/views/"></property>
  48. <property name="suffix" value=".jsp"></property>
  49. </bean>
  50. </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. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:/META-INF/jdbc-context.xml</param-value>
  11. </context-param>
  12. <listener>
  13. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  14. </listener>
  15. <servlet>
  16. <servlet-name>spring-mvc</servlet-name>
  17. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  18. <init-param>
  19. <param-name>contextConfigLocation</param-name>
  20. <param-value>classpath:/META-INF/springmvc-servlet.xml</param-value>
  21. </init-param>
  22. <load-on-startup>1</load-on-startup>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>spring-mvc</servlet-name>
  26. <url-pattern>/</url-pattern>
  27. </servlet-mapping>
  28. <filter>
  29. <filter-name>encodingFilter</filter-name>
  30. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  31. </filter>
  32. <filter-mapping>
  33. <filter-name>encodingFilter</filter-name>
  34. <url-pattern>/*</url-pattern>
  35. </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. @InitBinder
  4. protected void ininBinder(WebDataBinder binder){
  5. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  6. binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf,true));
  7. }
  8. }

<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. @Override
  11. public void afterCompletion(HttpServletRequest request,
  12. HttpServletResponse response, Object handler, Exception ex)
  13. throws Exception {
  14. // TODO Auto-generated method stub
  15. super.afterCompletion(request, response, handler, ex);
  16. }
  17. /**
  18. * 显示视图前执行
  19. */
  20. @Override
  21. public void postHandle(HttpServletRequest request,
  22. HttpServletResponse response, Object handler,
  23. ModelAndView modelAndView) throws Exception {
  24. System.out.println(request.getContentType()+"-----"+request.getCharacterEncoding()+"------"+request.getContextPath());
  25. System.out.println("MyInterceptor.postHandle()---viewName:"+modelAndView.getViewName());
  26. super.postHandle(request, response, handler, modelAndView);
  27. }
  28. /**
  29. * Controller之前执行
  30. */
  31. @Override
  32. public boolean preHandle(HttpServletRequest request,
  33. HttpServletResponse response, Object handler) throws Exception {
  34. String url = request.getRequestURI();
  35. System.out.println("MyInterceptor.preHandle()"+url);
  36. return super.preHandle(request, response, handler);
  37. }
  38. }

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

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

 

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

 

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

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

 

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


 

 

猜你喜欢

转载自2951484949.iteye.com/blog/2244126