`
MySSH
  • 浏览: 65139 次
  • 性别: 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的整合,构建了一个具备用户注册、多级下拉联动和表格刷新功能的Web应用。这种整合不仅提高了开发效率,也提升了用户体验,展示了Java Web开发的强大能力。在...

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

    此项目结合了DWR(Direct Web Remoting)、Struts、Hibernate和Spring四大技术框架,旨在创建一个动态的三级联动菜单,通过Ajax实现数据的实时更新,提高用户体验。 首先,DWR是一个强大的JavaScript库,它允许...

    DWR 实现三级联动(2)

    【DWR实现三级联动(2)】的知识点详解 DWR (Direct Web Remoting) 是一个JavaScript库,它允许Web应用程序直接与Java后端进行交互,实现Ajax功能,即在不刷新整个页面的情况下更新部分网页内容。在这个场景中,DWR...

    ssh+dwr(实现3级联)

    SSH (Struts2 + Spring + Hibernate) 和 DWR (Direct Web Remoting) 是两种常见的Java Web开发技术。在本文中,我们将深入探讨如何将这两种技术结合,实现一个三级联动的效果。 SSH是Java企业级开发中广泛应用的一...

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

    总结来说,SSH+dWR实现的三级联动是Java Web开发中的一个实用技术,结合了Spring、Struts、Hibernate的强大力量以及DWR的实时通信特性,为用户提供流畅的交互体验。在这个过程中,开发者需要理解每个框架的作用,并...

    ssh+dwr2实现省市二级联动

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而DWR(Direct Web Remoting)则是一种JavaScript与服务器端交互的技术,常用于实现AJAX功能。本篇主要讨论如何利用SSH框架和DWR来...

    DWR 实现三级联动(1)

    在本例中,我们将探讨如何使用Direct Web Remoting (DWR)框架来实现这个功能,特别是在Struts2+Spring2+Hibernate3的架构中。 首先,我们来理解DWR。DWR是一种JavaScript库,它允许Web应用在客户端和服务器之间进行...

    DWR实现三级联动.pdf

    本案例通过使用DWR实现了省市县三级联动的功能,涉及到了多个技术栈的集成应用,包括Spring、DWR、Hibernate和Struts等。通过对DWR配置、业务逻辑实现以及前后端交互过程的详细说明,展示了如何有效地利用DWR来简化...

    SSH+dwr实现三级级联

    2. **创建后台服务**:在Spring中定义业务接口和服务实现,这些服务将被DWR调用,用于获取各级别数据。 3. **编写Action类**:Struts的Action类负责接收用户的请求,调用Spring服务,并将返回的结果封装成Action...

    如何使用dwr进行联动

    本文将介绍如何使用Direct Web Remoting (DWR) 在Struts、Spring和Hibernate集成的环境中实现省市区三级联动效果。首先,我们理解DWR是一个Java库,它允许Web应用程序实现实时双向通信,即AJAX功能,使得前端...

    ajax+dwr整合

    在SSH(Spring、Struts、Hibernate)框架下,Ajax与DWR的整合可以提高Web应用的交互性和响应速度。以下是整合步骤: 1. **添加依赖**:在项目中引入DWR相关的jar包,并配置web.xml,包括DWR的Servlet配置。 2. **...

    省市级联 ssh整合实现

    这里,我们主要关注如何通过SSH(Struts、Spring、Hibernate)框架实现省市级联的功能,并结合Ajax和DWR进行异步数据交互。 **SSH整合** SSH是三个开源Java框架的组合,包括Struts作为MVC(模型-视图-控制器)框架...

    SSH_province_sql.rar_SSH_province_sql_ajax_dwr_ssh_ssh ajax

    SSH_province_sql.rar_SSH_province_sql_ajax_dwr_ssh_ssh_ajax这个标题暗示了这是一个与SSH框架(Struts2、Spring、Hibernate)结合DWR(Direct Web Remoting)实现的项目,主要涉及到了省市县三级联动的数据处理,...

Global site tag (gtag.js) - Google Analytics