dwr实现三级联动下拉框

      dwr:direct web remoting 是我们通过javascript方便的操作业务方法。我以一个三级联动下拉框的例子给大家演示dwr是如何实现的。我用到的技术有spring 2.0.5 ,dwr2.0.5,hibernate3.2.3.ga,struts1.2.9,主要涉及到dwr如何调用spring管理的业务方法,以及dwr如何处理返回的数据。

      dwr的配置:

ContractedBlock.gif ExpandedBlockStart.gif Code
<servlet>  
    
<servlet-name>dwr-invoker</servlet-name>  
    
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>  
    
<init-param>  
        
<param-name>debug</param-name>  
        
<param-value>true</param-value>  
    
</init-param>  
</servlet>  
<servlet-mapping>  
    
<servlet-name>dwr-invoker</servlet-name>  
    
<url-pattern>/dwr/*</url-pattern>  
</servlet-mapping>  

     

      我要实现的是地区,市县,社区的三级下拉,比如邯郸地区,邯郸县,明珠社区,这样的下拉框,数据库表设计是这样的:

    id   name        pid

    1    邯郸           0

    2    邯郸县        1

    3    明珠社区     2

   .....

      大家一看都明白了吧。

      那么如何实现呢?第一个下了框显示地区,数据可以从action或者servlet中去,也可以用dwr来去,我采取第二种方式。

      html代码:

      

ContractedBlock.gif ExpandedBlockStart.gif Code
<script type="text/javascript"> 
    
ExpandedBlockStart.gifContractedBlock.gif 
function initCity(){   
          
var cityObj = document.getElementById('city');   
          
var areaObj = document.getElementById('area');   
          
var street = document.getElementById('street');   
          cityObj.options[
0= new Option('请选择','-1');   
          areaObj.options[
0= new Option('请选择','-1');   
          street.options[
0= new Option('请选择','-1');   
      cityService.getBaseCities(cb);   
ExpandedSubBlockStart.gifContractedSubBlock.gif      
function cb(cities){   
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for(var i=0;i<cities.length;i++){   
          cityObj.options[cityObj.options.length] 
=    
              
new Option(cities[i].name,cities[i].id);   
        }
   
          }
    
  }
   
   
</script>   
<BODY onload="initCity();">   
城    市:   
<select id=city name=city onchange="loadArea(this);"></select>     
  

 

      注意 cityService.getBaseCities(cb); 这行代码 cityService 是dwr暴漏给javascript的对象,用它可以操作业务方法。它是怎么设置的呢?实际上我们CityService是我们业务方法,代码如下

 

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gifpublic interface ICityService {   
      
   
public List getBaseCities();   
}
   
  
ExpandedBlockStart.gifContractedBlock.gif
public class CityServiceImpl implements ICityService {   
  CityDao cityDao;   
     
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public List getBaseCities() {   
    
return cityDao.getBaseCities();   
  }
   
}
  

 

      那么javascript如何才能调用getBaseCities()方法,来填充第一个下拉框呢?

好,dwr一个重要的配置文件上演了。

dwr.xml

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">  
<dwr>  
 
<allow>      
  
<create creator="spring" javascript="cityService">      
   
<param name="beanName" value="cityService"/>      
  
</create>      
  
<convert converter="bean" match="com.secondhand.hibernate.entity.TtArea"/>  
 
</allow>      
</dwr>  

 

      allow节点下面的create 有一个属性 creator="spring" 代表我们要暴漏的服务端代码是从spring中来的。param的beanName代表根据spring配置文件配置的id来取bean,哪个bean呢? value="cityService",就是cityService这个bean. 看一下spring配置文件

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<bean id="cityService"  parent="txProxyTemplate">  
   
<property name="target">  
        
<bean class="com.secondhand.service.impl.CityServiceImpl">  
            
<property name="cityDao">  
                
<ref bean="TtAreaDAO" />  
            
</property>  
        
</bean>  
   
</property>  
</bean>  

 

      这个bean就有我们要调用的getBaseCities()方法。

那么javascript如何调用呢?

打开http://localhost:8080/项目名/dwr

点击暴漏的业务类,拷贝js引用,本例代码

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<script type='text/javascript' src='/secondhandhib/dwr/interface/cityService.js'></script>   
<script type='text/javascript' src='/secondhandhib/dwr/engine.js'></script>   
<script type='text/javascript' src='/secondhandhib/dwr/util.js'></script>  

 

      结合我上面的javascript的代码就可以用了。

 下面我贴出全部html代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
      <LINK href="css/main.css" type=text/css rel=stylesheet>   
      
<script type='text/javascript' src='/secondhandhib/dwr/interface/cityService.js'></script>   
      
<script type='text/javascript' src='/secondhandhib/dwr/engine.js'></script>   
      
<script type='text/javascript' src='/secondhandhib/dwr/util.js'></script>   
  
        
<META content="MSHTML 6.00.2900.5726" name=GENERATOR>   
           
ExpandedBlockStart.gifContractedBlock.gif        
<script type="text/javascript">   
ExpandedSubBlockStart.gifContractedSubBlock.gif          
function initCity(){   
            
var cityObj = document.getElementById('city');   
           
var areaObj = document.getElementById('area');   
            
var street = document.getElementById('street');   
          cityObj.options[
0= new Option('请选择','-1');   
          areaObj.options[
0= new Option('请选择','-1');   
          street.options[
0= new Option('请选择','-1');   
            cityService.getBaseCities(cb);   
ExpandedSubBlockStart.gifContractedSubBlock.gif            
function cb(cities){   
ExpandedSubBlockStart.gifContractedSubBlock.gif               
for(var i=0;i<cities.length;i++){   
                 cityObj.options[cityObj.options.length] 
= new Option(cities[i].name,cities[i].id);   
               }
   
            }
   
           
          }
   
ExpandedSubBlockStart.gifContractedSubBlock.gif          
function loadArea(obj){   
              
var city = $("city").value;   
              
var areaObj = document.getElementById('area');   
              
var street = document.getElementById('street');   
              cityService.getAreaBySuper(city,areaCb);   
              areaObj.length
=0;   
               street.length
=0;   
              areaObj.options[
0= new Option('请选择','-1');   
               street.options[
0= new Option('请选择','-1');   
ExpandedSubBlockStart.gifContractedSubBlock.gif              
function areaCb(areas){   
ExpandedSubBlockStart.gifContractedSubBlock.gif                 
for(var i=0;i<areas.length;i++){   
                     areaObj.options[areaObj.options.length] 
= new Option(areas[i].name,areas[i].id);   
                 }
   
              }
   
          }
   
ExpandedSubBlockStart.gifContractedSubBlock.gif           
function loadArea1(obj){   
              
var area = $("area").value;   
              
var street = document.getElementById('street');   
              cityService.getAreaBySuper(area,streetCb);   
              street.length
=0;   
              street.options[
0= new Option('请选择','-1');   
ExpandedSubBlockStart.gifContractedSubBlock.gif              
function streetCb(streets){   
ExpandedSubBlockStart.gifContractedSubBlock.gif                 
for(var i=0;i<streets.length;i++){   
                     street.options[street.options.length] 
= new Option(streets[i].name,streets[i].id);   
                 }
   
              }
   
          }
   
        
</script>   
    
</HEAD>   
    
<BODY onload="initCity();">   
   
<select id=city name=city onchange="loadArea(this);"> </select>    
<select id=area  name=area onchange="loadArea1(this);"></select>   
<select id=street name=street> </select>      

 

 

 

 

转载于:https://www.cnblogs.com/sclsch/archive/2009/05/19/1460045.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值