posts - 60, comments - 116, trackbacks - 1, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

单独使用Spring建立简易开发框架(五)

Posted on 2007-09-11 23:10 匪客 阅读(1925) 评论(3)  编辑  收藏 所属分类: 开发技术

6. Spring 配置

6.1. 视图配置

配置 Spring 环境公共设置的 applicationContext.xml 文件放在 /WEB-INF/ 目录下, 首先定义视图类型为 Jstl ,并约定 JSP 文件的默认保存路径,配置异常捕获处理 Bean ,当系统发生异常时,自动重新定向到 error.jsp 文件显示异常内容。

<?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"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

 

    <!-- 返回的视图资源的前缀和后缀,基于 Jstl 模板 -->

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

        <property name="prefix" value="/WEB-INF/jsp/"/>

    </bean>

 

    <!-- 启动加载异常处理的类,用于监听各模块中触发的异常 -->

    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

        <property name="defaultErrorView" value="error.jsp"/>

    </bean>

</beans>

6.2. 数据库连接

applicationContext.xml 文件中加入下面配置,首先加载数据库配置文件 jdbc.properties ,然后配置数据源,此处使用的是 TOMCAT 自带的数据库连接池实现,其实就是 Apache DBCP 连接池的重新封装。

<!-- 加载 properties 配置文件 -->

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="locations">

        <list>

            <value>/WEB-INF/jdbc.properties</value>

        </list>

    </property>

</bean>

 

<!-- 数据源 -->

<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" value="${jdbc.driverClassName}"/>

    <property name="url" value="${jdbc.url}"/>

    <property name="username" value="${jdbc.username}"/>

    <property name="password" value="${jdbc.password}"/>

</bean>

  jdbc.properties 文件在 /WEB-INF/ 目录下:

jdbc.driverClassName=oracle.jdbc.OracleDriver

jdbc.url=jdbc:oracle:thin:@localhost:1521:oradb

jdbc.username=demo

jdbc.password=123456

6.3. 数据库事务

applicationContext.xml 文件中加入下面配置,数据库事务管理,采用的是 AOP 代理,对所有文件名称以 Logic 结尾的接口类进行事务代理。在接口类中,方法名称以 insert update 等开头的采用事务管理,设置 Propagation REQUIRED 表示支持当前事务,如果当前没有事务,就新建一个事务;而其他的方法以 * 表示,设置 Propagation SUPPORTS 表示支持当前事务,如果当前没有事务就以非事务方式执行, read-Only true 表示对应事务被最优化为只读事务。

<!-- 事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

</bean>

 

<!--aop 代理,对所有以 Logic 为后缀文件名的接口类进行代理 -->

<aop:config>

    <aop:advisor pointcut="execution(* *..*Logic.*(..))" advice-ref="txAdvice"/>

</aop:config>

 

<!-- 数据库事务代理,对类中的指定前缀的方法进行事务控制 -->

<tx:advice id="txAdvice">

    <tx:attributes>

        <tx:method name="insert*" propagation="REQUIRED"/>

        <tx:method name="update*" propagation="REQUIRED"/>

        <tx:method name="delete*" propagation="REQUIRED"/>

        <tx:method name="upload*" propagation="REQUIRED"/>

        <tx:method name="*" propagation="SUPPORTS" read-only="true"/>

    </tx:attributes>

</tx:advice>


pointcut 的语法说明如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

Ø  除了返回类型模式、名字模式和参数模式以外,所有的部分都是可选的;

Ø  返回类型模式( ret-type-pattern )决定了方法的返回类型必须依次匹配一个连接点,返回类型模式 * 代表了匹配任意的返回类型;

Ø  名字模式( name-pattern )匹配的是方法名,可以使用 * 通配符作为所有或者部分命名模式;

Ø  参数模式( param-pattern )稍微有点复杂, () 匹配了一个不接受任何参数的方法,而 (..) 匹配了一个接受任意数量参数的方法(零或者更多),模式 (*) 匹配了一个接受一个任何类型的参数的方法,模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是 String 类型。

 

下面给出一些常见切入点表达式的例子。

Ø  任意公共方法的执行: execution(public * *(..))

Ø  任何一个以“ set ”开始的方法的执行: execution(* set*(..))

