zoukankan      html  css  js  c++  java
  • 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("
    ", " ");
                // exceptionMessage = exceptionMessage.replaceAll("
    ", " ");
                // exceptionMessage = exceptionMessage.replaceAll("	", " ");
                // 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("
    ", " ");
                // exceptionMessage = exceptionMessage.replaceAll("
    ", " ");
                // exceptionMessage = exceptionMessage.replaceAll("	", " ");
                // responseData = getFailureData(null, exceptionMessage);
                // }
  • 相关阅读:
    Digital Video Stabilization and Rolling Shutter Correction using Gyroscope 论文笔记
    Distortion-Free Wide-Angle Portraits on Camera Phones 论文笔记
    Panorama Stitching on Mobile
    Natural Image Stitching with the Global Similarity Prior 论文笔记 (三)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(二)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(一)
    ADCensus Stereo Matching 笔记
    Efficient Large-Scale Stereo Matching论文解析
    Setting up caffe on Ubuntu
    Kubernetes配置Secret访问Harbor私有镜像仓库
  • 原文地址:https://www.cnblogs.com/Mr-Wu/p/4149616.html
Copyright © 2011-2022 走看看