项目需要,在原来Struts的基础上,配了Spring,数据库访问也用JDBC代替,由于Spring出色的控制反转,JDBC连接的工作基本上不需要考虑,只要专注于数据抽取就可以了,下边把代码贴一下,顺便说说一些小细节。
Spirng和Struts结合,主要有三种方式:
1,使用ActionSupport类
2,覆盖RequestProcessor
3,将Action委托给Spring
文章<使用 Spring更好地处理Struts动作>
中,对这三种方法都分析得比较详细,我在这里归纳一下.
使
用第一种方法,是最简单的,不需要其他任何配置,只需要在把继承Action,改成继承ActionSupport,带来的问题就是Struts与
Spring,紧耦合,以后不使用Spring配置时,需要修改代码.但其实,我目前觉得使用此方法,有一个好处是可以方便的得到
WebApplicationContext对象,不然,就需要使用ClassPathXmlApplicaiton("...")来取得Context
对象,不是很方便.其实,看DelegationActionUtils的源码,applicationContext对象也只是,这样子通过
sturts的plugin取得的.
actionServlet.getServletContext().getAttribute(
ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX + modulePrefix)
第二种方法,所有Action的分发都是通过ActionServlet的,而实际上的操作是由RequestProcessor 完成的,因此,可以把它覆盖,引入Spring
The RequestProcessor is where the majority of the
core processing occurs for each
request. Since version 1.3, the default Request
Processor (ComposableRequestProcessor)
is composed using Jakarta Commons Chain,
which is an implementation of the Chain of Responsibility
pattern (CoR).
The <controller>
element allows you to configure
the ActionServlet. Many of the controller
parameters were previously defined by servlet
initialization parameters in your web.xml
file but have been moved to this section of struts-config.xml
in order to allow different
modules in the same web application to be configured
differently.
第三种是最推荐的方法
顺便说一下,plugin在struts的概念,来自UserGuide:
The PlugIn
interface extends Action and so that applications
can easily hook into the ActionServlet lifecycle.
This interface defines two methods, init() and
destroy(), which are called at application startup and
shutdown, respectively. A common use
of a Plugin Action is to configure or load
application-specific data as the web application is
starting up.
其中Spring中的ContextLoaderPlugIn就是继承此PlugIn
,从而引入了Spring
基本上这样子就可以把Spring+Struts配置好,然后Spring+JDBC,关键就是配置好DataSource,然后通过JdbcTemplate类,就可以很方便的进行配置.以下部分为代码:
web.xml
<
web-app
>
<
param-name
>
contextConfigLocation
</
param-name
>
<
param-value
>
/WEB-INF/applicationContext.xml,/WEB-INF/applicationContext-*.xml
</
param-value
>
</
context-param
>
<
listener
>
<
listener-class
>
org.springframework.web.context.ContextLoaderListener
</
listener-class
>
</
listener
>
<
servlet
>
<
servlet-name
>
action
</
servlet-name
>
<
servlet-class
>
org.apache.struts.action.ActionServlet
</
servlet-class
>
<
init-param
>
<
param-name
>
config
</
param-name
>
<
param-value
>
/WEB-INF/struts-config.xml
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
debug
</
param-name
>
<
param-value
>
3
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
detail
</
param-name
>
<
param-value
>
3
</
param-value
>
</
init-param
>
<
load-on-startup
>
0
</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
action
</
servlet-name
>
<
url-pattern
>
*.do
</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
struts-config.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"
>
<
struts-config
>
<
data-sources
/>
<
form-beans
>
<
form-bean
name
="reportBaseForm"
type
="com.sjtu.wgq.framework.controller.ReportBaseActionForm"
>
</
form-bean
>
</
form-beans
>
<
global-exceptions
/>
<
global-forwards
/>
<
action-mappings
>
<
action
name
="reportBaseForm"
path
="/reportBaseAction"
type
="org.springframework.web.struts.DelegatingActionProxy"
>
<
forward
name
="success"
path
="/success.jsp"
></
forward
>
<
forward
name
="fail"
path
="/fail.jsp"
></
forward
>
</
action
>
</
action-mappings
>
<
message-resources
parameter
="com.sjtu.wgq.framework.ApplicationResources"
/>
<
plug-in
className
="org.springframework.web.struts.ContextLoaderPlugIn"
>
<
set-property
property
="contextConfigLocation"
value
="/WEB-INF/action-servlet.xml"
/>
</
plug-in
>
</
struts-config
>
action-servlet.xml
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<!
DOCTYPE beans PUBLIC
"
-//SPRING//DTD BEAN//EN
"
"
http://www.springframework.org/dtd/spring-beans.dtd
"
>
<
beans
>
<
bean name
=
"
/reportBaseAction
"
class
=
"
com.sjtu.wgq.framework.controller.ReportBaseAction
"
></
bean
>
</
beans
>
applicationContext.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
<
bean
id
="dataSource"
class
="org.springframework.jdbc.datasource.DriverManagerDataSource"
>
<
property
name
="driverClassName"
value
="oracle.jdbc.driver.OracleDriver"
>
</
property
>
<
property
name
="url"
value
="jdbc:oracle:thin:@IP:端口:SIN"
>
</
property
>
<
property
name
="username"
value
=""
></
property
>
<
property
name
="password"
value
=""
></
property
>
</
bean
>
</
beans
>
applicatoinContext-dao.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
<
bean
id
="userDAO"
class
="com.sjtu.wgq.dao.jdbc.UserJdbcTemplateDAO"
>
<
property
name
="dataSource"
>
<
ref
bean
="dataSource"
/>
</
property
>
</
bean
>
</
beans
>
UserDAO.java
public
interface
UserDAO
...
{
public
List getUser(String uid);
}
User.java
public
class
User
...
{
String name;
String pwd;
public
String getName()
...
{
return
name;
}
public
void
setName(String name)
...
{
this
.name
=
name;
}
public
String getPwd()
...
{
return
pwd;
}
public
void
setPwd(String pwd)
...
{
this
.pwd
=
pwd;
}
}
UserJdbcTemplateDAO.java
public
class
UserJdbcTemplateDAO
extends
JdbcDaoSupport
implements
UserDAO
...
{
public
List getUser(String uid)
...
{
if
(uid
!=
null
&&
!
uid.equals(
""
))
...
{
String sql
=
"
select ba.USER_ID id ,ba.PSWD_NO no from Ba.Ba9040 ba where ba.USER_ID=
"
+
uid;
//
this.getJdbcTemplate().queryForList(sql);
return
this
.getJdbcTemplate().query(sql,
new
UserRowMapper());
}
return
null
;
}
private
class
UserRowMapper
implements
RowMapper
...
{
public
Object mapRow(ResultSet rs,
int
index)
throws
SQLException
...
{
User user
=
new
User();
user.setName(rs.getString(
"
id
"
));
user.setPwd(rs.getString(
"
no
"
));
return
user;
}
}
}
ReportBaseAction.java
public
abstract
class
BaseAction
extends
ActionSupport {
/**
继承与ActionSupport,
*
@see
org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public
final
ActionForward execute(ActionMapping mapping,ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
ApplicationContext ctx
=
this
.getWebApplicationContext();
//
Spring完成注入和初始化.
UserDAO userDao
=
(UserDAO)ctx.getBean(
"
UserDAO
"
);
//
调用UserDAO接口声明的方法.
//
userDAO.getUser("1");
}
}
ActionForm的部分就省略了.
另外提一下就是,ActionSupport的getWebApplicatoinContext()方法载入的xml文件,是要在web.xml的<
context-param
>声明的,否则如果只在struts-config.xml声明会找不到的.因为两个声明的不是一个概念,在
getWebApplicatoinContext是通过servlet.getContext 的方法找到的,而在struts-config.xml配置的只是action-servlet.xml,即action的内容.具体原因,我还没有去查.
另外就是关于多个applicationContext的问题,可以参考web.xml的配置就可以了.
还有,applicationContext-dao.xml中的UserDao引用了dataSource,因为不在同一文件中,所以用<bean ref="">的格式,如果在同一文件可以用<bean local="">来引用.
通过Spring,使得Struts更加灵活,JDBC的配置很简单,但配置文件多,而且因为applicatonContext配置不正确的话,web工程是无法启动的,报linstener的错误,但不会具体指出是什么错.
还有以下问题要看看资料:
1,为什么在plugin里配置的xml,无法在getWebApplication中得到,按道理应该是一致的,因为都是通过actoinservlet去取得信息.
2,RequestProcessor具体是怎么工作的.
下次把<程序员面试指南>的体会说一下.
分享到:
相关推荐
Struts1、Spring 2.5.6 和 JDBC 是经典的Java Web开发技术组合,它们各自在应用程序架构中扮演着不同的角色。Struts1是MVC(Model-View-Controller)框架,Spring则是一个全面的轻量级应用框架,而JDBC(Java ...
【标题】"struts+spring+jdbc学生选课系统"是一个基于J2EE架构的Web应用程序,它利用了Java技术栈中的Struts、Spring和JDBC来实现学生的选课功能。Struts作为MVC框架负责处理请求和视图展示,Spring则通过其...
### Struts+Spring+Jdbc集成开发步骤详解 在当今的软件开发领域,尤其是Web应用开发,集成多种框架和技术已成为常态。Struts、Spring和Jdbc的集成是其中的一个经典组合,它们各自的优势互补,共同构建出高效、可...
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
1. **配置文件**:如struts.xml、spring配置文件(可能包含applicationContext.xml和struts-spring.xml)、ibatis的配置文件(sqlMapConfig.xml)。 2. **实体类(Entity)**:表示数据库中的表结构。 3. **Mapper...
【标题】"经典bbs源码(struts+spring+jdbc)"是一个基于Java技术的Web应用程序,它展示了如何利用Struts、Spring和JDBC这三个关键组件构建一个论坛系统。Struts是MVC(Model-View-Controller)设计模式的一个实现,...
在《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》架构讲解的过程中,穿插介绍了JDBC、Log4j、Sitemesh、JUnit技术。 随书附赠光盘内容包括《开发者突击:Java Web主流框架整合开发(J2EE+...
Struts2、Spring2.5、JDBC、Ext和JSON是构建现代企业级Java应用程序的重要技术组件。在本文中,我们将深入探讨这些技术的核心概念、它们如何协同工作以及在实际项目中的应用。 **Struts2** 是一个基于MVC(模型-...
学生成绩管理struts+spring+jdbc+mysql.zip 运行效果: https://www.bilibili.com/video/BV14P4y1t7VT
### Struts+Spring+Ibatis整合框架搭建配置详解 在当今复杂的软件开发环境中,整合不同的框架以构建高效、可维护的应用程序变得尤为重要。Struts、Spring与Ibatis(现称MyBatis)作为三个功能互补的Java框架,它们...
Spring还提供了大量模块,如Spring MVC、Spring JDBC和Spring ORM,其中Spring ORM与Hibernate整合,使得ORM操作更加方便。 Hibernate作为ORM框架,使得Java开发者可以使用面向对象的方式来操作数据库,而无需编写...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们各自负责应用程序的不同层面,共同构建了一个灵活且强大的企业级应用开发解决方案。这里,我们深入探讨这三个框架以及它们如何协同工作。 **Struts框架...
1)JSP+javabean+DAO(Ajax:anywhere) 2)Struts+spring+hibernate3(AJax:DOJO) 3)JSF+richfaces+seam+EJB 总共3个完整的实例,并配有需求分析~~~~~~~~,绝对经典!
Struts2、Spring 2.5、JDBC、Ext 和 JSON 是 Java Web 开发中常见的技术栈,它们各自承担着不同的职责,共同构建了一个功能强大的应用程序。在这个实例中,我们看到的是一个集成这些技术的库文件集合。接下来,我们...
Struts2+Spring+JDBC+MySQL 搭建指南 Struts2 是一个基于MVC 模式的Web 应用程序框架,它提供了一个灵活、可扩展的架构,用于构建复杂的Web 应用程序。为了搭建一个 Struts2+Spring+JDBC+MySQL 环境,需要先集成 ...
在Struts2+Spring+MyBatis的架构中,MyBatis负责与数据库交互,通过XML或注解方式配置SQL语句,使得数据库操作更加灵活且易于维护。 **整合过程** 1. **配置Spring**:创建Spring配置文件,定义Bean,包括Action、...
Struts2、Spring和JDBC是Java开发中常用的三大框架,它们在Web应用开发中扮演着重要的角色。这里我们详细探讨一下这三个框架以及它们的整合。 Struts2 是一个基于MVC(Model-View-Controller)设计模式的开源JavaEE...
**SSI(Struts + Spring + Maven + MyBatis)整合详解** 在现代Java Web开发中,集成多种框架来实现高效、灵活的应用程序架构是常见的做法。`SSI`整合,即Struts、Spring、Maven和MyBatis的组合,旨在提供一个强大...