dwr+struts2+hibernate实现二级动态联动

来源:互联网 发布:手机什么软件最省电 编辑:程序博客网 时间:2024/04/26 23:12

关于二级联动的功能,以前用asp写过,早忘了……这次的任务是做二级动态联动,所以整理了一下,记录一下,也供大家参考下,有什么问题尽管指出。

实现的功能是这样的:数据库有两个表,一个是college,一个是department,其中,department里面有一个外键是college的主键,两个表之间的联系是一对多的。在页面中,第一个下拉菜单的内容是从college里面读取的数据,当选择了第一个下拉菜单后,第二个显示的是通过ajax读取的表department的内容。下面就开始具体的步骤吧!

首先第一步,要下载dwr.jar包,放到工程lib下。

第二步,在web.xml中配置dwr,加入如下的配置代码:

Code:
  1. <!-- 定义dwr拦截器 -->  
  2.     <servlet>  
  3.         <servlet-name>dwr</servlet-name>  
  4.         <servlet-class>  
  5.             org.directwebremoting.servlet.DwrServlet   
  6.         </servlet-class>  
  7.         <init-param>  
  8.             <param-name>debug</param-name>  
  9.             <param-value>true</param-value>  
  10.         </init-param>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.         <servlet-name>dwr</servlet-name>  
  14.         <url-pattern>/dwr/*</url-pattern>  
  15.     </servlet-mapping>  

第三步:在web.xml同目录下新建dwr.xml,这里可以进行配置。结合我的例子解释一下:

Code:
  1. <dwr>     
  2. <allow>    
  3. <!--javascript属性对应客户端调用的js,new表示用new创造器-->    
  4. <create javascript="myjs" creator="new">     
  5. <!--  name=“class”表示对应的是java类,value属性是对应的后台功能类-->  
  6. <param name="class" value="com.usersope.struts.college.FindDepart" />     
  7. <!--method是说后台类里面的那个方法可以调用-->  
  8. <include method="getdepart"/>     
  9. </create>    
  10. <!--如果后台类返回的是list类型,那就要加上这句 -->  
  11. <convert match="com.usersope.hibernate.DAO.Department" converter="bean"></convert>     
  12. </allow>     
  13. </dwr>    

为了测试你的dwr是否已经正确配置好,在浏览器中测试一下,路径是:http://localhost:8080/项目名称/dwr/index.html。注意,这里一定要用html结尾,不知道为什么,小叶也不告诉我……,如果出现下面的页面,则说明成功了!

第四步:前台js的写法。

其实前台主要的就是回调函数。

Code:
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
  2. <%@ taglib prefix="s" uri="/struts-tags"%>   
  3. <%   
  4. String path = request.getContextPath();   
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";   
  6. %>   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  8.   
  9. <html>   
  10.   <head>   
  11.     <base href="<%=basePath%>">   
  12.        
  13.     <title>welcome login in</title>   
  14.        
  15.     <meta http-equiv="pragma" content="no-cache">   
  16.     <meta http-equiv="cache-control" content="no-cache">   
  17.     <meta http-equiv="expires" content="0">       
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   
  19.     <meta http-equiv="description" content="This is my page">   
  20.     <!--   
  21.     <link rel="stylesheet" type="text/css" href="styles.css">   
  22.     -->  
  23. <!-- 导入dwr js文件 -->   
  24.         <script type='text/javascript' src='/usersope/dwr/interface/myjs.js'></script>   
  25.         <!-- 下面两个是dwr本身自带生成的-->   
  26.         <script type='text/javascript' src='/usersope/dwr/engine.js'></script>   
  27.         <script type='text/javascript' src='/usersope/dwr/util.js'></script>   
  28.         <script type="text/javascript">   
  29.        //获取函数   
  30.        function getdepart(){   
  31.        var colid = document.getElementById("colid").value;   
  32.          
  33.        myjs.getdepart(colid,getdeparts_back);   
  34.        }   
  35.        //获取回调函数,名字取决于上面那行   
  36.        //参数data是接受的action的返回值 ,这个是list类型的。然后将list加载到下拉列表框中  
  37.        function getdeparts_back(data)   
  38.        {     
  39.           
  40.         var s = document.getElementById("depart");   
  41.          for(var i=0;i<data.length;i++)   
  42.         {   
  43.            
  44.           var opt=new Option(data[i].dename,data[i].value);   
  45.              s.options[i]=opt;   
  46.   }   
  47.   
  48.         }   
  49.   
  50.           
  51.        </script>   
  52.   </head>   
  53.      
  54.   <body bgcolor="#eeeeee">   
  55.   <center>注册</center>   
  56.   <s:form action="RegistAction.action" name="form1" method="post" validate="true">   
  57.     <table align="center" width="60%" border="1" >   
  58.      <tr>   
  59.       <td><s:textfield id="username" name="users.username" label="User Name"/>   
  60.        <span id="message"> </span>   
  61.       </td>   
  62.      </tr>   
  63.      <tr>   
  64.       <td><s:password id="password" name="users.password" label="Pass word"/>   
  65.       <span id="messages"> </span>   
  66.       </td>   
  67.      </tr>   
  68.       <tr>   
  69.       <td>   
  70.       <div>   
  71.       <!-- listKey是传值内容,id让js获取的,list是列表,listValue是显示选项的内容 -->   
  72.     <s:select id="colid" label="college" list="list" listKey="colid"    
  73.        listValue="colname" headerKey="0" headerValue="-请选择学院-"  
  74.        multiple="false" onchange="getdepart()" name="users.college"/>   
  75.           
  76.        <s:select id="depart" label="department" list="#{}" listKey="dename"    
  77.        headerKey="0" headerValue="-请选择系别-"  
  78.        name="users.depart"  
  79.        multiple="false" />   
  80.   
  81.       </div>   
  82.          
  83.       </td>   
  84.      </tr>   
  85.      <tr>   
  86.       <td><input type="submit" value=" Regist "/></td>   
  87.       <td><input type="reset" value=" Reset "/></td>   
  88.      </tr>   
  89.     </table>   
  90.     </s:form>   
  91.     <div style="padding:0,0,0,700px;">   
  92.     <form action="index.action" name="form2" method="post">   
  93.       <input type="submit" value="Go Index "/>   
  94.       </form>   
  95.       </div>   
  96.   </body>   
  97. </html>   

 最后,把后台类也放上吧:

Code:
  1. public class FindDepart{   
  2.     List departlist;   
  3.     public List getDepartlist() {   
  4.         return departlist;   
  5.     }   
  6.     public void setDepartlist(List departlist) {   
  7.         this.departlist = departlist;   
  8.     }   
  9.     UsersDAOEx dao = new UsersDAOEx();   
  10.     public List getdepart(int colid) {   
  11. //自己定义的一个可以传递不定参数的方法,这里就直接调用啦~   
  12.         departlist = dao.findList("from Department D where D.colid = ?", colid);   
  13.            
  14.            
  15.         return departlist;   
  16.     }   
  17. }  

整个过程应该就是这样的。利用dwr简化了很多ajax的代码,只要你搞清楚了,其中的来龙去脉还是比较好理解的。