SpringMVC+mybatis+DWR3注解

框架整合中需要各个软件版本
Spring : spring-flex-1.0.3.RELEASE.zip
DWR: dwr-3.0.0.116.rc1-src.zip
mybatis: mybatis-3.0.6-bundle.zip
框架整合后的配置文件结构图




说明:
mybatis-config.xml 放置在src目录下,配置mybatis的参数
applicationContext.xml 放置WEB-INF目录下,配置spring的基础配置和数据源等
db.properties 放置WEB-INF目录下,配置数据库的连接参数
web.xml 配置web应用,如springMVC中的前端控制器DispatcherServlet和ContextLoaderListener  spring监听器等。
Web.xml详细配置和说明
配置Spring的启动监听
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置SpringMVC
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
配置DWR前端控制器

<servlet-mapping> 
        <servlet-name>springmvc</servlet-name> 
        <url-pattern>/dwr/*</url-pattern> 
    </servlet-mapping> 
配置工程编码过滤器

<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

applicationContext.xml配置
配置 以注解方式扫描springBean
<!—以注解方式扫描Spring Bean -->
<context:annotation-config />
<!—配置扫描SpringBean的时候 都需要扫描哪些目录下 -->
<context:component-scan base-package="com"></context:component-scan>
配置数据源

<!-- 这个bean 由spring提供,用来加载properties文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>WEB-INF/db.properties</value>
</property>
</bean>
<!-- 数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="url">
<value>${url}</value>
</property>
<property name="username">
<value>${username}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
<!-- 数据库驱动类 -->
<property name="driverClassName">
<value>${driverClassName}</value>
</property>
<!-- 连接池的最大数据库连接数。设为0表示无限制。 -->
<property name="maxActive">
<value>${maxActive}</value>
</property>
<!-- 最大的空闲连接数,这里取值为30,表示即使没有数据库连接时依然可以保持30个空闲的连接,而不被清除,随时处于待命状态。设为0表示无限制。 -->
<property name="maxIdle">
<value>${maxIdle}</value>
</property>
<!-- 最大建立连接等待时间(毫秒)。如果超过此时间将接到异常。设为-1表示无限制 -->
<property name="maxWait">
<value>${maxWait}</value>
</property>
<!--指定数据库的默认自动提交 -->
<property name="defaultAutoCommit">
<value>${defaultAutoCommit}</value>
</property>
<!--是否自动回收超时连接 -->
<property name="removeAbandoned">
<value>${removeAbandoned}</value>
</property>
<!--超时时间(以秒数为单位) -->
<property name="removeAbandonedTimeout">
<value>${removeAbandonedTimeout}</value>
</property>
<property name="logAbandoned">
<value>${logAbandoned}</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>
db.properties文件
# dataSource config
#Oracle
#url=jdbc:oracle:thin:@localhost:1521:orcl
#MySql
url=jdbc:mysql://127.0.0.1:3306/framework
username=root
password=root
#Oracle
#driverClassName=oracle.jdbc.driver.OracleDriver
#MySql
driverClassName=com.mysql.jdbc.Driver
maxActive=100
maxIdle=30
maxWait=3000
defaultAutoCommit=true
removeAbandoned=true
removeAbandonedTimeout=60
logAbandoned=true

配置mybstis SqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
<property  name="mapperLocations"  value="classpath*:com/**/*.xml"/> 
</bean>
说明:
<property  name="mapperLocations"  value="classpath*:com/**/*.xml"/>
指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,mapperLocations和configLocation有一个即可,当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件。
配置事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<aop:config>
<aop:advisor pointcut="execution(* com.sanling..*Service.*(..))" advice-ref="txAdvice" />
<aop:advisor pointcut="execution(* com.sanling.utils..*Service.*(..))" advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="is*" read-only="true" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

springmvc.xml
配置springMVC的调转规则

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
配置DWR

<context:annotation-config />
<context:component-scan base-package="com" />
<dwr:annotation-scan scanRemoteProxy="true" scanDataTransferObject="true" base-package="com" /> 
<dwr:annotation-config /> 
<dwr:url-mapping /> 
<dwr:controller id="dwrController" debug="true" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
<property name="order" value="1" /> 
</bean> 
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> 
<property name="order" value="2" /> 
</bean> 
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="order" value="3" />  
      <property value="true" name="alwaysUseFullPath"></property> 
      <property name="mappings"> 
        <props> 
          <prop key="/dwr/**">dwrController</prop> 
        </props> 
     </property> 
    </bean>  
