springMvc3.0.5搭建全程 (转)
用了大半年的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文件:
- <span style="font-size: x-small;"><?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:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- 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.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-autowire="byName">
- <context:property-placeholder location="classpath:database.properties"/>
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
- <property name="driverClass" value="${mysql.driverclass}"></property>
- <property name="jdbcUrl" value="${mysql.jdbcurl}"></property>
- <property name="user" value="${mysql.user}"></property>
- <property name="password" value="${mysql.password}"></property>
- <property name="acquireIncrement" value="5"></property> <!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 -->
- <property name="initialPoolSize" value="10"></property> <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 -->
- <property name="minPoolSize" value="5"></property>
- <property name="maxPoolSize" value="20"></property>
- <!-- 最大空闲时间,超过空闲时间的连接将被丢弃
- [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout=30(单位秒)设置连接超时】,这里设置c3p0的超时必须<28800]
- -->
- <property name="maxIdleTime" value="300"></property>
- <property name="idleConnectionTestPeriod" value="60"></property> <!-- 每60秒检查连接池中的空闲连接 -->
- <property name="maxStatements" value="20"></property> <!-- jdbc的标准参数 用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 -->
- </bean>
- <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!-- 声明式事务管理 -->
- <aop:config>
- <aop:advisor pointcut="execution(* com.aokunsang.service.impl.*ServiceImpl.*(..))" advice-ref="myAdvice"/>
- </aop:config>
- <tx:advice id="myAdvice" transaction-manager="txManager">
- <tx:attributes>
- <tx:method name="add*" propagation="REQUIRED"/>
- <tx:method name="update*" propagation="REQUIRED"/>
- <tx:method name="*" read-only="true" rollback-for="com.aokunsang.util.DaoException"/>
- </tx:attributes>
- </tx:advice>
- <!-- 自动扫描组件,需要把controller去掉,否则影响事务管理 -->
- <context:component-scan base-package="com.aokunsang">
- <context:exclude-filter type="regex" expression="com.aokunsang.web.*"/>
- </context:component-scan>
- </beans></span>
springmvc-servlet.xml文件:
- <span style="font-size: x-small;"><?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"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
- <!-- 启动扫描所有的controller -->
- <context:component-scan base-package="com.aokunsang.web"/>
- <!-- 主要作用于@Controller,激活该模式
- 下面是一种简写形式,完全可以手动配置替代这种简写形式;
- 它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,
- 是spring MVC为@Controllers分发请求所必须的
- -->
- <mvc:annotation-driven/>
- <!-- 这里拦截器还有一种配置方法【针对路径进行配置】 推荐使用这个,方便直观-->
- <mvc:interceptors>
- <mvc:interceptor>
- <mvc:mapping path="/user/MyHome"/>
- <mvc:mapping path="/usermanager/*"/>
- <bean class="com.aokunsang.web.interceptor.MyInterceptor"></bean>
- </mvc:interceptor>
- </mvc:interceptors>
- <!-- 全局配置
- <mvc:interceptors>
- <bean class="com.aokunsang.web.interceptor.MyInterceptor"></bean>
- </mvc:interceptors>
- -->
- <!-- 配置js,css等静态文件直接映射到对应的文件夹,不被DispatcherServlet处理 -->
- <mvc:resources location="/WEB-INF/resources/**" mapping="/resources"/>
- <!-- jsp页面解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在/WEB-INF/views/目录下,查找XXX.jsp文件-->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/views/"></property>
- <property name="suffix" value=".jsp"></property>
- </bean>
- </beans></span>
3、修改web.xml文件如下:
- <span style="font-size: x-small;"><context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:/META-INF/jdbc-context.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet>
- <servlet-name>spring-mvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:/META-INF/springmvc-servlet.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>spring-mvc</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping></span>
4、从springmvc-servlet.xml中可以知道,我把jsp页面放在WEB-INF/views目录中,静态文件(图片,js,css等)放在Resources目录中,便于管理。
5、以上配置文件基本完成,下面开始代码编写:
首先说几个常用的注解:
- <span style="font-size: x-small;">@Autowired 自动注入[根据类型注入]<span style="font-size: 12px; white-space: normal;"><code style="font-size: small !important;">@Autowired</code> 可以对成员变量、方法以及构造函数进行注释,而 <code style="font-size: small !important;">@Qualifier</code> 的标注对象是成员变量、方法入参、构造函数入参。</span>
- @Resource 自动注入[根据名称注入],可写参数name=""
- @Controller 表示控制器
- @Service 表示业务处理层[一般在serviceImpl]
- @Repository 表示持久层[一般在daoImpl]
- @Component 当你的类不清楚是哪一层的时候使用该注解
- @ResponseBody 异步返回数据类型为json
- @RequestMapping 路径,请求类型等设置
- @InitBinder 数据绑定</span>
注解的详细介绍:http://blog.csdn.net/zhongxiucheng/article/details/6662300
也可以参考:https://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/
<a>首先写一个BaseController,可做一些数据绑定之类的全局操作(如:把日期字符串转换为Date日期)。
- @Controller
- public class BaseController {
- @InitBinder
- protected void ininBinder(WebDataBinder binder){
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf,true));
- }
- }
<b>然后写一个拦截器,拦截器有两种实现方式,1、继承HandlerInterceptorAdapter类,2、实现HandlerInterceptor接口。
- /**
- * 自定义拦截器
- * @author tushen
- * @date Nov 5, 2011
- */
- public class MyInterceptor extends HandlerInterceptorAdapter {
- /**
- * 最后执行,可用于释放资源
- */
- @Override
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- // TODO Auto-generated method stub
- super.afterCompletion(request, response, handler, ex);
- }
- /**
- * 显示视图前执行
- */
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println(request.getContentType()+"-----"+request.getCharacterEncoding()+"------"+request.getContextPath());
- System.out.println("MyInterceptor.postHandle()---viewName:"+modelAndView.getViewName());
- super.postHandle(request, response, handler, modelAndView);
- }
- /**
- * Controller之前执行
- */
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- String url = request.getRequestURI();
- System.out.println("MyInterceptor.preHandle()"+url);
- return super.preHandle(request, response, handler);
- }
- }
<c>在Util包中DBUtil.java中实现Spring
JDBC
Template的封装,操作数据库;写一个DaoException继承spring的运行时异常类NestedRuntimeException,在数据库操作异常时抛出该异常,在controller层进行处理。
<d>写一个抽象的BaseDao接口和BaseDaoImpl实现类,让所有模块共享使用(详见附件)。
- /**
- *
- */
- package com.aokunsang.dao;
- import java.io.Serializable;
- import java.util.List;
- import java.util.Map;
- /**
- * @author tushen
- * @date Nov 5, 2011
- */
- public interface BaseDao {
- /**
- * 保存或者更新实体
- * @param sql
- * @param entry
- */
- <T extends Serializable> void saveOrUpdateObject(String sql,T entry);
- /**
- * 查询实体列表
- * @param sql
- * @param className
- * @param obj
- * @return
- */
- <T extends Serializable> List<T> getObjList(String sql,Class<T> className,Object[] objs);
- /**
- * 查询实体
- * @param <T>
- * @param sql
- * @param objs
- * @return
- */
- <T extends Serializable> T getObject(String sql,Class<T> clazz,Object[] objs);
- /**
- * 查询一个Map集合
- * @param sql
- * @param objs
- * @return
- */
- Map<String,?> find(String sql,Object[] objs);
- /**
- * 批量操作
- * @param sql
- * @param objLs
- */
- void batchOperate(String sql,List<?> objLs);
- /**
- * 判断实体是否存在
- * @param sql
- * @param obj
- * @return
- */
- int isExist(String sql,Object[] obj);
- /**
- * 编辑操作
- * @param sql
- * @param obj
- * @return
- */
- int editObject(String sql,Object[] obj);
- }
6、一切就绪,启动tomcat,访问http://localhost:8080/springmvc,看是否访问到了WEB-INF中的index.jsp页面。
7、然后根据Controller中的路径配置,依次访问WEB-INF/views中的页面。
另外:再附上一张他人画得springMVC3.0的流程图,我感觉画得还是挺好的,收藏了。
springMvc3.0.5搭建全程 (转)的更多相关文章
- Spring MVC3.0.5搭建全程
http://aokunsang.iteye.com/blog/1279322 ——————————————————————————————————————————————————
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...
- (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
原文地址: http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...
- ubantu16.04+mxnet +opencv+cuda8.0 环境搭建
ubantu16.04+mxnet +opencv+cuda8.0 环境搭建 建议:环境搭建完成之后,不要更新系统(内核) 转载请注明出处: 微微苏荷 一 我的安装环境 系统:ubuntu16.04 ...
- cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台
目录 [TOC] 1.基本概念 既然是对Docker的容器进行监控,我们就不自己单独搭建cAdvisor.InfluxDB.Grarana了,本文中这三个实例,主要以Docker容器方式运行. 本 ...
随机推荐
- 两个APP跳转传值问题
最近工作上遇到个问题,新的项目要和老系统单点登录. 有点蒙,从来没做过,网上一搜都是SSO,还需要验证服务器. 仔细揣摩,其实需求很简单,没必要那么复杂,以下是我的需求和解决方案: 原系统AP1 新开 ...
- scala学习----柯里化
1.鸭子类型,走起来像鸭子,叫起来像鸭子,就是鸭子.函数中使用{ def close(): Unit }作为参数类型,因此任何含有此函数的类都可以作为参数传递.好处是不必使用继承特性. def wit ...
- iOS开发(OC)中的命名规范
开小差:最近发现自己有一个经验主义的毛病,不太容易接受新的知识,这对从事技术研发的人来说不太合理,需要改之. 正文:通过读写大量代码我有自己的一套编程思路和习惯,自认为自己的编码习惯还是不错的,代码结 ...
- Number of 1 Bits(Difficulty: Easy)
题目: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also ...
- 使用checkbox做出radiobutton的效果
首先分别使用不同name的checkbox放在同一个tr的两个td内.并为他们设置onclick事件来改变点击后状态. php: str[info]="<table align='ce ...
- ionic 使用
1. 编译时目录下不能有中文文件的名称,否则会报一个资源错误 ,返回aapt.exe'' finished with non-zero exit value 1. 2. 编译完成后在手机上无法访问网络 ...
- 北大poj-1011
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 136132 Accepted: 32036 Description ...
- c# txt文件的读写
在公司实习,任务不太重,总结一下c#关于txt文件的读写,以便以后有用到的时候可以查看一下.如果有写得不完整的地方还请补充 说明:本人C#水平可能初级都谈不上,高手轻喷,参考:http://www.c ...
- GSM Hacking Part② :使用SDR捕获GSM网络数据并解密
0×00 在文章第一部分 GSM Hacking Part① :使用SDR扫描嗅探GSM网络 搭建了嗅探GSM流量的环境,在第二部中,我们来讨论如何捕获发短信以及通话过程中的流量,从捕获到的数据中解密 ...
- 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...
开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...