本文主要看一下Struts2中的Div是如何用来输出Ajax结果。


首先,我们先创建一个简单的用例,在这个用例中,将在屏幕上显示一个用户列表,点击列表中的userid时,列表的下方将显示用户的详细信息,显示用户详细信息的这个步骤我们将使用Ajax。



一、创建web.xml


Xml代码




  1.     <?xml version="1.0" encoding="UTF-8"?>    
  2.     <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">    
  3.       <filter>    
  4.         <filter-name>struts2</filter-name>    
  5.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>    
  6.       </filter>    
  7.       <filter-mapping>    
  8.         <filter-name>struts2</filter-name>    
  9.         <url-pattern>/*</url-pattern>    
  10.       </filter-mapping>    
  11.     </web-app>  



二、创建struts.xml


Xml代码





  1.     <!DOCTYPE struts PUBLIC    
  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    
  3.         "http://struts.apache.org/dtds/struts-2.0.dtd">    
  4.     <struts>    
  5.         <package name="ajaxdemo" extends="struts-default">    
  6.             <action name="UserListingAction" class="ajaxdemo.action.UserListingAction">    
  7.                 <result>/userlisting.jsp</result>    
  8.             </action>    
  9.             <action name="UserDetailAction" class="ajaxdemo.action.UserDetailAction">    
  10.                 <result>/userdetail.jsp</result>    
  11.             </action>    
  12.         </package>    
  13.     </struts>    



三、页面:userlisting.jsp


Displays list of users


Html代码





  1.     <%@ taglib prefix="s" uri="/struts-tags" %>    
  2.     <html>    
  3.       <head>    
  4.         <s:head theme="ajax"/>    

  5.       </head>    
  6.       <script>    
  7.         function show_user_details(id) {    
  8.           document.frm_user.userid.value = id;    
  9.           dojo.event.topic.publish("show_detail");    
  10.         }    
  11.       </script>    
  12.       <body>    
  13.         <s:form id="frm_user" name="frm_user">    
  14.           <h1>User Listing</h1>    
  15.           <s:if test="userList.size > 0">    
  16.             <table border="1">    
  17.               <s:iterator value="userList">    
  18.                 <tr>    
  19.                   <td>    
  20.                     <s:a href="#" onclick="javascript:show_user_details('%{id}');return false;"><s:property value="id" /></s:a>    
  21.                   </td>    
  22.                   <td>    
  23.                     <s:property value="name" />    
  24.                   </td>    
  25.                 </tr>    
  26.               </s:iterator>    
  27.             </table>    
  28.           </s:if>    
  29.           <s:hidden name="userid"/>    
  30.           <s:url id="d_url" action="UserDetailAction" />    
  31.           <s:div  id="user_details" href="%{d_url}" theme="ajax" listenTopics="show_detail" formId="frm_user" >    
  32.           </s:div>    
  33.         </s:form>    
  34.       </body>    
  35.     </html>    



四、页面:userdetail.jsp,用于显示用户详细信息,由userlisting.jsp加载


Html代码  









  1.     <%@ taglib prefix="s" uri="/struts-tags" %>    
  2.     <h1>User Details</h1>    
  3.     <s:if test="userDetails != null">    
  4.         <table>    
  5.           <tr><td>Id:</td><td><s:property value="userDetails.id" /></td></tr>    
  6.           <tr><td>Name:</td><td><s:property value="userDetails.name" /></td></tr>    
  7.           <tr><td>Email:</td><td><s:property value="userDetails.email" /></td></tr>    
  8.           <tr><td>Address:</td><td><s:property value="userDetails.address" /></td></tr>    
  9.         </table>    
  10.     </s:if>    



五、ajaxdemo.action.UserListingAction.java,生成用户列表数据,交由userlisting.jsp显示,在实际的应用中,这部分的数据一般是从数据库中取得的。



Java代码








  1.     package ajaxdemo.action;    

  2.     import ajaxdemo.dto.UserListDTO;    
  3.     import com.opensymphony.xwork2.ActionSupport;    
  4.     import java.util.ArrayList;    
  5.     import java.util.List;    

  6.     /** *//** Populates the user listing data */    
  7.     public class UserListingAction extends ActionSupport {    

  8.         private List<UserListDTO> userList; // this is available in view automatically!    
  9.         public String execute() throws Exception {    

  10.             // create 2 user objects and add to a list    
  11.             setUserList((List<UserListDTO>) new ArrayList());    
  12.             UserListDTO user = new UserListDTO();    
  13.             user.setId("gjose");    
  14.             user.setName("Grace Joseph");    
  15.             getUserList().add(user);    

  16.             user = new UserListDTO();    
  17.             user.setId("peter");    
  18.             user.setName("PeterSmith");    
  19.             getUserList().add(user);    
  20.             return SUCCESS;    
  21.         }    

  22.         public List<UserListDTO> getUserList() {    
  23.             return userList;    
  24.         }    

  25.         public void setUserList(List<UserListDTO> userList) {    
  26.             this.userList = userList;    
  27.         }    
  28.     }  





