struts2的action在处理完了业务后,会返回一个字符串,在xml文件面定义字符串与返回页面的关联,便可方便返回页面.但struts2缺少一个方便直接的返回字符串的方法.现在以微信为订阅号成为开发者为例,说明解决方法(集成一个类好可):
方法1:直接在action中书写:
/**
* 处理微信服务器请求,get请求验证token,post请求是消息
*/
public String execute(){
System.out.println("weixin----------OpenPlatformServiceAction execute-------");
String method = ServletActionContext.getRequest().getMethod();
logger.debug("method="+method);
try {
if(method.equals("POST")){
jsonString = doRequest();
logger.debug("post request complete");
}else{
if (validateToken()) {
jsonString = echostr;
System.out.println("echostr="+echostr);
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
response.setContentType("text/plain; charset=UTF-8");
response.setHeader("Content-Disposition", "inline");
PrintWriter writer = null;
try {
writer = response.getWriter();
writer.write(jsonString);
}catch(Exception e){
e.printStackTrace();
} finally {
if (writer != null) {
writer.flush();
writer.close();
}
}
}else {
jsonString = "validate fail";
}
//logger.debug("get request complete");
}
} catch (Exception e) {
e.printStackTrace();
}
return "openResult";
}
/**
* 验证token,只在微信验证平台调用接口时会验证一次
* @return
* @throws EntityException
*/
private boolean validateToken() throws EntityException{
System.out.println("weixin----------OpenPlatformServiceAction validateToken-------");
logger.debug("validate token...");
String[] str = { getToken(), timestamp, nonce };
System.out.println("Token="+ getToken()+",timestamp="+timestamp+",nonce="+nonce+",signature="+signature);
Arrays.sort(str); // 字典序排序
String connStr = str[0] + str[1] + str[2];
System.out.println("connStr="+connStr);
// SHA1加密
String digest = encode("SHA1", connStr);
System.out.println("digest="+digest);
// 确认请求来至微信
if (digest.equals(signature)) {
System.out.println("validate success");
//logger.debug("validate success,query string:"+ServletActionContext.getRequest().getQueryString());
return true;
}
//logger.debug("validate fail,query string:"+ServletActionContext.getRequest().getQueryString());
return false;
}
2,第二种:添加一个工具类
/** * 扩展Struts2返回类型,直接返回String * * @author Carmack Created on 2009-3-24 下午03:36:32 */ public class StringResult extends ServletRedirectResult { /** * @author Carmack Created on 2009-3-24 下午03:36:24 */ private static final long serialVersionUID = -2800270132418148253L; private static final Logger LOG = LoggerFactory.getLogger(StringResult.class); public StringResult(){ super(); } public StringResult(String location){ super(location); } public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(HTTP_RESPONSE); HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(HTTP_REQUEST); response.setContentType("text/plain; charset=UTF-8"); response.setHeader("Content-Disposition", "inline"); PrintWriter writer = null; try { writer = response.getWriter(); writer.write(request.getAttribute(finalLocation).toString()); } catch(NullPointerException e) { if(finalLocation.equals("")){ LOG.warn("未指定value",e); }else{ LOG.error("空",e); } } finally { if (writer != null) { writer.flush(); writer.close(); } } } }
在Action上使用:
@Results({ @Result(name = "strResult" , type=StringResult.class, value="testStr")})
在方法中先给testStr赋值,返回直接返回sttrResult就OK啦.
testStr = "测试返回字符串123abc"; return "strResult";