`
MySSH
  • 浏览: 64183 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

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

    博客分类:
  • SSH
阅读更多
在《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。
  • dwr.jar (1.1 MB)
  • 下载次数: 98
3
1
分享到:
评论
1 楼 ytzhsh 2010-06-28  
我可以标记一下,明天好好看

相关推荐

    Struts2 + spring + hibernate + dwr 完美整合代码

    Struts2 + spring + hibernate + dwr 完美整合代码 dwr 用户注册 多级下拉联动 刷新表格.. 全部代码

    DWR+Struts+Hibernate+Spring 三级联动菜单

    DWR+Struts+Hibernate+Spring 做的三级联动菜单,动态的,带测试文件,把关系包复制到WebRoot下lib就可以运行!

    如何使用dwr进行联动

    Struts+Spring+Hibernate+dwr 实现省市区三级联动

    DWR 实现三级联动(2)

    选择一个商品大类,然后为商品小类填充数据,选择小类后则商品品牌列表会自动填充数据 项目是由Struts2+spring2+hibernate3构架 Struts2自带的只有二级连动下拉菜单,而且效率较低

    DWR 实现三级联动(1)

    选择一个商品大类,然后为商品小类填充数据,选择小类后则商品品牌列表会自动填充数据 项目是由Struts2+spring2+hibernate3构架 Struts2自带的只有二级连动下拉菜单,而且效率较低!

    DWR实现三级联动.pdf

    dwr:direct web remoting 是我们通过javascript方便的操作业务...我用到的技术有spring 2.0.5 ,dwr2.0.5,hibernate3.2.3.ga,struts1.2.9,主要涉及到dwr如何调用spring管理的业务方法,以及dwr如何处理返回的数据。

    SSH+dwr实现三级级联动-转自Ajava

    SSH+dwr实现三级级联动,从Ajava下载的,所以共享一下 由于CSDN上传限制,所以ssh的jar包让我给删掉了

Global site tag (gtag.js) - Google Analytics