项目需要,在原来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+spring2.5.6+jdbc
经典的bbs论坛源码。struts+spring+jdbc 很适合学习借鉴。
Struts2+Spring2.5+jdbc+Ext+json实例用到的lib包。
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 系统用例图 ...
struts2+spring2.5+jdbc+ext+json实例用到的lib包。
没有用到hibernate,使用了spring里的jdbcTemplate,spring专门支持JDBC的工具类 项目比较简单吧
在《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》架构讲解的过程中,穿插介绍了JDBC、Log4j、Sitemesh、JUnit技术。 随书附赠光盘内容包括《开发者突击:Java Web主流框架整合开发(J2EE+...
ext2.1+struts2.0+spring2.5+jdbc+json做的一个小例子
有关Struts2+Spring+Hibernate和Struts2+Spring+Ibatis的整合实例demo 原创,完全基于eclipse开发
1)JSP+javabean+DAO(Ajax:anywhere) 2)Struts+spring+hibernate3(AJax:DOJO) 3)JSF+richfaces+seam+EJB 总共3个完整的实例,并配有需求分析~~~~~~~~,绝对经典!
Struts2.0+Spring2.5+JDBC 测试可用(2012-12-28)
Struts2+spring+jdbc+mysql环境搭建,适用于小型的web项目开发,舍弃hibernate,直接对mysql数据库进行应用,整个文档详细的介绍环境的搭建步骤
基于spring+struts2+springJDBC编写的轻量级项目 service、dao、action已经写了对应的demo 主要是使用spring的JdbcTemplate和TransactionTemplate
上传了一个Struts+JDBC+Spring的一个jar包。希望能对有需要的人有用一些。
struts2.3.4+spring3.1.1+jdbcTemplate为了学习而搭建的小例子,里面用到了spring3.1原生的Cache,日志暂时没加入,整个例子全部使用注解
《Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)》全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。第1篇为入门篇,内容包括Java Web开发概述等;第2篇...
购物车用ssh框架开发,服务器,tomcat,db,oracle.ssh开发的典型例子,可供参考学习之用
项目中整合了目前主流的框架和组件 高压缩的源码包 用RAR解压 手动加入各个框架的类库文件
java学习资料集合(js+jsp+jqurey+Struts2+hibernate+Spring+jdbc+java基础等)