Struts2+Spring+Hibernate+DWR实现的城市联动

在《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、工程发布:在地址栏输入访问:[url]http://localhost:8080/DWRDemo/province_initMyProvince.action。[/url]
用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统。   其中用Dwr去进行用户注册的用户是否存在的验证。   全部业务控制交由Spring去进行处理。事务处理也交由Spring去管理。   压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,启动时不会出错,但使用Dwr时,会抛出异常:java.lang.NoClassDefFoundError: antlr/ANTLRException 2. antlr-2.7.2.jar  3. 4. //如果不用此包,在启动时会抛出: nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type 5. asm.jar 6. 7. // 如果不用此包,在启动时抛 出:nested exception is java.lang.NoClassDefFoundError: org/aspectj /weaver /reflect/ReflectionWorld$ReflectionWorldException 8. aspectjweaver.jar 9. 10. //如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter 11. cglib-2.1.3.jar 12. 13. //如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap 14. commons-collections-3.1.jar 15. 16. //这个似乎可以不用的 17. commons-fileupload-1.2.1.jar 18. 19. //这个就不用说啦,几乎所有框架都要使用的 20. commons-logging-1.0.4.jar 21. 22. //如果不用此包会抛出:java.lang.NoClassDefFoundError: org/dom4j/DocumentException 23. dom4j-1.6.1.jar 24. 25. //dwr必须 26. dwr.jar 27. 28. 29. //不用此包,在启动时招聘:java.lang.NoClassDefFoundError: javax/transaction/TransactionManager 30. jta.jar 31. 32. //Mysql JDBC驱动 33. mysql-connector.jar 34. 35. //Hibernate必须使用,注意此包是包含全部的。 36. hibernate3.jar 37. 38. //Spring整体包 39. spring.jar 40. 41. //struts2必须 42. freemarker-2.3.8.jar 43. //struts2必须 44. ognl-2.6.11.jar 45. //struts2核心包 46. struts2-core-2.0.11.2.jar 47. //struts2整合Spring插件 48. struts2-spring-plugin-2.0.11.2.jar 49. //struts2必须 50. xwork-2.0.5.jar   数据库设计(使用MySql数据库): Java代码 1. create table user 2. ( 3. id varchar(32) not null, 4. userName varchar(20), 5. password varchar(20), 6. primary key(id) 7. ); 8. create table user_infor 9. ( 10. id varchar(32) not null, 11. user_id varchar(32), 12. name varchar(20), 13. email varchar(30), 14. sex char, 15. age int, 16. address varchar(300), 17. primary key(id) 18. ); 19. ALTER TABLE user_infor 20. ADD FOREIGN KEY(user_id) 21. REFERENCES user(id) 22. ON DELETE CASCADE; 由于没有包含全部的Jar文件,所以朋友需要把上面所述的Jar加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值