首页 > 学院 > 开发设计 > 正文

Struts2 自定义Result

2019-11-14 22:08:58
字体:
来源:转载
供稿:网友
Struts2 自定义Result

注意:我只要是解决自定义返回Json 和异常处理问题

新建一个类 AjaxResult 继承 StrutsResultSupport 看看代码吧

public class AjaxResult extends StrutsResultSupport {    /**     * serialVersionUID     */    PRivate static final long serialVersionUID = 1L;    private static final String AJAX_SUCCESS = "{/"success/":true}";    private static final String SUCCESS_PERFIX = "{/"success/":true,result:[";    private static final String FAILURE_PERFIX = "{/"success/":false,result:[],";    private static final String SUFFIX = "]}";    private Writer writer;    private String defaultEncoding = "UTF-8";    @Inject("struts.i18n.encoding")    public void setDefaultEncoding(String encoding) {        this.defaultEncoding = encoding;    }    protected void doExecute(String finalLocation, ActionInvocation invocation)            throws Exception {        Object action = invocation.getAction();        String responseData = "";        if ((action instanceof BaseAction)) {            BaseAction ajaxAction = (BaseAction) action;            HttpServletResponse response = ServletActionContext.getResponse();            String encoding = getEncoding(finalLocation);            String contentType = getContentType(finalLocation);            if (encoding != null) {                contentType = contentType + ";charset=" + encoding;            }            response.setContentType(contentType);            String successData = ajaxAction.getResponseData();            if (successData != null) {                if ("success".equals(successData)) {                    responseData = "{/"success/":true}";                } else {                    responseData = successData;                }            }            // if(true){            // String errorResultLocation = ajaxAction.getErrorResultLocation();            // String exceptionMessage =            // invocation.getStack().findString("exception.message");            // exceptionMessage = exceptionMessage.replaceAll("/r", " ");            // exceptionMessage = exceptionMessage.replaceAll("/n", " ");            // exceptionMessage = exceptionMessage.replaceAll("/t", " ");            // responseData = getFailureData(null, exceptionMessage);            // }            getWriter().write(responseData);        }    }    private String getFailureData(String errorResultLocation,            String exceptionMessage) {        String errors = "errors:[{msg:/"" + exceptionMessage + "/"}]";        // if (StringUtils.isNotBlank(errorResultLocation)) {        // String target = ",/"target/":/"" + errorResultLocation;        // return "{/"success/":false,result:[]," + errors + target + "/"}";        // }        return "{/"success/":false,result:[]," + errors + "}";    }    public void setWriter(Writer writer) {        this.writer = writer;    }    protected Writer getWriter() throws IOException {        if (this.writer != null) {            return this.writer;        }        return ServletActionContext.getResponse().getWriter();    }    protected String getContentType(String templateLocation) {        return "application/json";    }    protected String getEncoding(String templateLocation) {        String encoding = this.defaultEncoding;        if (encoding == null) {            encoding = System.getProperty("file.encoding");        }        if (encoding == null) {            encoding = "UTF-8";        }        return encoding;    }}

接下来,我们需要一个Struts 的配置文件

<package name="ajax-default" abstract="true" extends="struts-default">        <result-types>            <result-type name="ajax"                class="com.guy.core.common.util.AjaxResult" />        </result-types>        <global-results>            <result name="ajax" type="ajax" />        </global-results>            </package>

之后我们新建一个公用类 BaseAction

public class BaseAction extends ActionSupport implements ModelDriven,sessionAware, ParameterAware, ServletRequestAware, ServletResponseAware{        /**     * serialVersionUID     */    protected final Log logger = LogFactory.getLog(getClass());    private static final long serialVersionUID = 1L;    public String SUCCESS="SUCCESS";    public static final String AJAX = "ajax";    protected Map session;    protected Map parameters;    protected HttpServletRequest servletRequest;    protected HttpServletResponse servletResponse;    private String responseData;    protected void createJSonData(String jsonData) {        setResponseData(jsonData);    }    public String getResponseData() {        return responseData;    }    public void setResponseData(String responseData) {        this.responseData = responseData;    }    public Map getSession() {        return session;    }    public void setSession(Map session) {        this.session = session;    }    public Map getParameters() {        return parameters;    }    public void setParameters(Map parameters) {        this.parameters = parameters;    }    public HttpServletRequest getServletRequest() {        return servletRequest;    }    public void setServletRequest(HttpServletRequest servletRequest) {        this.servletRequest = servletRequest;    }    public HttpServletResponse getServletResponse() {        return servletResponse;    }    public void setServletResponse(HttpServletResponse servletResponse) {        this.servletResponse = servletResponse;    }    @Override    public Object getModel() {        return null;    }          }

所有的action 都继承BaseAction ModelDriven 我就不在解释了百度去

例如

public class LoginAction extends BaseAction{
createJSonData("{/"success/":false,/"msg/":/"密码错误。/"}");
return AJAX;

这样我们的 BaseAction 就完事了,

对象ToString 转成 json 格式了,方便查看

@Override     public String toString() {          return ToStringBuilder.reflectionToString(this);     }
 1  <interceptor-ref name="landingIct">   2                     <!-- 包括的方法,也就是拦截器拦截的方法<param name="includeMethods">方法1,方法2</param>       3                        4                     excludeMethods表示排除指定的方法,即不对标记为excludeMethods的方法进行拦截           5                     -->   6                     <param name="excludeMethods">landing</param>                   7                 </interceptor-ref>                   8                 <!-- 默认拦截器栈,如果不写则通过默认拦截器完成的功能将失效。如:国际化等等详细查看struts-default -->   9                 <!--  10                     如果action中没有自定义的拦截器,struts2会为该action添加默认的拦截器,即defaultStack;如果action中用户自己添加了自定义拦截器,将覆盖掉系统的defaultStack,这时候需要我们显式调用该拦截器栈。 11                  -->  

抛出异常 处理,在beasAction设置 IsAjaxError AjaxErrorMessage

给get set 方法,

新建AjaxExceptionInterceptor

 public String intercept(ActionInvocation invocation)    throws Exception  {    String result;    try    {      result = invocation.invoke();    }    catch (Exception e) {      if (this.logEnabled) {        handleLogging(e);      }      List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();      String mappedResult = findResultFromExceptions(exceptionMappings, e);      if (mappedResult != null) {        result = mappedResult;        Object action = invocation.getAction();        if (action instanceof AjaxProvider) {          AjaxProvider ajaxAction = (AjaxProvider)action;          Map results = invocation.getProxy().getConfig().getResults();          ResultConfig resultConfig = (ResultConfig)results.get(result);          String location = (String)resultConfig.getParams().get("location");          ajaxAtion.setIsAjaxError ("true");          ajaxAction.setAjaxErrorMessage(location);          result = "ajaxError";        }        super.publishException(invocation, new ExceptionHolder(e));      }      else {        throw e;      }    }    return result;  }

baseAction 这里判断下是否有异常,有的花转成json输出到页面

 // if(true){            // String errorResultLocation = ajaxAction.getErrorResultLocation();            // String exceptionMessage =            // invocation.getStack().findString("exception.message");            // exceptionMessage = exceptionMessage.replaceAll("/r", " ");            // exceptionMessage = exceptionMessage.replaceAll("/n", " ");            // exceptionMessage = exceptionMessage.replaceAll("/t", " ");            // responseData = getFailureData(null, exceptionMessage);            // }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表