struts2 提供的几种result-type有dispatcher,chain,freemarker,httpheader,redirect,redirectAction,stream,velocity,xslt,plaintext。挺丰富的。但是当前台为一个ajax调用,而且需要的返回结果只需要为String类型,或者是JSON类型时,这个时候就比较抓狂了。
所以不得不再深入研究下struts的代码。发现一个比较好的实现方法,即自己定义一个resultType实现Result接口即可。
比如为ajax自定义的result 该类主要提供ajax的字符串结果
package com.mypack.ajax
public class AJAXResult implements Result
{
private String ajax;
private HttpServletResponse rep;
/**
*
*/
private String chartSet = "GBK";
private static final long serialVersionUID = 3841999252996023829L;
public AJAXResult()
{
}
public void execute(ActionInvocation invocation) throws Exception
{
ajax = (String) invocation.getStack().findValue("ajax");
if (ajax == null)
{
throw new NullPointerException("没有定义ajax字符串结果集合,或者没有提供get方法");
}
rep = ServletActionContext.getResponse();
rep.reset();
rep.setContentType("text/html; charset=" + chartSet);
// rep.setCharacterEncoding(chartSet);
ServletOutputStream os = rep.getOutputStream();
os.write(ajax.getBytes(chartSet));
os.flush();
os.close();
}
public String getChartSet()
{
return chartSet;
}
public void setChartSet(String chartSet)
{
this.chartSet = chartSet;
}
}
而我们可以在struts.xml里面配置
<package name="ajax-default">
<result-types>
<result-type name="ajax"
class="com.mypack.ajax.AJAXResult">
</result-type>
</result-types>
<action name="cardInfo" class="CardInfoACT">
<result name="ajax" type="ajax"/>
</action>
</package>
当然,我们也可以将这个类封装到另外的包里,然后放到全局的result里被所有的类引用该类型。前期是要引用ajax-default这个包。