struts2+jquery+json

struts2.1.8.1+jquery1.4.2返回json數據

在    下面的script 中可以用標籤

--- 下面使用的 OGNL是XWork引入的一個非常有效的數據處理的工具。

<script type="text/javascript">

var booleans =false;
        function checkradio(){
            <s:if test="#request.isContract == true">
                return true;
            </s:if>
            <s:else>

                var lengs = '';
                $("#emp_job_post_form input[name='job.enumsByJobType.id']").each(
                
                function(){
                   if($(this).attr("checked")==true){
                       lengs = $(this).val().length;
                       $("#jobTypeid_error_txt").text("");
                       return true;
                   }
                });
                //$("#jobTypeid_error_txt").text("Please choose the type of job");
                if (lengs=='') {
                    $("#jobTypeid_error_txt").text("Please choose the type of job");
                    return false;
                }else {
                    return true;
                }
            </s:else>
    
            }

</script>

--------------------------------------------------------------------------------------------------

在jquery ajax 中可以用 for ( var i = 0; i < length; i++) {.....} 也可以用$.each(data.LIST,function(i,post){.....});循環設值

例如:在下面jsp 頁面中

下面是向下拉框中設值:通過ajax異步請求

<script type="text/javascript">
$(function() {
    $.post("getAllCompanyInfo.action",null,function(data){
        $('#search_by_org').empty();
        $('#search_by_org').append('<option value=""></option>');
        if(data !="null" && data != null && data !="error" && data.LIST != null){
            var length = data.LIST.length;
            if(length > 0) {

              用$.each也可以,但"i"不可以丟了,否側會不顯示結果

把 返回的結果放到List <bean> bean 中有兩個屬性定義如下;

post.value 和 post.dispayName : value,dispayName 這兩個都是bean 的屬性,就是set get 的方法
                $.each(data.LIST,function(i,post){
                    $('#search_by_org').append('<option value="'+post.value+'">'+post.dispayName+'</option>');
                });
                
                用循環for也可以:
            //    for ( var i = 0; i < length; i++) {
                //    var post = data.LIST[i];
                //    $('#search_by_org').append('<option value="'+post.value+'">'+post.dispayName+'</option>');
                //}
            }
        }
    });
})


function onChangeAction(){
   var orgNameId = $("#search_by_org option:selected").val();
    window.location.href = "viewCompanyProfile.action?orgId="+orgNameId;
 }
</script>

<div>
    <img src="crain/images/title_search.png" />
</div>
<div class="search_title">
    Start your search for a job here!
</div>
<div class="search_btn1">
    <select name="orgName" id="search_by_org" class="select_style"
        οnchange="onChangeAction();"></select>
</div>

---也可以用下面的方法給下拉框賦值: 下面 var="temp"相當臨時的對象

==================================

     <select class="select_style" name="orgName">
        <option value="">--please 22select</option>
        <s:iterator value="#request.LIST" var="temp" >
            <option value="<s:property value="#temp.value"/>" >
                <s:property value="#temp.dispayName" />
            </option>
        </s:iterator>
        
      </select>

===

用不同的表示方法 value="%{#request.LIST}" 與上面的 value="#request.LIST"相同

