单独使用Spring建立简易开发框架项目实例下载



单独使用Spring建立简易开发框架项目实例下载。

1. 前言

此文档讲述的内容适合于对 Spring MVC 和数据持久层 ORM 概念有一定基础的开发者,着重于讲述基于 Spring 框架基础之上进行 Java 开发的其中一种技术解决方案,而不是讲述相关技术的原理,想要了解技术原理内容请参考相关文档资料。

现在,网络上流传的Spring+Struts+Hibernate用得非常火,几乎成为很多对技术痴迷的人的技术架构标准,可是在我看来,也许是因为项目都不算大,人力也不够多,这个技术架构太复杂了。从Spring本身来讲,从MVC到数据操作,都可以不需要其他附加组件即可实现,并且结构清晰,使用简单,功能还更加强大,本文讲述的重点就是单独使用Spring来建立一个简易的开发框架。

首先说,为什么选择Spring呢?大概在2003年的时候,Struts已经开始流行了,但是在学习Struts的时候感觉这个技术框架比原始的JSP+JavaBean的方式复杂了很多,后来2004年做新项目时在论坛上看到推荐Spring,下载一试,上手非常的容易,结构也很清晰,支持的功能也非常多,所以决定用它了(其实那时候对于依赖注入和AOP代理还不甚了解,也很少用到接口)。

在2001-2003年的时候都是自己封装了JavaBean做为公共模块来访问数据库的,后来ORM兴起了,先是看了Hibernate的,3.0版还没用出,还不支持存储过程,因为那时候也做Delphi相关开发,用惯了SQL语句,始终觉得HQL这样的东东增加了开发的复杂度和不可控制性,原生的复杂SQL语句无法使用,不喜欢。后来看到了iBATIS,经过试用,正是我所需要的,SQL语句配置简单,基本不会破坏SQL语句的结构,这样将SQL语句Copy到外部数据库工具中进行调试也非常的方便,加上SQL语句可以使用很多的特定数据库的函数,执行效率和简洁性也非常好,修改了SQL又不需要重新编译程序。

有网友说Hibernate支持多个数据库移值啊,我认为这个就不仅仅是SQL语句的问题了,还有很多其他方面的因素,大多数项目都可以不用考虑。又有网友说Hibernate对于数据库结构修改的影响比较小,这种情况影响的也不仅仅是几句代码的问题,涉及到界面表现、业务流程等很多重要方面,相对说来修改代码倒是小Case了。
说完了上面的 ORM 组件,再说说 JDBC , Spring 的 JdbcTemplate 将我们常用的 JDBC 流程封装起来,使用非常简单,一般执行的 SQL 就是一句话,构造 SQL 随着业务的复杂而复杂,并且也支持 PrepareStatement 的执行模式避免 SQL 注入漏洞发生,同样具备完整的数据操作功能如查询、更新、存储过程、异常捕捉等等,经过几年的使用比较,我认为轻型的项目使用JdbcTemplate 是非常不错的选择。

由于能力所限,其中细节如有欠缺之处,请多多批评指正。

2. 参考资料

²   Spring 官方网站: http://www.springframework.org/ ;

²   Spring 2.0 中文参考手册: http://spring.jactiongroup.net/ ;

²   Apache Jakarta 官方网站: http://jakarta.apache.org/ ;

²   JSTL 官方网站: http://java.sun.com/products/jsp/jstl/ ;

²   Intellij IDEA 官方网站: http://www.jetbrains.com/ ;

3. 架构概览

MVC 层在 Spring 的 AbstractController 类基础上进行了继承和重构,使整个框架仅使用单一的公共控制器,数据操作采用Spring JdbcTemplate ,在逻辑层中直接集成了 Spring Jdbc 能力,可直接操作数据,表现层 Jstl ,除此之外,未定义任何的表单对象、数据库表映射对象和其他 ORM 的配置文件,在保留对关键功能的集成度的基础上技术入门度极低,重点关注业务功能和优化 SQL 语句 。

请求处理流传如图所示:

1)      用户访问 http://www.fyyk.com/a.do ;

2)      Web 应用服务器(如 tomcat )解析扩展名为 *.do 的请求,通过 Spring 分发器org.springframework.web.servlet.DispatcherServlet 读取 servlet-do.xml 中的配置,将请求转发给公共控制器类LogicController.java ;

3)      公共控制器类 LogicController.java 根据 servlet-do.xml 文件中的配置信息调用 DoLogicImpl.java 类中相对应名称的方法;