六、ajaxdemo.action.UserDetailAction.java,当userid被选中时,取得用户详细数据,通过dojo来调用。



Java代码








  1.     package ajaxdemo.action;    

  2.     import ajaxdemo.dto.UserDetailDTO;    
  3.     import com.opensymphony.xwork2.ActionSupport;    

  4.     /**//* Populates user details for a user id selected */    
  5.     public class UserDetailAction extends ActionSupport {    

  6.         private String userid;    
  7.         private UserDetailDTO userDetails;    

  8.         public String execute() throws Exception {    
  9.             // populate only when userid is selected    
  10.             if(userid!=null && !userid.equals(""))    
  11.                 populateDetail(userid);    
  12.             return SUCCESS;    
  13.         }    

  14.         private void populateDetail(String id) {    
  15.             userDetails = new UserDetailDTO();    
  16.             userDetails.setId(id);    
  17.             userDetails.setName("The Complete Name");    
  18.             userDetails.setEmail("admin@struts2.org");    
  19.             userDetails.setAddress("rich street, lavish road, Struts Land");    
  20.         }    

  21.         public String getUserid() {    
  22.             return userid;    
  23.         }    

  24.         public void setUserid(String userid) {    
  25.             this.userid = userid;    
  26.         }    

  27.         public UserDetailDTO getUserDetails() {    
  28.             return userDetails;    
  29.         }    

  30.         public void setUserDetails(UserDetailDTO userDetails) {    
  31.             this.userDetails = userDetails;    
  32.         }    

  33.     }    



七、ajaxdemo.action.UserDetailDTO.java、POJO,用于封装用户信息



Java代码





  1.     package ajaxdemo.dto;    

  2.     public class UserDetailDTO {    

  3.         private String id;    
  4.         private String name;    
  5.         private String email;    
  6.         private String address;    

  7.         public String getId() {    
  8.             return id;    
  9.         }    

  10.         public void setId(String id) {    
  11.             this.id = id;    
  12.         }    

  13.         public String getName() {    
  14.             return name;    
  15.         }    

  16.         public void setName(String name) {    
  17.             this.name = name;    
  18.         }    

  19.         public String getEmail() {    
  20.             return email;    
  21.         }    

  22.         public void setEmail(String email) {    
  23.             this.email = email;    
  24.         }    

  25.         public String getAddress() {    
  26.             return address;    
  27.         }    

  28.         public void setAddress(String address) {    
  29.             this.address = address;    
  30.         }    
  31.     }  


OK,部署完毕后,输入http://localhost:8080/ajaxdemo/UserListingAction.action来测试一下。

当列表中的userid被点中后,javascript通知Div标签从URL中动态加载返回内容。这个例子中,UserDetailAction取得用户信息并传递给userdetail.jsp。userdetail.jsp生成最终的展示结果,显示在Div中。