Ø  AccountService 接口的任意方法的执行: execution(* com.xyz.service.AccountService.*(..))

Ø  定义在 service 包里的任意方法的执行: execution(* com.xyz.service.*.*(..))

Ø  定义在 service 包或者子包里的任意方法的执行: execution(* com.xyz.service..*.*(..))

 

表达式 execution(* *..BookManager.save(..)) 的解读:

Ø  第一颗 * 代表 ret-type-pattern 返回值可任意;

Ø  *..BookManager 代表任意 Pacakge 里的 BookManager 类,如果写成 com.xyz.service.* 则代表 com.xyz.service 下的任意类, com.xyz.service..* com.xyz.service 则代表 com.xyz.service 及其子 package 下的任意类;

Ø  save 代表 save 方法,也可以写 save* 代表 saveBook() 等方法;

Ø  (..) 匹配 0 个参数或者多个参数的,任意类型, (x,..) 第一个参数的类型必须是 X (x,,,s,..) 匹配至少 4 个参数,第一个参数必须是 x 类型,第二个和第三个参数可以任意,第四个必须是 s 类型。

6.4. 控制器配置

控制器的配置文件为servlet-xxx.xml,xxx为URI请求的扩展名,此文件可以在web.xml中配置,如果不配置,spring默认查找的是xxx-servlet.xml文件,前后调转一下可方便很多的同类文件排序查看。

  如果配置了多个处理器映射,并且配置了对同一请求的处理,那么哪个处理器映射(BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping)会被优先查找映射关系呢?最好的方法是配置order属性,DispatcherServlet 按顺序采用映射处理器,数值小的会被优先匹配。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

 

    <import resource="applicationContext.xml"/>

 

     <bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="order" value="0"/>
     </bean>

    <bean name="/mainpage.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
        <property name="viewName" value="mainpage.jsp"/>
    </bean>

    <!--无拦截请求-->
    <bean id="noInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="order" value="2"/>
        <property name="mappings">
            <props>
                <prop key="login.do">doController</prop>
            </props>
        </property>
    </bean>

    <!--有拦截请求-->
    <bean id="hasInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="order" value="1"/>
        <property name="interceptors">
            <list>
                <ref bean="authInterceptor"/>
            </list>
        </property>
        <property name="mappings">
            <props>
                <prop key="enter.do">doController</prop>
                <prop key="logout.do">doController</prop>
            </props>
        </property>
    </bean>
 

    <!-- 请求与方法映射控制器 -->

    <bean id="doController" class="com.fyyk.core.LogicController">

        <property name="logicClass" ref="doLogic"/>

        <property name="uriMethodMapping">

            <props>

                <prop key="login">login</prop>

                <prop key="enter">enter</prop>

                <prop key="logout">logout</prop>

            </props>

        </property>

    </bean>

 

</beans>

6.5. 逻辑类配置

逻辑类的配置文件为 applicationContext-xxx.xml ,此文件可以在 web.xml 中配置,如 applicationContext-admin.xml 文件,也可以配置合并在 applicationContext.xml 中:

    <bean id="authInterceptor" class="com.fyyk.interceptor.AuthInterceptor">

        <property name="noLoginRedirect" value="/WEB-INF/jsp/noLogin.jsp"/>

    </bean>

 

    <bean id="doLogic" class="com.fyyk.logic.DoLogicImpl">

        <property name="dataSource" ref="dataSource"/>

    </bean>


评论

# re: 单独使用Spring建立简易开发框架(五) [未登录]  回复  更多评论   

2007-09-12 13:53 by Jerry
Oracle 还能换成MySQL啊?

# re: 单独使用Spring建立简易开发框架(五)   回复  更多评论   

2007-09-12 14:40 by James.Q
框架本身是没有问题的,对各种数据库支持都可以,只是在写业务SQL的时候需要主意,没法兼容,另外翻页的时候也是有针对性的。

# re: 单独使用Spring建立简易开发框架(五) [未登录]  回复  更多评论   

2009-09-01 17:27 by 小马
你总在牛A与牛C之间徘徊,~\(≧▽≦)/~

只有注册用户登录后才能发表评论。


网站导航: