在《DWR框架的使用》文章介绍DWR的基本概述与基本的配置。
这次花了一点时间实现了一个Struts2+Spring+Hibernate+DWR实现的城市联动的小项目,感觉很实用。
根据MVC分层结构:我分成了几个包:dao、entity、common、service、action
0、需要的数据库表(SQL Server):
create table province
(
province_id int primary key,
province_name varchar(30)
)
go
create table city
(
city_id int primary key,
city_name varchar(30),
province_id int
)
go
truncate table province
insert into province values(1,'四川省')
insert into province values(2,'河北省')
insert into province values(3,'山东省')
go
insert into city values(1,'成都',1)
insert into city values(2,'自贡市',1)
insert into city values(3,'泸州',1)
go
insert into city values(4,'石家庄',2)
insert into city values(5,'唐山市',2)
insert into city values(6,'秦皇岛',2)
go
insert into city values(7,'济南市',3)
insert into city values(8,'青岛市',3)
insert into city values(9,'淄博市',3)
go
select * from city
go
1.CityDAO.java代码如下:
package com.alex.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.alex.entity.City;
//Spring为Hibernate的DAO提供工具类:HibernateDaoSupport,本类只需继承他实现DAO,Hibernate Session的管理完全不需要Hibernate代码打开,而由Spring来管理。Spring会根据实际的操作,采用“每次事务打开一次session”的策略,自动提高数据库访问的性能。
public class CityDAO extends HibernateDaoSupport {
public List<City> getCityList(Integer provinceId){
Session session =this.getSession();
Query query =session.createQuery("from City where provinceId=?");
query.setParameter(0, provinceId);
List<City> cityList=query.list();
return cityList;
}
}
2.ProvinceDAO.java代码如下:
package com.alex.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.alex.entity.Province;
public class ProvinceDAO extends HibernateDaoSupport {
//在jsp页面上初始化得到全部省的信息
public List<Province> getAllProvinceList() {
Session session =this.getSession();
Query query =session.createQuery("from Province");
List<Province> provinceList= query.list();
return provinceList;
}
}
3.用Hibernate向导生成的实体省略不写(大家根据向导实现Hibernate生成表的对应的实体对象)
4.ProvinceService.java代码如下:
package com.alex.service;
import java.util.List;
import com.alex.dao.CityDAO;
import com.alex.dao.ProvinceDAO;
import com.alex.entity.City;
import com.alex.entity.Province;
//实现业务操作得到数据并将返回出去
public class ProvinceService {
CityDAO cityDAO; // 定义一个CityDAO引用对象, 在Spring的设值注入要注入这里要定义的成员变量,提供给setter和getter方法。
ProvinceDAO provinceDAO;
public CityDAO getCityDAO() {
return cityDAO;
}
public void setCityDAO(CityDAO cityDAO) {
this.cityDAO = cityDAO;
}
public ProvinceDAO getProvinceDAO() {
return provinceDAO;
}
public void setProvinceDAO(ProvinceDAO provinceDAO) {
this.provinceDAO = provinceDAO;
}
public List<Province> getAllProvinceList() {
return this.provinceDAO.getAllProvinceList();
}
public List<City> getCityList(Integer provinceId){
return this.cityDAO.getCityList(provinceId);
}
}
5.ProvinceAction.java代码如下:
package com.alex.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.alex.entity.City;
import com.alex.entity.Province;
import com.alex.service.ProvinceService;
public class ProvinceAction extends ActionSupport {
private static final long serialVersionUID = 1L;
//定义ProvinceService一个成员变量,在Spring中配置相关的信息
ProvinceService provinceService;
public ProvinceService getProvinceService() {
return provinceService;
}
public void setProvinceService(ProvinceService provinceService) {
this.provinceService = provinceService;
}
//初始化省的数据信息方法
public String initMyProvince() {
HttpServletRequest request=ServletActionContext.getRequest();
List<Province> provinceList=provinceService.getAllProvinceList();
Integer provinceId=provinceList.get(0).getProvinceId();
List<City> cityList=provinceService.getCityList(provinceId);
request.setAttribute("provinceList", provinceList);
request.setAttribute("cityList", cityList);
return "success";
}
}
6、把applicationContext.xml放到工程src资源文件下,并实现相应的配置:
<?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">
<!-- 在spring-framework-2.0.3/samples/petclinic示例工程里的第四个工程里的applicationContext-hibernate.xml
里找到此配置项拷贝到这里面,然后在进行配置
得到session对象要配置的bean在DAO层之间this.getSession()就可以得到session对象-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 在DAO层要用到事务处理bean配置(打开事务、提交事务) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 在spring-framework-2.0.3/samples/jpetstore示例工程里的第三个过程里的applicationContext.xml里找到配置项拷贝到这里面,然后在进行配置-->
<!-- 将事务通知advice和切面pointcut组合起来(哪些类的哪些方法参与事务) -->
<aop:config>
<aop:advisor pointcut="execution(* com.alex.service.*.*(..))" advice-ref="txAdvice"/>
</aop:config>
<!-- 通过<tx:advice>定义事务通知,配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*"/>
<tx:method name="insert*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="remove*"/>
<tx:method name="select*"/>
<tx:method name="get*"/>
</tx:attributes>
</tx:advice>
<!-- 设值注入配置 -->
<bean id="userInfoDAO" class="com.alex.dao.UserInfoDAO">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="cityDAO" class="com.alex.dao.CityDAO">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="provinceDAO" class="com.alex.dao.ProvinceDAO">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userInfoService" class="com.alex.service.UserInfoService">
<property name="userInfoDAO" ref="userInfoDAO" />
</bean>
<bean id="provinceService" class="com.alex.service.ProvinceService">
<property name="provinceDAO" ref="provinceDAO" />
<property name="cityDAO" ref="cityDAO" />
</bean>
<bean id="ProvinceAction" class="com.alex.action.ProvinceAction">
<property name="provinceService" ref="provinceService" />
</bean>
</beans>
7、struts.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<!-- 把struts让spring框架 管理-->
<constant name="struts.objectFactory" value="spring" />
<package name="example" extends="struts-default">
<!-- 动态方法配置 -->
<action name="province_*" class="ProvinceAction" method="{1}">
<result name="success">/province.jsp</result>
</action>
</package>
</struts>
8、web.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>test.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- dwr的配置项 -->
<servlet>
<servlet-name>DWRServlet</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DWRServlet</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
9、dwr.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<!-- dwr的配置文件 -->
<dwr>
<allow>
<!-- 结合Spring配置的城市联动项目项 -->
<create creator="spring" javascript="ProvinceService">
<param name="beanName" value="provinceService" />
<param name="location" value="applicationContext.xml" />
</create>
<convert converter="bean" match="com.alex.entity.City" />
<!-- 因为参数和返回值中包含有对象javabean,所以需要以下两项来进行配置,而List,Set或者Map中的元素均为简单类型(包括封装类)
或者String、Date、数组和集合,
则需要<convert>标签 -->
<!--
<convert converter="bean" match="" />
-->
</allow>
</dwr>
10、最难就是在jsp页面上写javaScript代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>城市查看器页面</title>
<script type="text/javascript" src="dwr/interface/ProvinceService.js"></script>
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/util.js"></script>
</head>
<body>
<h3 align="center">城市查看器</h3>
<hr>
<!-- 写JavaScript难点 -->
<script type="text/javascript">
function callTestMethod(){
var provinceSelect=document.getElementById("province");
var provinceId=provinceSelect.value;
ProvinceService.getCityList(provinceId,callBackFortestMethod);
}
function callBackFortestMethod(cityArray){
var city=document.getElementById("city");
//清空下拉菜单里的原有数据
city.options.length = 0;
var option;
//遍历所有的城市
for(var i=0;i<cityArray.length;i++){
option = new Option(cityArray[i].cityName,cityArray[i].cityId)
city.options.add(option);
}
}
</script>
<!-- onblur=""是焦点移除而触发的事件 onfocus=""是焦点移进而触发的事件-->
<select name="province" id="province" onchange="callTestMethod()">
<c:forEach items="${requestScope.provinceList}" var="province">
<option value="${province.provinceId}">${province.provinceName}
</c:forEach>
</select>
<select name="city" id="city">
<c:forEach items="${requestScope.cityList}" var="city">
<option value="${city.cityId}">${city.cityName}
</c:forEach>
</select>
<hr>
</body>
</html>
11、简单的一个城市联动效果就完成了,但是要实现这些首先还是得把Struts2+Spring+Hibernate架包导入工程里,不是每一个架包都要导进去,并不要三个Struts2+Spring+Hibernate的架包放在同一个lib文件夹,还是得区分它们,建立相应的文件夹,然后把要用到的架包放进去。要养成好的习惯(个人建议),由于工程文件比较大,不能完全上传,所以我就分开打包实现,还有可以在我上传文件找到相应的架包,还有需要的数据库表。
12、工程发布:在地址栏输入访问:
http://localhost:8080/DWRDemo/province_initMyProvince.action。
分享到:
相关推荐
综合以上,本项目通过Struts2、Spring、Hibernate和DWR的整合,构建了一个具备用户注册、多级下拉联动和表格刷新功能的Web应用。这种整合不仅提高了开发效率,也提升了用户体验,展示了Java Web开发的强大能力。在...
在校大学生网络购物情况调查报告.doc
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
训练导控系统设计.zip
员工出差流程参照网络.doc
NX建模实例-USB小风扇外形建模.pdf
内容概要:本文深入探讨了基于滑模观测器(SMO)的永磁同步电机(PMSM)负载转矩扰动控制策略。首先介绍了传统观测器在面对参数变化和外部干扰时的局限性,然后详细讲解了滑模观测器的设计与实现,包括滑模面构造、切换函数设计以及防止抖振的方法。接着,重点讨论了负载转矩估计的具体实现方法,并提供了完整的MATLAB代码示例。最后,通过仿真实验展示了滑模观测器在突加负载情况下的性能表现及其调整技巧。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其是对永磁同步电机负载转矩扰动感兴趣的读者。 使用场景及目标:适用于需要提高永磁同步电机抗负载转矩扰动能力的实际工程项目中,帮助工程师理解和掌握滑模观测器的工作原理及应用方法,从而优化电机控制系统性能。 其他说明:文中不仅提供了理论分析,还给出了详细的MATLAB代码实现,便于读者进行实验验证。同时强调了硬件因素如传感器精度和采样频率对控制效果的影响,提醒读者综合考虑软硬件条件。
PDM在汽车产品开发中的应用.pdf
工业监控数据通讯读写时序分析和优化.pdf
# 计算收益率 df['daily_return'] = df['close'].pct_change() self.data = df.dropna() return self.data def generate_signals(self): """生成交易信号""" if self.data is None: raise ValueError("请先预处理数据") df = self.data.copy().reset_index(drop=True) # 确保索引是从0开始的连续整数 df['signal'] = 0 # 0表示无信号,1表示买入,-1表示卖出 # 金叉买入,死叉卖出 df['MA_cross'] = np.where(df['MA5'] > df['MA20'], 1, 0) df['MA_cross_signal'] = df['MA_cross'].diff() # 生成买入信号(金叉) df.loc[df['MA_cross_signal'] == 1, 'signal'] = 1 # 生成卖出信号(死叉) df.loc[df['MA_cross_signal'] == -1, 'signal'] = -1 # 添加止损止盈逻辑 in_position = False entry_price = 0 stop_loss = 0 take_pr
商业银行立体教学平台软件项目三次.doc
内容概要:本文详细介绍了工业运动控制器在自动化流水线中的应用及其核心技术。首先阐述了工业运动控制器作为‘大脑’的角色,能够精确控制各种机械设备的运动,如移栽装配机械手和电子凸轮插补跟踪控制系统。接着重点讲解了自动追剪、飞剪和旋切技术的具体实现方法及其带来的生产效率提升和产品质量改善。此外,文章还探讨了流水线追随工作方式和电子凸轮插补跟踪控制系统的作用,强调了它们在确保生产线顺畅运行方面的重要意义。最后,介绍了视觉定位功能的应用,展示了其在提高生产效率和产品质量方面的巨大潜力。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对运动控制器和视觉定位感兴趣的读者。 使用场景及目标:适用于希望深入了解工业运动控制器及其相关技术在自动化流水线中具体应用的专业人士。目标是帮助读者掌握这些关键技术,从而优化生产线的设计和管理。 阅读建议:建议读者重点关注文中提到的各种技术和应用场景之间的关联,理解工业运动控制器如何通过不同技术手段实现对机械设备的精确控制,并思考如何将这些技术应用于实际工作中。
本数据库主要面向学生用户,经过对用户需求的调研与分析,明确了以下用户对数据库的要求: 学生信息:需包含学号、姓名、性别、专业等字段。 登录信息:应涵盖账号和密码。 课程信息:包括课程号、课程名、选课人数、选课容量以及任课老师等内容。 选课信息:涉及课程号与学生学号。 登录信息:包含账号和密码。 身份验证与登录:系统需为学生创建登录信息,学生在进入系统时,必须通过身份验证,只有当输入的用户名和密码均正确时,才能登录进入系统。 信息查看与操作:学生登录系统后,可以在界面中查看自己的基本信息,同时能够查看课程信息表和个人选课信息表,并且可以进行选课操作。 数据存储与读取:系统采用数据库来存储和读取数据内容。
TRIZ理论在插齿机翻转型工作台上的应用.pdf
单片机实验四报告-外中断实验.doc
SAP R-3系统在一汽大众的应用与研究.pdf
内容概要:本文详细介绍了预瞄跟踪控制算法及其在单点和多点驾驶员模型中的应用,重点讲解了如何利用MATLAB Simulink和Carsim进行联合仿真。文章首先解释了单点预瞄模型的基本原理和实现方法,接着讨论了多点预瞄模型的优势以及其实现方式。文中强调了坐标系转换的重要性,并提供了动态调整预瞄距离的经验公式。此外,文章还探讨了Stanley控制器和Pure Pursuit混合策略的应用效果,特别是在复杂路况下的表现。最后分享了一些实用的调参技巧和注意事项,如转向角单位转换等问题。 适合人群:从事汽车工程、自动驾驶研究的技术人员,尤其是对车辆动力学仿真感兴趣的工程师。 使用场景及目标:适用于需要深入了解预瞄跟踪控制算法原理并掌握其具体实现方法的研究人员和技术开发者。目标是提高车辆在不同驾驶条件下的稳定性和操控性能。 其他说明:文中不仅包含了详细的理论推导和代码实现,还有许多基于实践经验得出的小贴士,有助于读者更好地理解和应用相关技术。
内容概要:本文详细探讨了微电网优化技术及其相关算法的研究,涵盖多种优化方法和技术手段。主要内容包括:(1)使用Yalmip+Cplex进行微电网优化,涉及光伏、风电、蓄电池和电网的协调配置;(2)采用粒子群算法优化微电网及综合能源系统,通过模拟群体行为来提高能源分配效率;(3)运用多目标算法和遗传算法优化综合能源系统,兼顾经济性和环保性;(4)基于遗传算法的光伏出力预测以及风光负荷典型场景生成程序;(5)介绍拉丁超立方抽样方法及其在场景生成中的应用。每部分均配有详细的代码示例,帮助读者深入理解各算法的具体实现。 适合人群:对微电网优化技术和算法感兴趣的科研人员、工程师及相关领域的学生。 使用场景及目标:适用于希望深入了解并掌握微电网优化技术的人士,旨在提供理论指导和实际操作经验,促进可持续能源的发展。 其他说明:文中提供的代码和案例有助于读者在实践中验证所学知识,提升解决问题的能力。
基于ANSYS的拨叉的有限元分析及拓扑优化.zip