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等参数.