action响应ajax请求返回JSON类型

yepengjun1006 2013-12-04 08:02:26
我在用ajax向action发送请求时,可以响应请求,但是ajax在获取数据时,获取不了json类型的数据,不知道是哪里出了问题。代码如下:

jsp代码:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>

<script type="text/javascript">

function change(proCode){

alert("1 "+proCode);

$('#proCode').val(proCode); //让第一个下拉框保持显示选中的值

$('#cityCode').html(""); //把ci内容设为空

var cityValue = $('#cityCode');

cityValue.append('<option value="">选择CITY</option>');

$.ajax({

url: '/GP/address.action?proCode='+proCode, type: 'post', //

data: {},

dataType: 'json',

//async:false,

cache:false,

success: function(opts) {

alert(opts.length);

if (opts!=null && opts.length > 0) {

var html = [];

for (var i = 0; i < opts.length; i++) {

html.push('<option value="'+opts[i].cityCode+'">'+opts[i].cityName+'</option>');

}

cityValue.append(html.join(''));

}

},

error: function(){

alert("error !");

}

});

}

</script>

<body>

<table>

<tr>

<td width="10%"> 省份   </td>

<td width="30%">

<select name="province.proCode" id="proCode" onchange="change(this.value)">

<option value="0">--请选择所在省份--</option>

<s:iterator value="#request.prolist">

<option value="${proCode }">${proName }</option>

</s:iterator>

</select>

</td>

</tr>

<tr>

<td width="10%"> 城市   </td>

<td width="30%">

<select name="city.cityCode" id="cityCode">

<option value="0" >--city--</option>

</select>

</td> </tr>

</table>

</body>

</html>



action代码如下:

package action;



import java.io.PrintWriter;

import java.io.Writer;

import java.util.List;



import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



import net.sf.json.JSONArray;



import org.apache.struts2.ServletActionContext;



import service.odservice.ICityService;

import service.odservice.IProvinceService;



import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;



import entity.City;

import entity.Province;



public class AddressAction extends ActionSupport {

/**

*

*/

private static final long serialVersionUID = 1L;

private IProvinceService proService;

private ICityService cityService;

private String proCode;

private String opts;



public String getProCode() {

return proCode;

}

public void setProCode(String proCode) {

this.proCode = proCode;

}



public String getOpts() {

return opts;

}

public void setOpts(String opts) {

this.opts = opts;

}

public IProvinceService getProService() {

return proService;

}

public void setProService(IProvinceService proService) {

this.proService = proService;

}

public ICityService getCityService() {

return cityService;

}

public void setCityService(ICityService cityService) {

this.cityService = cityService;

}



public String selectAddress() throws Exception {

if(proCode==null)proCode="";

System.out.println("proCode="+proCode);

List<City> citylist = cityService.findByProCode(proCode);

List<Province> prolist = proService.searchAll();

if(proCode!=null&&proCode!="")

System.out.println(citylist.get(0).getCityName());

HttpServletRequest request = ServletActionContext.getRequest();

request.setAttribute("citylist", citylist);

request.setAttribute("prolist", prolist);

HttpServletResponse response = ServletActionContext.getResponse();

response.setContentType("application/json");

response.setCharacterEncoding("UTF-8");

PrintWriter writer = response.getWriter();

JSONArray array = JSONArray.fromObject(citylist);

opts = array.toString();

writer.print(opts);

return SUCCESS;

}

}
...全文
1179 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yepengjun1006 2013-12-06
  • 打赏
  • 举报
回复
我后面把opts改成city了,这里应该是opts,反正要和struts.xml里的对应
yepengjun1006 2013-12-06
  • 打赏
  • 举报
回复
action里是这样的: public String selectCity() throws Exception { List<City> citylist = cityService.findByProCode(proCode); JSONArray array = JSONArray.fromObject(citylist); city = array.toString(); return SUCCESS; } 省略了setter,getter方法
yepengjun1006 2013-12-06
  • 打赏
  • 举报
回复
谢谢各位,之前是我返回的不是JSON数据,后面我用struts.xml配置的方式解决了这个问题。配置代码是这样的: <package name="demo" extends="struts-default,json-default"> <action name="cityselect" class="action.CityAction" method="selectCity"> <result type="json"> <param name="root">opts</param> //这里的opts是和action里对应的 </result> </action> </package> 还有我不会使用后台debug,也不会用浏览器调试
陈大神 2013-12-06
  • 打赏
  • 举报
回复
我这个是下拉框联动可以获取到,LZ可以参考下:
 <SCRIPT type="text/javascript">
 function loadDepartment(inOrganization) {
 	var orgCombox = document.getElementById("xxx").value;
 	var objSelect = document.getElementById("xxx");
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "xxx.html?method=doGetDepart&orgCombox="+orgCombox+"",
        data: {"inOrganization":inOrganization},
        dataType:"json",
        async : false,
        success: function(data){
         $("#inDepartment").empty();
         $("#inDepartment").append("<option value=''></option>");
            for(var i = 0; i < data.length; i++){
             if(data[i] != null) {
             $("#inDepartment").append("<option value="+data[i]["cityid"]+">"+data[i]["cityname"]+"</option>");
             var depart=data[i]["departID"];
             }
             if(objSelect.options[i].value == depart) {  
		           objSelect.options[i].selected = true;  
	          } 
           }
        },
        error:function (XMLHttpRequest, textStatus, errorThrown) {
      		alert("加载部门异常:" + errorThrown);
        }
    });
}
</SCRIPT>
JSONArray json_arr = new JSONArray();
		JSONObject json=null;
		for (ReportLeaveDetailData obj : departList) {
			json = new JSONObject();
			json.put("cityid", obj.getField("id"));
			json.put("cityname", obj.getField("name"));
			json.put("departID", selectDepart);
			json_arr.put(json);
		}
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print(json_arr.toString());
		out.close();
tony4geek 2013-12-05
  • 打赏
  • 举报
回复
你后台方法调用到了吧。浏览器调试看看。
Go 旅城通票 2013-12-05
  • 打赏
  • 举报
回复
获取不到数据是什么意思,执行到success还是error了。。
KK3K2005 2013-12-04
  • 打赏
  • 举报
回复
writer.print(opts); writer.print("callback("+opts+")"); 要类似这样用回调函数吧json格式的字符串拼起来 你看你ajax 发出的请求链接 里面有一个callback字段 表示了 回调函数的名称

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