[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" %>
|
Ø
Java
编辑器
Intellij IDEA 6.0.5
、
Eclipse WTP 3.2
;
Ø
JDK5.0 Update 11
;
Ø
Web
服务器
Tomcat 5.5.20
;
Ø
数据库
Oracle10g
;
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
组件
|
路
径
|
说
明
|
/
|
工程根目录
|
/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
|
临时文件保存目录
|
程序文件全部为
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
原始文件内容到新文件中,注意不要直接使用源文件,可能会产生乱码问题。
由于数据库连接池组件包使用的是
Tomcat
自带,所以数据库驱动程序包需要放在
Tomcat
可以访问的位置,
Oracle
驱动
ojdbc14.jar
文件必须
Copy
到
tomcat/common/lib
这样的目录下,而不能放在开发工具工程
lib
目录下。
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>
|
在
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>
|
首先,在
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}
|
在
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
编码。
在
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);
}
}
|
配置
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>
|
在
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
|
在
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
类型。
控制器的配置文件为
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" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<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="mappings">
<props>
<prop key="login.do">doController</prop>
</props>
</property>
</bean>
<!--
有拦截请求
-->
<bean id="hasInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<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>
|
逻辑类的配置文件为
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>
|
一般说来,完成一个操作流程的全部开发需要完成以下工作:
1.
配置
servlet-xxx.xml
文件,加入
URI
请求的控制器
Bean
、逻辑类及方法;
2.
配置
applicaionContext-xxx.xml
文件,加入响应
URI
请求的逻辑类
Bean
定义;
3.
建立逻辑类文件接口类文件,加入响应
URI
请求的方法,并实现该类和方法,在方法体中完成具体的业务代码,如果需要操作数据库,则实现类需要继承
JdbcDaoSupport
类;
4.
建立
.jsp
文件,输出请求结果;
点此下载演示代码
接下来会有一些应用范例程序介绍给大家。