4)      DoLogicImpl.java 类中的方法在处理完成业务逻辑后,将数据内容 ModelAndView 返回给公共控制器类LogicController.java ;

5)      公共控制器类 LogicController.java 处理 ModelAndView 信息,执行 b.jsp 将结果数据显示出来;

3.1. 控制器 Controller 

 

  控制器类配置在

servlet-xxx.xml 文件中,封装后的 Controller 特点如下:1)    继承 AbstractController 类,便于调用应用环境的 Web 特性;

2)   只用控制器做请求的转发,业务实现全部在逻辑层;

3)      采用反映射机制( reflect ),运行期调用逻辑类中的方法,而请求 URI 、逻辑类和方法名之间的对应关系只需要在 servlet-xxx.xml 中配置,这样,控制器实现就只有唯一的一个类文件;

3.2. 逻辑层 Logic 

 

逻辑层类在

 

applicationContext-xxx.xml 文件配置 Bean 定义中,主要实现两项功能:一是处理业务逻辑,二是操作数据库;逻辑层类首先需要定义一个接口类,统一以 xxxLogic.java 命名,实现类命名为 xxxLogicImpl.java ,并继承JdbcDaoSupport 类,这样逻辑类便具有了数据库访问能力。

逻辑类的方法如果被公共控制器类 LogicController.java 的反映射机制直接调用,则其接口类需要继承空的公共接口类BasicLogic ,定义方法时参数和返回值是固定的,如果是被其他逻辑类调用则不需要。

public ModelAndView initLogin(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext);

控制器层直接将请求的 request 、 response 和 servletContext 全部传递过来交由逻辑层自由控制,对于 request 中的表单数据,未采用 SimpleFormController 的模式定义表单对象,建议手工获取,从代码量本身来将并不复杂,反而更加灵活。在业务处理完成后,必须构造一个 ModelAndView 对象,作为方法返回值回传给控制器。

范例代码如下:

public class AdminLogicImpl extends JdbcDaoSupport implements AdminLogic

{

 

public ModelAndView insertUser(HttpServletRequest request, HttpServletResponse response,

ServletContext servletContext) throws DataAccessException

{

String userId = request.getParameter(“userId”);

String userName = request.getParameter(“userName”);

int age = Integer.parseInt(request.getParameter(“age”));

double weight = Double.parseDouble(request.getParameter(“weight”));

 

String sqlStr = “insert into testuser (userId,username,age,weight,updatetime) values (?,?,?,?,?)”;

Object[] object = new Object[]{userId, userName, age, weight, new Date()};

getJdbcTemplate().update(sqlStr, object);

 

Map<String, Object> model = new HashMap<String, Object>();

model.put(“msg”, “ 插入用户成功! ”);

model.put(“url”, “pageForm.user”);

String view = “admin/message.jsp”;

return new ModelAndView(view, model);

}

}

3.3. 表现层 Jstl

表现层采用 Jstl taglib 1.2 ,在 *.jsp 页面中加入 taglib 引用即可使用 Jstl 标签的大部分功能了,标签的具体使用方法请参考相关文档。

<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>

<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt” prefix=”fmt” %>

<%@ taglib uri=”http://java.sun.com/jsp/jstl/functions” prefix=”fn” %>

4. 开发准备

4.1. 开发工具

Ø  Java 编辑器 Intellij IDEA 6.0.5 、 Eclipse WTP 3.2 ;

Ø  JDK5.0 Update 11 ;

Ø  Web 服务器 Tomcat 5.5.20 ;

Ø  数据库 Oracle10g ;

4.2. 支撑库文件

spring.jar spring 2.0.3
jstl.jar

standard.jar

Jstl 1.2
commons-io-1.3.1.jar

commons-fileupload-1.2.jar

文件上传组件
commons-logging-1.1.jar

log4j-1.2.14.jar

日志组件
mail.jar

activation.jar

邮件组件
quartz-1.5.2.jar 时序调度组件
aspectjweaver.jar AOP 组件
commons-lang-2.3.jar Apache 公共包
commons-codec-1.3.jar

commons-collections-3.2.jar

commons-httpclient-3.0.1.jar

Httpclient 组件

4.3. 系统目录结构

 

路   

说   

/ 工程根目录
/lib 工程所用的库文件目录
/src 源代码目录
/webapp 站点根目录
/webapp/css 样式表目录
/webapp/images 图片目录
/webapp/js Js 脚本目录
/webapp/WEB-INF web.xml 等配置文件所在目录
/webapp/WEB-INF/classes Class 所在目录
/webapp/WEB-INF/jsp Jsp 文件存放目录
/webapp/WEB-INF/lib jar 包目录
/webapp/WEB-INF/logs 程序日志目录
/webapp/WEB-INF/temp 临时文件保存目录

