本文中的示例采用的环境:
JDK版本1.5.0.09 NetBeans 版本5.5 Mysql版本5.0
Webwork版本2.2.5 Spring版本 ibatis版本2.3.6.77 Spring版本2.0
项目路径如下图
开始之前先配置Log4j支持,
log4j.properties位于$源代码$/log4j.properties
log4j.rootLogger=INFO,M1,R1
log4j.appender.R1=org.apache.log4j.ConsoleAppender
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.ConversionPattern=%p %-2d{yyyy-MM-dd HH:mm:ss} %c \n %m%n
开始步入:
第一步:整合Spring+webwork
本文中采用的整合方法是Spring的管理ObjectFactory的模式,
主要步骤
1.在webwork.properties中设置,位于$源代码$/webwork.properties
webwork.action.extension=jspa,action,do
webwork.objectFactory=spring
webwork.objectFactory.spring.autoWire = type
2.在web.xml中添加应用上下文监听器,位于$源代码$/web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
注意别忘记设置过滤器,使用webwork
<filter>
<filter-name>webwork</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.在xwork中添加处理的Action,xwork.xml位于$源代码$/xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.1.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="qry" extends="default" namespace="/user">
<action name="qryUser" class="com.phenix.webwork.action.qryUserAction">
<result name="success" type="dispatcher">/user/result.jsp</result>
<interceptor-ref name="params"/>
</action>
</package>
</xwork>
以上的操作以后,基本Spring和Webwork就可以一起工作了,不过本例中涉及的应用实际不是很复杂,故没有在Spring中注册bean,仅仅把Spring作为了一个Ioc容器来使用事务以及ibatis而已。
具体细节请参考
http://www.opensymphony.com/webwork/wikidocs/Spring.html
更简单的Spring+webwork整合请参考:
http://forum.iteye.com/viewtopic.php?t=9939&highlight=spring+autowire
第二部分:整合Spring和Ibatis
1.在Spring的应用上下文中配置数据库,事务,以及ibatis的配置文件位置,applicationContext.xml文件,位于$源代码$/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--通过注册PropertyPlaceholderConfigurer,来调用外部资源文件,文件中定义了数据库信息-->
<beans >
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:com/phenix/database/jdbc.properties</value>
</list>
</property>
</bean>
<!--通过BasicDataSource使用数据源-->
<bean id="dataSource" class="org.apache.commons.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>
<!--配置ibatis的资源文件载入-->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"> <value>classpath:com/phenix/ibatis/mapping/sqlMap-config.xml</value> </property>
</bean>
<!--注册事务管理Bean-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>
<!--注册DAO-->
<bean id="userDAO" class="com.phenix.ibatis.dao.UserDAO">
<property name="dataSource"> <ref local="dataSource" /> </property>
<property name="sqlMapClient"> <ref local="sqlMapClient" /> </property>
</bean>
<--注册DAO代理-->
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager" /></property>
<property name="target"><ref local="userDAO" /></property>
<!--指明事务属性-->
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
2.配置sqlMap-config.xml-0位于$源代码
$/com/phenix/ibatis/mapping/sqlMap-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="com/phenix/ibatis/mapping/User.xml" />
</sqlMapConfig>
注意,由于本例中的数据库配置在外部资源文件中,所以此时注意建立一个jdbc.properteis
位于$源代码$/com/phenix/database/jdbc.properties
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/usetest
jdbc.username = root
jdbc.password = 123
基本整合就是这2个配置文件,剩下的就开始主要代码部分
User.xml ---ibatis的sql映射文件
位于$源代码$/com/phenix/ibatis/mapping/User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="user" type="com.phenix.ibatis.action.User" />
<select id="getUserByName" parameterClass="java.lang.String" resultClass="user">
<![CDATA[
SELECT *
FROM admin
WHERE name = #name# ]]>
</select>
<select id="getUserById" parameterClass="java.lang.Integer" resultClass="user">
<![CDATA[
SELECT *
FROM admin
WHERE id = #id# ]]>
</select>
<select id="getAllUser" resultClass="java.util.ArrayList">
<![CDATA[
SELECT *
FROM admin]]>
</select>
<insert id="insertUser" parameterClass="user">
INSERT INTO admin(name,password)
VALUES(#name#,#password#)
</insert>
<update id="updateUserById" parameterClass="user">
UPDATE admin
SET name=#name# ,
password=#password#
</update>
</sqlMap>
User.java --映射对象 位于com.phenix.ibatis/action/User.java
package com.phenix.ibatis.action;
import java.io.Serializable;
public class User implements Serializable{
public User() {
}
private String password;
private String name;
private Integer Id;
public Integer getId() {
return Id;
}
public void setId(Integer Id) {
this.Id = Id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
}
UserDAO.java和IUserDAO.java---DAO接口和实现类
package com.phenix.ibatis.dao;
import com.phenix.ibatis.action.User;
import java.util.ArrayList;
public interface IUserDAO {
public ArrayList getAllUser();
public User getUserById(Integer Id);
public void insertUser(User user);
public void updateUser(User user);
public User getUserByName(String name);
}
package com.phenix.ibatis.dao;
import com.phenix.ibatis.action.User;
import java.util.ArrayList;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
public class UserDAO extends SqlMapClientDaoSupport implements IUserDAO {
public UserDAO() {
}
public ArrayList getAllUser() {
return (ArrayList)getSqlMapClientTemplate().queryForList("getAllUser","");
}
public User getUserById(Integer Id) {
return (User)getSqlMapClientTemplate().queryForObject("getUserById",Id);
}
public User getUserByName(String name)
{
return (User)getSqlMapClientTemplate().queryForObject("getUserByName",name);
}
public void insertUser(User user) {
getSqlMapClientTemplate().insert("insertUser",user);
}
public void updateUser(User user) {
getSqlMapClientTemplate().update("updateUser",user);
}
}
QryUserAction.java---具体实现交互的Action
public class QryUserAction implements Action{
private String params;
private String qryType;
private User user;
private ArrayList userList;
/**
* Creates a new instance of QryUserAction
*/
public QryUserAction() {
}
static Logger logger = Logger.getLogger(QryUserAction.class);
public String execute() throws Exception
{
//获取应用上下文
ApplicationContext factory = (ApplicationContext)ActionContext.getContext().getApplication().get(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
//获取Bean
IUserDAO userDAO = (IUserDAO)factory.getBean("userDAOProxy");
//根据提交过来的参数,选择按Id还是按照Name查找
if(qryType.equals("name"))
{
user = userDAO.getUserByName(params);
}
else
{
Integer id = Integer.parseInt(params);
user = userDAO.getUserById(id);
}
return SUCCESS;
}
public void setParams(String params)
{
this.params=params;
}
public void setQryType(String qryType)
{
this.qryType=qryType;
}
public User getUser()
{
return user ;
}
}
"这段代码似乎并没有什么特殊,但有一个细微之处:
IUserDAO userDAO = (IUserDAO)factory.getBean("userDAOProxy");
这里并没有直接用UserDAO对获得的Bean实例进行强制转型。并非完全出自设计上的考虑,这里情况有些特殊,我们可试一下用UserDAO类对bean实例进行强制转型,不过将得到一个ssCastException,程序异常中止。
为什么会出现这样的问题?原因在于Spring的AOP实现机制,前面曾经提及,Spring中的事务管理实际上是基于AOP机制实现,为了实现动态AOP,Spring在默认情况下会使用Java DynamicPoxy,但是要求其代理的对象必须实现一个接口,该接口定义了准备代理的方法。而对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib 实现这一功能。
当UserDAO没有实现任何接口时,Spring通过CGLib对rDAO进行代理,此时getBean返回的是一个继承自UserDAO类的子类实例,可以通过UserDAO对其强制转型。而当UserDAO实现了IUserDAO接口之后,Spring将通过JavaDynamic Proxy机制实现代理功能,此时返回的Bean,是通过javaa.lang.reflect.Proxy.newProxyInstance方法创建的IUserDAO接口的一个代理实这个实例实现了IUserDAO接口,但与UserDAO类已经没有继承关系,因此无法通过UserrDAO强制转型。"
---引自夏昕《Spring开发指南》
下面是2个显示的页面文件
search.jsp位于$页面$/user/search.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询</title>
</head>
<body>
<h1>查询</h1>
<form action="qryUser.do" method="POST">
<select name="qryType">
<option value="name" selected>Name</option>
<option value="id">ID</option>
</select>
<input type="text" name="params" value="" size="12" />
<input type="submit" name="submit" value="提交" />
</form>
</body>
</html>
result.jsp--结果显示页面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title查询结果页面</title>
</head>
<body>
<h1>查询结果页面</h1>
<ww:if test="user==null">
<font color="red"> <ww:actionerror/></font>
</ww:if>
<ww:else>
用户ID:${user.id}
用户名:${user.name}
密码:${user.password}
</ww:else>
</body>
</html>
本文参考:夏昕-《Spring开发指南v0.8预览版》
《Spring2.0 reference_final》

- 大小: 10.3 KB
分享到:
相关推荐
在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
ACM动态规划模板-区间修改线段树问题模板
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
本项目为Python语言开发的PersonRelationKnowledgeGraph设计源码,总计包含49个文件,涵盖19个.pyc字节码文件、12个.py源代码文件、8个.txt文本文件、3个.xml配置文件、3个.png图片文件、2个.md标记文件、1个.iml项目配置文件、1个.cfg配置文件。该源码库旨在构建一个用于表示和查询人物关系的知识图谱系统。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
rtsp实时预览接口URL:/evo-apigw/admin/API/MTS/Video/StartVideo HLS、FLV、RTMP实时预览接口方式 :接口URL/evo-apigw/admin/API/video/stream/realtime 参数名 必选 类型 说明 data true string Json串 +channelId true string 视频通道编码 +streamType true string 码流类型:1=主码流, 2=辅码流,3=辅码流2 +type true string 协议类型:hls,hlss,flv,flvs,ws_flv,wss_flv,rtmp hls:http协议,m3u8格式,端口7086; hlss:https协议,m3u8格式,端口是7096; flv:http协议,flv格式,端口7886; flvs:https协议,flv格式,端口是7896; ws_flv:ws协议,flv格式,端口是7886; wss_flv:wss协议,flv格式,端口是7896; rtmp:rtmp协议,端口是1975;
Simulink永磁风机飞轮储能系统二次调频技术研究:频率特性分析与参数优化,Simulink永磁风机飞轮储能二次调频技术:系统频率特性详解及参数优化研究参考详实文献及两区域系统应用,simulink永磁风机飞轮储能二次调频,系统频率特性如下,可改变调频参数改善频率。 参考文献详细,两区域系统二次调频。 ,核心关键词: 1. Simulink 2. 永磁风机 3. 飞轮储能 4. 二次调频 5. 系统频率特性 6. 调频参数 7. 改善频率 8. 参考文献 9. 两区域系统 以上关键词用分号(;)分隔,结果为:Simulink;永磁风机;飞轮储能;二次调频;系统频率特性;调频参数;改善频率;参考文献;两区域系统。,基于Simulink的永磁风机与飞轮储能系统二次调频研究:频率特性及调频参数优化
MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照展示,MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照图展示,MATLAB驱动防滑转模型ASR模型 ASR模型驱动防滑转模型 ?牵引力控制系统模型 选择PID控制算法以及对照控制算法,共两种控制算法,可进行选择。 选择冰路面以及雪路面,共两种路面条件,可进行选择。 控制目标为滑移率0.2,出图显示车速以及轮速对照,出图显示车辆轮胎滑移率。 模型简单,仅供参考。 ,MATLAB; ASR模型; 防滑转模型; 牵引力控制系统模型; PID控制算法; 对照控制算法; 冰路面; 雪路面; 控制目标; 滑移率; 车速; 轮速。,MATLAB驱动的ASR模型:PID与对照算法在冰雪路面的滑移率控制研究
芯片失效分析方法介绍 -深入解析芯片故障原因及预防措施.pptx
4131_127989170.html
内容概要:本文提供了一个全面的PostgreSQL自动化部署解决方案,涵盖智能环境适应、多平台支持、内存与性能优化以及安全性加强等重要方面。首先介绍了脚本的功能及其调用方法,随后详细阐述了操作系统和依赖软件包的准备过程、配置项的自动生成机制,还包括对实例的安全性和监控功能的强化措施。部署指南给出了具体的命令操作指导,便于新手理解和执行。最后强调了该工具对于不同硬件条件和服务需求的有效应对能力,特别是针对云计算环境下应用的支持特点。 适合人群:对PostgreSQL集群运维有一定基础并渴望提高效率和安全性的数据库管理员及工程师。 使用场景及目标:本脚本能够帮助企业在大规模部署时减少人工介入时间,确保系统的稳定性与高性能,适用于各类需要稳定可靠的数据库解决方案的企业或机构,特别是在大数据量和高并发事务处理场合。 其他说明:文中还提及了一些高级功能如自动备份、流复制等设置步骤,使得该方案不仅可以快速上线而且能满足后续维护和发展阶段的要求。同时提到的技术性能数据也为用户评估其能否满足业务需求提供了直观参考。
房地产开发合同[示范文本].doc
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
工程技术承包合同[示范文本].doc
蓝桥杯开发赛【作品源码】
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!