<s:property value="dispayName" />與<s:property value="#temp.dispayName" />只是不同的表示 ,紅色的是用ognl 標籤

        <s:iterator value="%{#request.LIST}" var="temp" >
            <option value="<s:property value="%{#temp.value}"/>" >
                <s:property value="dispayName" />
            </option>
        </s:iterator>

===============================================

一、引入包

json-lib-2.1.jar

jsonplugin-0.33.jar

……………………其它依賴包……………………..

二、後臺

2.1  UserInfo.java實體類

         public class UserInfo implements Serializable {  

            private int userId; 

            private String userName;

            private String password;

              get set方法略

}

2.2  action類

                   publicclass TestAction extends ActionSupport {

   private String message;               // 使用json返回單個值

   private UserInfo userInfo;             // 使用json返回對象

   private List userInfosList;     //使用josn返回List對象

   get set方法略

   /*返回單個值*/  

  public String returnMsg(){  

       this.message = "成功返回單個值"; 

       return SUCCESS;

  } 

   /*返回UserInfo對象*/  

  public String returnUser(){

      userInfo = new UserInfo();

      userInfo.setUserId(10000);

      userInfo.setUserName("劉棟");

      userInfo.setPassword("123456");

      return SUCCESS;

   }

  /*返回List對象*/  

  public String returnList(){  

      userInfosList = new ArrayList<UserInfo>();

      UserInfo u1 = new UserInfo();

      u1.setUserId(10000);  

      u1.setUserName("張三");

      u1.setPassword("111111");

      UserInfo u2 = new UserInfo();

      u2.setUserId(10001);  

       u2.setUserName("李四");  

      u2.setPassword("222222");

      userInfosList.add(u1);

      userInfosList.add(u2); 

      return SUCCESS;  

  }  

}

2.3  struts.xml(必須繼承json-default、json-default繼承自struts-default)

                   <packagename="default" namespace="/json"extends="json-default">

<action name="returnMsg"class="com.testAction " method="returnMsg">  

<result name="success" type="json">

         <paramname="root">validate</param>

</result>  

</action>

<action name="returnUser "

class="com.testAction "method="returnUser ">

<result name="success" type="json">

<paramname="includeProperties">

         userInfo\.userId,userInfo\.userName,userInfo\.password

</param>        

</result>  

</action>

<action name="returnList"class="com.testAction "

 method="returnList">  

<result name="success" type="json">

<paramname="includeProperties">

         userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password

</param>

</result>  

</action>

</package>

三、前臺

3.1 頁面引入jquery-1.4.2.js

3.2 代碼如下:

<scriptlanguage="javascript">

  function getMsg(){

     $.ajax({

        url:'json/returnMsg.action',

        type:'post',

        dataType:'json',

        success:function(data){

                $("#result").html(data.message);

        }

     });

    }

 

  function getUser(){

     $("# result ").html(""); 

     $.ajax({

        url:'json/returnUser.action',

        type:'post',

        dataType:'json',

        success:function(data){

                 $("#result").append("用戶ID:"+data.userInfo.userId+"")

                        .append("用戶名:"+data.userInfo.userName+"")

                        .append("密碼:"+data.userInfo.password+"");

        }

     });

    }

 

  function getUserList(){

     $("# result ").html("");  

     $.ajax({

        url:'json/returnList.action',

        type:'post',

        dataType:'json',

        success:function(data){

          $.each(data.userInfosList,function(i,value){  

                   $("#result").append("第"+(i+1)+"個用戶")

                          .append("用戶名:"+value.userName+"")

                          .append("密碼:"+value.password+"");

          }

        }

     });

    }

</script>

<divid="result"></div>

<input type="button"value="獲得單個消息" οnclick="getMsg()"/>

<input type="button"value="獲得用戶信息" οnclick="getUser()"/>

<input type="button"value="獲得用戶列表" οnclick="getUserList()"/>

3.3 只要繼承extends="json-default"

result type設置成json之後,容器會把action的屬性自動封裝到一個json對象中(json攔截器來做),然後調用ajax的callback方法. 返回json數據

3.4  includeProperties 參數

輸出結果中需要包含的屬性值,這裏正則表達式和屬性名匹配,可以用“,”分割填充多個正則表達式。

如:輸出UserInfo的所有屬性及UserInfo的userName屬性

<result type="json">

  <param name="includeProperties"> userInfo.*,

  userInfo \. userName </param>

</result>        

3.5 excludeProperties 參數

輸出結果需要剔除的屬性值,也支持正則表達式匹配屬性名,可以用“,”分割填充多個正則表達式,類同includeProperties

3.6 輸出一個JSONList列表

<result name="success"type="json">

<paramname="includeProperties">

   userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password

</param>

</result>

其中userInfosList是action中的一個List類型的屬性,userInfosList \[\d+\]\. userName表示,userInfosList中存儲的對象0..end的userName屬性(list中存儲的對象必須有userName屬性)。

四、總結

4.1爲什麼要用includeProperties或 excludeProperties 參數:主要是爲了過濾掉接口,pojo的set、list、其它對象等不需要的數據防止循環取其它關聯對象或找不到接口。如果不配置,默認是處理 action中的所有屬性,如果action中有接口注入,json攔截器可能找不到接口而返回不了結果,還有如果action中有一個對象,這個對象與好多對象都有關聯,json攔截器會將相關聯的所有對象的屬性全部轉換成json格式,如果其它對象有list、set,其返回結果相當龐大,有可能是死循環而無法返回。如果不用<param name="includeProperties">或其他方式進行json數據過濾,通過debug你會發現前臺返回的json字符串,是把 action中的所有屬性全部轉化成json字符串返回給客戶端(包括service接口、pojo所有屬性及有關聯的pojo。有時候根本返回不了結果,也不報錯,後臺執行了,但前臺執行不到callback function,這主要是因爲找不到接口或者關聯的pojo太多,造成死循環),一般情況下用的最多的就是root、 includeProperties 和excludeNullProperties參數。當然還有其他的方法,如給pojo的屬性加json註解。

 

4.2  action中避免使用get開頭的action方法,去掉action中的接口的get方法 爲json類型的result配置includeProperties,excludeProperties等參數.


發佈了113 篇原創文章 · 獲贊 7 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章