4.4. 配置开发环境

4.4.1 设置字符集

程序文件全部为 UTF-8 字符集,使用开发工具建立工程时需要修改工程的默认字符集。
在 IDEA 中通过 Ctrl+Alt+S 快捷键打开设置窗口,选择 IDE Settings 下面的 General 打开通用设置窗口,修改 File Encoding 下面的 Default encoding 为 UTF-8 ,同时修改 Properties Files 下面的 Default encoding 为 UTF-8 。
在 Eclipse 中点击菜单 Window-Preferences 打开参数设置窗口,选择左侧树形节点 General-Workspace ,修改 Text File Encoding 为 UTF-8 。
如果需要使用已经存在的源文件,使用 IDEA 建立同名新文件,然后 copy 原始文件内容到新文件中,注意不要直接使用源文件,可能会产生乱码问题。

4.4.2 配置数据库驱动

  由于数据库连接池组件包使用的是 Tomcat 自带,所以数据库驱动程序包需要放在Tomcat 可以访问的位置, Oracle 驱动 ojdbc14.jar 文件必须 Copy 到 tomcat/common/lib 这样的目录下,而不能放在开发工具工程 lib 目录下。

5. web.xml 配置

5.1. 基本配置

web.xml 采用 servlet2.4 规范,默认配置了会话过期时间和网站首页文件。

<?xml version=”1.0″ encoding=”UTF-8″?>

<web-app id=”WebApp_ID” version=”2.4″

xmlns=”http://java.sun.com/xml/ns/j2ee”

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

xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>

 

<!– 会话的时间 –>

<session-config>

<session-timeout>30</session-timeout>

</session-config>

 

<!– 欢迎页面 –>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

5.2. 加载 spring 监听

在 web.xml 文件中加入如下配置:

<!– 设置环境变量,将 web 应用根目录存储到环境变量中 –>

<context-param>

<param-name>webAppRootKey</param-name>

<param-value>webapp.root</param-value>

</context-param>

 

<!– 设置环境变量指定 applicationContext.xml 配置文件 –>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/applicationContext.xml

/WEB-INF/applicationContext-admin.xml

/WEB-INF/applicationContext-quartz.xml

</param-value>

</context-param>

 

<!– 设置 context 的监听,启动时加载 applicationContext.xml 文件,初始化applicationContext 实例 –>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

5.3. Log4j 日志

首先,在 web.xml 文件中加入如下配置:

<!– 设置环境变量指定 log4j 的配置文件 –>

<context-param>

<param-name>log4jConfigLocation</param-name>

<param-value>/WEB-INF/log4j.properties</param-value>

</context-param>

 

<!– 设置 log4j 的监听,使日志组件能够使用,调用 log4jConfigLocation 中设置的环境变量 –>

<listener>

<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

</listener>

log4j.properties 文件放在 /WEB-INF/ 目录下, 文件内容如下例,其中根日志级别为 warn ,而在包 cn.idtag 中的类的日志级别为 info 。

# 定义根日志的级别和输出路径 fatal, error, warn, info, debug

log4j.rootCategory=warn, stdout, logfile

 

# 在包 cn.idtag 中的类的日志级别

log4j.logger.cn.idtag=info

 

# 日志输出参数

#%c: 日志信息所在类名

#%d: 日志信息产生时间

#%p: 日志信息级别

#%m: 产生的日志具体信息

#%n: 输出日志信息换行

log4j.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c%n%m%n%n

 

# 控制台输出

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=${log4j.ConversionPattern}

 

# 日志文件输出

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/log.txt

log4j.appender.logfile.Append = true

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=${log4j.ConversionPattern}

5.4. 解决中文乱码

在 web.xml 文件中加入如下配置,可以解决表单提交的编码,不需要在每个 *.jsp 、 *.htm 等页面上编写代码“ <%@ page contentType=”text/html; charset=gbk” language=”java”%> ”了,并且为浏览器端设置的“ <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> ”代码也不需要写了,浏览器会自动识别,注意建立文件时一定要使用 UTF-8 字符集。

<!– 设置字符串过滤器,解决表单 Post 提交中的乱码问题 –>

<filter>

<filter-name>characterEncoding</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>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>characterEncoding</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

<!– 设置 jsp,htm,html 页面的字符集,是否使用标签,是否使用 jsp 脚本等,头尾载入页面等 –>

