当前位置: 代码迷 >> Java Web开发 >> 用注解配置的SSH,struts2如何响应JSON
  详细解决方案

用注解配置的SSH,struts2如何响应JSON

热度:69   发布时间:2016-04-14 20:44:26.0
用注解配置的SSH,struts2怎么响应JSON
用注解配置的SSH,struts2怎么响应JSON(返回一个字符串)
我是要在第一个下拉框中获取值   将值通过异步传到Action中   在Action中响应JSON返回一个字符串  在JS中拆解  然后填充第二个下拉框   完成一个二级联动效果    
Action中的 一个方法

// 需求分析第二级联动(通过项目名称获取需求标题)
public String demnameList() throws Exception {
//项目名称
String proname = request.getParameter("proname");
//通过项目名称获取的需求标题集合
List<Project_need> list = iProject_needService.proNeedList(proname);
StringBuffer sb = new StringBuffer();
for (Project_need project_need : list) {
sb.append(project_need.getTitle()+",");
}
//回应JQ请求
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(sb.toString().substring(0, sb.length()-1));
response.getWriter().flush();
return "project-model-add";
}

JSP中的第一个下拉框
<select id="proname" name="project_model.proname" onchange="need()" >
<option value="0">请选择项目..</option>
<c:forEach var="pro" items="${proList }">
<option value="${pro.proName}">${pro.proName}</option>
</c:forEach>
</select>

JSP中的第二个下拉框
<select id="demname" name="project_model.demname">
<option value=0>请选择需求分析</option>
</select>

JS 

function need() {
$("#demname").empty();// jquery清空下拉框用对象.empty()方法
$.ajax({
url : "project_modelAction!demnameList", // 请求的路径
type : "post",// 请求的方式
data : "proname=" + $("#proname").val(),// 要发送的数据 相当要传的参数
dataType : "text",// 返回的数据类 json
success : function(data) {
if(data!=""){
// 处理ajax的回写值
var tempArray = data.split(",");
for ( var i = 0; i < tempArray.length; i++) {
//var tempArray1 = tempArray[i].split(",");
// 给省的下拉框赋值
var op = new Option(tempArray[i], tempArray[i]);
$("#demname").append(op);// jquery给下拉框赋值
}
}else{
alert("没有数据");
}
}

});
}

为什么在Action中可以获取页面穿过来的值   但是Action传到JS中却没有     求解脱  




------解决思路----------------------
// 需求分析第二级联动(通过项目名称获取需求标题)
public String demnameList() throws Exception {
//项目名称
String proname = request.getParameter("proname");
//通过项目名称获取的需求标题集合
List<Project_need> list = iProject_needService.proNeedList(proname);
StringBuffer sb = new StringBuffer();
for (Project_need project_need : list) {
sb.append(project_need.getTitle()+",");
}
return "project-model-add";
}

public void setSb(StringBuffer sb){
  this.sb = sb ;
}

public StringBuffer getSb(){
  return sb ;
}


去掉你的JQ请求,想其他struts请求一样,返回的你的“project-model-add”,在struts.xml中配置
<action name="your.actionName" class="your.actionClass" method="demnameList">
<result name="success" >../msg.jsp</result>
</action>

现在你只需要写一个msg.jsp,里面只有一句话 ${sb},就行了,,,,,
那么你的ajax将会得到msg.jsp中的全部信息,也就是模拟得到你sb.toString()...
这是我第一次做web项目时自己的想法,虽然现在有更好的办法,不过我还是可以给你介绍介绍。。。
------解决思路----------------------
测试了一下,手动close responese的流是可行的。不过要注意的是,你手动close后就是向客户端相应数据,后面代码要return null结束整个函数,要不然有异常
------解决思路----------------------
引用:
Quote: 引用:

楼上的做法是可取的,实际上转发到jsp,jsp的原理就是调用response的printwriter向浏览器回送数据。                                  
楼主的错误是因为你自己调用writer方法flush只是把数据写入了respone中,并没有回送给客户端,然后你返回一个视图是调用转发,要知道你调用转发response中的数据就会被清空无效。
我有另外一个想法就是手动调用writer的close方法强制response回送客户端,转发返回null.不知道会不会抛异常。毕竟我也是菜鸟



那我把字符串传到了JSP   然后Ajax获取到该字符串   然后在填充第二个下拉框??

不用,试试把flush改成close.还有后面改成return null
  相关解决方案