说明:
DWR配置
<dwr:annotation-scan>
扫描JavaBean的转换,@DataTransferObject对JavaBean进行转换,@RemoteProperty,必须加在get方法上。
<context:annotation-config /> 
要求DWR在Spring容器中检查拥有@RemoteProxy 和 @RemoteMethod注解的类。注意它不会去检查Spring容器之外的类。
<dwr:url-mapping />
要求DWR将util.js和engine.js映射到dwrController
<dwr:configuration />
此标签在这个例子中不是必须的,如果你想配置Spring容器之外的类,就需要它了
<dwr:controller id="dwrController" debug="true" /> 
部署项目时, 请把debug设为false
<context:component-scan base-package="com.myapp.web.controller" />
多个包名用逗号隔开, 但不能有空格
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
添加下面的Bean,就可以通过http://localhost:8080/myApp/dwr来访问test page
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
order值越小, 优先级越高,必须有这项配置,否则SpringMVC和DWR就不能同时使用注解
对于<context:annotation-config /> 在applicationContext.xml中已经有过配置,则可以把applicationContext.xml中的去掉,保留springmvc.xml中的就可以。

BaseDao

@Repository
public class BaseDao extends SqlSessionDaoSupport{
private SqlSessionFactory sqlSessionFactory;
@Resource
public void setSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
public BaseDao() {
System.out.println("--BaseDao---------");
}

说明:
BaseDao 为dao层,定义了基础的数据库操作
BaseDao层,自动注入了mybatis的SqlSessionFactory,BaseDao层中数据库的相关操作,都可以通过SqlSessionFactory来完成
JavaBean
@DataTransferObject
public class Region implements Serializable {

private int id;
private int pid;
private String name;
private String code;
}
说明:
注解@DataTransferObject的作用是在DWR调用Java,返回JavaBean对象的时候,JavaBean对象和JS对象进行转换。
JavaBean的映射文件region.mapper.xml

<mapper namespace="region">
<resultMap type="com.sanling.business.region.entity.Region" id="resultMap">
<id property="id" column="id" />
<result property="pid" column="pid" />
<result property="code" column="code" />
<result property="name" column="name" />
<result property="codeOrder" column="codeOrder" />
<result property="treeLevel" column="treeLevel" />
<result property="innerCode" column="innerCode" />
</resultMap>
<insert id="save" parameterType="com.sanling.business.region.entity.Region">
<selectKey resultType="int" keyProperty="id">   
<!--
要返回保存数据的ID
orcale:SELECT LOGS_SEQ.nextval AS ID FROM DUAL
MYSQL: SELECT LAST_INSERT_ID()
-->
     SELECT LAST_INSERT_ID()    
</selectKey>
insert into
tb_region(pid,code,name,codeOrder,treeLevel,innerCode)
values(#{pid},#{code},#{name},#{codeOrder},#{treeLevel},#{innerCode})
</insert>
</mapper>
Service
@Service
public class RegionService {

private IDao dao;
@Resource
public void setDao(BaseDao dao) {
this.dao = dao;
}
public int saveRegion(Region bean) throws Exception{
this.dao.save("region.save", bean);
return bean.getId();
}

说明:
RegionService层自动注入dao层,提供数据库访问操作
Action
@Controller
@RemoteProxy
@RequestMapping("/regionAction")
public class RegionAction {
private RegionService regionService ;

@Resource
public void setRegionService(RegionService regionService) {
this.regionService = regionService;
}

@RequestMapping("/testHttp")
public void testHttp(){
System.out.println(" http test !");
}
@RemoteMethod
public Region addRegion(Region bean){
if(bean!=null){
String innerCode = bean.getInnerCode()+bean.getCode();
bean.setInnerCode(innerCode);
try {
int id = this.regionService.saveRegion(bean);
bean.setId(id);
} catch (Exception e) {
e.printStackTrace();
}
}
return bean ;
}
}
说明:
类注解@RemoteProxy:表明允许DWR框架调用该后台类
方法注解@RemoteMethod:表明允许DWR调用后台java类中的方法
类注解和方法注解@RequestMapping("/regionAction"):表明该类为SpringMVC类,访问路径/regionAction/testHttp.action 就能访问到类RegionAction中的testHttp方法(页面怎么调转,这里不做详细说明)
测试
测试SpringMVC是否能正常访问:
http://localhost:8080/项目名/regionAction/testHttp.action 看看程序是否能进入到testHttp()方法即可。
测试DWR是否正常
访问:http://localhost:8080/项目名/dwr 能看到如下界面

注意,只要在类上注解@RemoteProxy,则在测试DWR的时候,都能看到这些类名。

猜你喜欢

转载自qingxing30.iteye.com/blog/1609255