<jsp-config>

<jsp-property-group>

<description> 指定 JSP 文件的配置属性 </description>

<display-name>jspConfiguration</display-name>

<url-pattern>*.jsp</url-pattern>

<el-ignored>false</el-ignored>

<page-encoding>utf-8</page-encoding>

<scripting-invalid>false</scripting-invalid>

<include-prelude></include-prelude>

<include-coda></include-coda>

</jsp-property-group>

 

<jsp-property-group>

<description> 指定 htm 文件的配置属性 </description>

<display-name>jspConfiguration</display-name>

<url-pattern>*.htm</url-pattern>

<el-ignored>false</el-ignored>

<page-encoding>utf-8</page-encoding>

<scripting-invalid>false</scripting-invalid>

<include-prelude></include-prelude>

<include-coda></include-coda>

</jsp-property-group>

 

<jsp-property-group>

<description> 指定 html 文件的配置属性 </description>

<display-name>jspConfiguration</display-name>


<url-pattern>*.html</url-pattern>

<el-ignored>false</el-ignored>

<page-encoding>utf-8</page-encoding>

<scripting-invalid>false</scripting-invalid>

<include-prelude></include-prelude>

<include-coda></include-coda>

</jsp-property-group>

 

</jsp-config>

如果应用服务器是 Tomcat ,编辑 Tomcat 根目录下的“ /conf/server.xml ”文件,找到Connector 配置部分,在配置结尾加入“ URIEncoding=”utf-8″ ”:

<Connector port=”8080″ maxThreads=”150″ …… disableUploadTimeout=”true”/>

改为:

<Connector port=”8080″ maxThreads=”150″ …… disableUploadTimeout=”true” URIEncoding=”UTF-8″/>

可解决系统内部 GET 方法传递中文字符参数的乱码问题,但是在外部 URL 请求中参数值带有中文的,必须使用 URLEncode 编码。

5.5. 配置 servlet

在 web.xml 文件中配置 servlet 请求路径和实现类:

<servlet>

<servlet-name>sendSms</servlet-name>

<servlet-class>cn.idtag.test.servlet.SendSmsServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>sendSms</servlet-name>

<url-pattern>/servlet/sendsms</url-pattern>

</servlet-mapping>

而 SendSmsServlet.java 文件需要继承 HttpServlet 类,如果 response 要输出内容并包含非英文字符,要设置输出的字符集为 UTF-8 :

package cn.idtag.test.servlet;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServlet;

import javax.servlet.ServletException;

import java.io.IOException;

 

public class SendSmsServlet extends HttpServlet

{

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

response.setContentType(“text/html;charset=utf-8″);

PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), “utf-8″));

try

{

//do something…

} finally

{

out.close();

}

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

doGet(request, response);

}

}

 

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”>

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

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

</bean>

 

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

<bean id=”exceptionResolver”>

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

</bean>

</beans>

6.2. 数据库连接

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

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

<bean id=”propertyConfigurer”>

<property name=”locations”>

<list>

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

</list>

</property>

</bean>

 

<!– 数据源 –>

<bean id=”dataSource” 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”>

<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 文件,前后调转一下可方便很多的同类文件排序查看:

<?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”/>

 

<bean name=”/mainpage.do”>

<property name=”viewName” value=”mainpage.jsp”/>

</bean>

 

<!– 无拦截请求 –>

<bean id=”noInterceptors”>

<property name=”mappings”>

<props>

<prop key=”login.do”>doController</prop>

</props>

</property>

</bean>

 

<!– 有拦截请求 –>

<bean id=”hasInterceptors”>

<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”>

<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”>

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

</bean>

 

<bean id=”doLogic”>

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

</bean>

7. 开发工作要做什么

一般说来,完成一个操作流程的全部开发需要完成以下工作:


1.  
 配置 servlet-xxx.xml 文件,加入 URI 请求的控制器 Bean 、逻辑类及方法;


2.  
 配置 applicaionContext-xxx.xml 文件,加入响应 URI 请求的逻辑类 Bean 定义;


3.  
 建立逻辑类文件接口类文件,加入响应 URI 请求的方法,并实现该类和方法,在方法体中完成具体的业务代码,如果需要操作数据库,则实现类需要继承 JdbcDaoSupport 类;


4.  
 建立 .jsp 文件,输出请求结果;

 

点此下载演示代码

接下来会有一些应用范例程序介绍给大家。http://www.blogjava.net/qsg1982/archive/2007/09/12/144475.html