在《DWR框架的使用》文章介绍DWR的基本概述与基本的配置。
这次花了一点时间实现了一个Struts2+Spring+Hibernate+DWR实现的城市联动的小项目,感觉很实用。
根据MVC分层结构:我分成了几个包:dao、entity、common、service、action
0、需要的数据库表(SQL Server):
1.CityDAO.java代码如下:
2.ProvinceDAO.java代码如下:
3.用Hibernate向导生成的实体省略不写(大家根据向导实现Hibernate生成表的对应的实体对象)
4.ProvinceService.java代码如下:
5.ProvinceAction.java代码如下:
6、把applicationContext.xml放到工程src资源文件下,并实现相应的配置:
7、struts.xml文件配置如下:
8、web.xml配置如下:
9、dwr.xml配置如下:
10、最难就是在jsp页面上写javaScript代码:
11、简单的一个城市联动效果就完成了,但是要实现这些首先还是得把Struts2+Spring+Hibernate架包导入工程里,不是每一个架包都要导进去,并不要三个Struts2+Spring+Hibernate的架包放在同一个lib文件夹,还是得区分它们,建立相应的文件夹,然后把要用到的架包放进去。要养成好的习惯(个人建议),由于工程文件比较大,不能完全上传,所以我就分开打包实现,还有可以在我上传文件找到相应的架包,还有需要的数据库表。
12、工程发布:在地址栏输入访问:[url]http://localhost:8080/DWRDemo/province_initMyProvince.action。[/url]
这次花了一点时间实现了一个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]