关于STRUTS2返回JSON的问题

a_king 2013-06-28 12:38:20
最近用SSH2+FLEXGRID做个东西,遇到问题,当JS文件向STRUTS2发请求总是得不到返回的JSON字符串,我的代码具体是这样的
JS
url: 'QueryGrid.action', //GRID需要去访问的ACTION
dataType: 'json',
colModel : [
{display: '序列', name : 'iso', width : 50, sortable : true, align: 'center'},
{display: '用户ID', name : 'name', width : 100, sortable : true, align: 'center'},
{display: '登陆名', name : 'printable_name', width : 100, sortable : true, align: 'center'},
{display: '用户名', name : 'iso3', width : 100, sortable : true, align: 'center'},
{display: 'MAIL', name : 'numcode', width : 100, sortable : true, align: 'center'},
{display: '状态', name : 'numcode', width : 80, sortable : true, align: 'center'}
]
STRUTS.XML配置
<package name="json" namespace="/" extends="json-default">

<action name="QueryGrid" class="queryGrid" method="wirte">
<result name="success" type="json"/>
</action>
</package>
具体的ACTION是
/**
* 入口
*/
public String wirte() {
// TODO Auto-generated method stub
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
String query = request.getParameter("query");
System.out.println("query====" + request.getParameter("query"));
try {
this.queryUsers(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SUCCESS;
}

/**
* 查询用户
* @return
* @throws Exception
*/
private void queryUsers(HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub

response.setContentType("html/txt");
response.setCharacterEncoding("gbk");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setHeader("Pragma", "no-cache");

String condition = request.getParameter("loginName");//查询条件
List list = usersService.queryUsers(condition);
int total = list.size();// 总记录数
int page = Integer.parseInt(request.getParameter("page") == null ? "1" : request.getParameter("page"));// 当前页,从前台传递过来
int rp = Integer.parseInt(request.getParameter("rp") == null ? "10" : request.getParameter("rp"));//每页显示的记录条数
//
int index = (page - 1) * rp; // 开始记录数

FlexGridJSONData fgjd = new FlexGridJSONData(page,total);
Object[] obj = null;

for(int i = index; i < rp + index && i < total; i++){
fgjd.setRowId("row" + i);
//从下面开始读数据
fgjd.addColdata((i + 1) + "");
obj = (Object[])list.get(i);
fgjd.addColdata(obj[0].toString());
fgjd.addColdata(obj[1].toString());
fgjd.addColdata(obj[2] == null ? "" : obj[2].toString());
fgjd.addColdata(obj[3] == null ? "" : obj[3].toString());
fgjd.addColdata(obj[4] == null ? "" : obj[4].toString());
}
fgjd.commitData();
System.out.println(fgjd.toString());

response.getWriter().write(fgjd.toString());
response.getWriter().flush();
response.getWriter().close();
}
每当请求的时候,总是报错
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:852)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:534)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:432)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:600)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1703)
at java.lang.Thread.run(Thread.java:662)
感觉好像是
response.getWriter().flush();
response.getWriter().close();这里错误了,单不知道怎么写,
请哪位高手指点一下
...全文
105 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小丑哥_V5 2013-06-28
  • 打赏
  • 举报
回复
直接使用getWriter().print("xxx"); 不用close
a_king 2013-06-28
  • 打赏
  • 举报
回复
另,我用SERVLET请求就可以获得到参数
北京-李大鹏 2013-06-28
  • 打赏
  • 举报
回复
直接在浏览器里访问Action的地址,是否可以正常显示内容? 另外建议你用Firefox安装Firebug插件,跟踪调试Ajax应用比较方便。
a_king 2013-06-28
  • 打赏
  • 举报
回复
引用 5 楼 samboy2002 的回复:
response.getWriter().write(fgjd.toString()); 改成:response.getWriter().print(fgjd.toString()); 把下面的两行都删掉。 另外还要注意response的状态,你的异常是因为response的状态不对,最常见的错误就是做了flush或close之后还有写的操作。
这样虽然不报错了,但是JSON字符串没有传递到前台页面,
北京-李大鹏 2013-06-28
  • 打赏
  • 举报
回复
response.getWriter().write(fgjd.toString()); 改成:response.getWriter().print(fgjd.toString()); 把下面的两行都删掉。 另外还要注意response的状态,你的异常是因为response的状态不对,最常见的错误就是做了flush或close之后还有写的操作。
a_king 2013-06-28
  • 打赏
  • 举报
回复
没人会呀,没人会呀,凑够字数
a_king 2013-06-28
  • 打赏
  • 举报
回复
引用 2 楼 shadowsick 的回复:
直接使用getWriter().print("xxx"); 不用close
不行呀

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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