本文中的示例采用的环境:
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)的概念及其在...
内容概要:本文详细介绍了如何使用C#开发一个SMT贴片机的轨迹导入程序,该程序能够解析CAD设计的DXF文件并将其中的轨迹转换为适用于SMT设备的G代码。主要内容涵盖DXF文件的读取与解析、LWPOLYLINE的提取、坐标转换、G代码生成以及保存。此外,文中还探讨了一些实际应用中的注意事项,如坐标系转换、插补算法的选择和错误处理方法。通过具体的代码示例展示了如何利用netDxf库简化DXF文件的操作,并提供了路径优化和Z轴控制的具体实现。 适合人群:从事SMT行业或相关领域的工程师和技术人员,尤其是有一定C#编程基础并对数控编程感兴趣的开发者。 使用场景及目标:①将CAD设计的DXF文件高效转化为SMT设备所需的G代码;②确保生成的G代码能够在实际设备上正确执行,提高生产效率和准确性;③解决坐标系转换、插补算法选择等问题,增强程序的鲁棒性和实用性。 其他说明:建议在真实设备运行前先用CAM软件进行仿真测试,同时注意处理好文件读取和数值转换中的异常情况。
内容概要:本文详细介绍了基于西门子S7-1200 PLC的物流仓储自动化系统,涵盖了硬件架构、通信处理、运动控制算法、触摸屏交互等多个方面的内容。硬件上,采用S7-1217C处理器、G120变频器、ET200S远程站和激光测距传感器构建了一个精密的空间坐标定位体系。通信部分利用Profinet和RS485进行数据传输,并通过SCL和STL编写了多种实用的功能块,如急停处理、温漂补偿、路径优化等。运动控制方面,通过速度梯形图与S型曲线结合的方式实现高精度定位。触摸屏界面则通过WinCC Advanced实现报警记录和货位状态显示等功能。 适合人群:从事物流仓储自动化系统设计、开发和维护的技术人员,尤其是熟悉西门子PLC编程的工程师。 使用场景及目标:适用于需要高精度、高可靠性的物流仓储自动化项目的开发和调试。主要目标是提高系统的响应速度、定位精度和稳定性,确保设备能够长时间稳定运行。 其他说明:文中提供了大量实际代码片段和技术细节,帮助读者更好地理解和应用相关技术。此外,还分享了一些现场调试的经验和技巧,如温漂补偿、通信优化等。
新5
内容概要:本文详细介绍了如何利用MATLAB的Fuzzy工具箱实现驾驶员制动意图的识别。文中首先解释了模糊控制的基本概念及其在处理不确定性和模糊性方面的优势。随后,通过具体的MATLAB代码示例展示了如何构建模糊推理系统(FIS),包括定义输入输出变量、隶属函数以及规则库。此外,还讨论了实际应用中的优化措施,如调整隶属函数参数和引入多输入变量以提高系统的鲁棒性和准确性。最后,通过对比实验验证了模糊控制相比传统方法在响应时间和识别精度上的优越性。 适合人群:从事自动驾驶或智能辅助驾驶系统研究的技术人员,尤其是对模糊控制算法感兴趣的开发者。 使用场景及目标:适用于需要精确识别驾驶员制动意图的应用场合,如高级驾驶辅助系统(ADAS)、自动驾驶车辆的安全控制模块等。主要目标是提高系统的智能化水平,增强行车安全性。 其他说明:文中提供的代码片段和实验数据有助于读者深入理解模糊控制的工作机制,并为实际项目开发提供参考。同时,强调了参数调整的重要性,指出模糊控制并非万能解决方案,需结合具体应用场景进行优化。
内容概要:本文详细介绍了三菱PLC QD75模块FB功能块在伺服电机控制中的应用。首先阐述了选择FB功能块的原因,即编程方式清晰明了,便于维护和修改。接着展示了关键代码及其分析,包括输入输出变量、中间变量、初始化、运动参数设置、当前位置监控、目标位置判断以及错误处理等方面的内容。文中还提供了多个实用技巧,如速度切换判断、状态监控、错误处理、调试方法等。此外,文章强调了这套程序的适用范围和借鉴意义,尤其适合初学者作为模板进行项目级开发。 适合人群:具备一定PLC编程基础,尤其是三菱PLC初学者和项目级开发者。 使用场景及目标:①帮助读者理解三菱PLC QD75模块FB功能块的工作原理;②提供一个成熟的伺服电机控制程序模板,供读者在实际项目中参考和改进;③提高程序的可维护性和可靠性。 其他说明:文章不仅提供了详细的代码示例和注释,还分享了许多实际应用中的经验和技巧,有助于读者更好地理解和应用这些知识。
少儿编程scratch项目源代码文件案例素材-恶魔的冒险 Level Devil.zip
少儿编程scratch项目源代码文件案例素材-鬼影斩.zip
Node-Webkit Javascript (NW.js)
内容概要:本文详细介绍了基于UDS(Unified Diagnostic Services)协议的Bootloader的设计与实现,涵盖其多协议支持(XCP、CCP、UDS)、AUTOSAR兼容性、多版本选择(ILLD和MCAL)、广泛硬件平台支持(如TC系列芯片)以及CAN FD的支持。文中不仅提供了上位机和下位机的代码示例,还展示了具体的测试用例,确保Bootloader的功能正确性和稳定性。此外,文章探讨了Bootloader在汽车电子和工业控制系统中的应用场景,强调了其重要性和灵活性。 适合人群:从事汽车电子、嵌入式系统开发的技术人员,尤其是那些需要深入了解Bootloader工作机制和实现细节的人群。 使用场景及目标:适用于需要开发或维护汽车电子控制单元(ECU)的团队,旨在提高系统的可靠性和性能。目标包括但不限于:实现高效的数据传输、确保诊断服务的准确性、优化刷写速度、增强系统的安全性等。 其他说明:文章提供了丰富的代码示例和技术细节,帮助读者更好地理解和应用基于UDS的Bootloader。同时,针对不同硬件平台和应用场景,给出了具体的配置建议和注意事项。
esp32串口接收tcp发送代码
少儿编程scratch项目源代码文件案例素材-蝗虫群怪 Boss 战.zip
少儿编程scratch项目源代码文件案例素材-放射性南瓜田.zip
少儿编程scratch项目源代码文件案例素材-格林奇 Boss 大战.zip
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!
内容概要:本文详细介绍了使用MATLAB进行QPSK调制信号通过AWGN信道的误符号率(SER)和误比特率(BER)性能分析的方法。主要内容包括参数设置、随机比特流生成、Gray编码映射、AWGN信道建模、噪声功率计算、解调过程以及误码率统计。文中还讨论了一些常见的实现陷阱和技术细节,如Gray编码的正确实现、噪声方差的计算方法、信噪比转换等。通过仿真与理论值对比,展示了QPSK调制在不同信噪比下的性能表现。 适合人群:通信工程专业学生、通信系统开发者、MATLAB爱好者。 使用场景及目标:适用于希望深入了解QPSK调制原理及其在AWGN信道下的性能分析的研究人员和工程师。通过动手实践,可以掌握QPSK调制的基本原理、MATLAB编程技巧以及通信系统的性能评估方法。 其他说明:文中提供了详细的MATLAB代码片段,帮助读者更好地理解和实现QPSK调制的性能分析。此外,还提到了一些优化建议,如增加仿真次数以提高低信噪比区域的精度。
内容概要:本文详细介绍了六轴EtherCAT总线伺服涂布收卷机程序的实现过程。该系统通过六个伺服电机、变频器和编码器的配合,实现了动态测量频率、转速计算、频率换算与速度同步以及通讯控制等功能。文中提供了具体的代码示例,如Python、C/C++和ST语言代码片段,用于解释如何进行频率测量、转速换算、变频器频率设置和EtherCAT通讯控制。此外,还讨论了实际应用中的常见问题及其解决方案,如通讯延迟处理、异常处理和参数配置等。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对EtherCAT总线技术和伺服控制系统有一定了解的人群。 使用场景及目标:适用于需要高精度同步控制的工业应用场景,如涂布工艺和收卷环节。目标是帮助读者理解和实现六轴EtherCAT总线伺服涂布收卷机系统的协同工作,提高生产效率和稳定性。 其他说明:文章不仅提供了详细的代码实现,还分享了许多实际调试经验和技巧,有助于读者更好地应对实际工程中的挑战。
内容概要:本文详细介绍了如何利用COMSOL软件中的水平集方法进行激光打孔的模拟。首先,构建了几何模型并设置了材料参数,包括温度依赖的导热系数、密度和比热容等。接着,定义了高斯分布的激光热源,并引入了水平集方程来追踪熔池界面的变化。文中强调了网格划分、时间步长设置以及多物理场耦合的重要性,特别是在处理等离子体屏蔽效应时。最后,讨论了后处理步骤,如导出切割线数据、验证网格独立性和与实验数据对比等。 适合人群:从事精密加工领域的研究人员和技术人员,尤其是那些熟悉COMSOL软件并对激光打孔感兴趣的用户。 使用场景及目标:适用于希望深入了解激光打孔过程中涉及的各种物理现象的研究人员,帮助他们优化工艺参数,提高加工精度。同时,也为教学提供了一个很好的案例,使学生能够掌握复杂的多物理场耦合仿真技术。 其他说明:文中提供了大量具体的MATLAB代码片段,便于读者理解和实践。此外,作者还分享了一些实用的小技巧,如如何避免数值震荡、选择合适的初始参数等。
APK包名类名查看工具
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!