单独使用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