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); // }
相关推荐
本主题将深入探讨如何在Spring Boot工程中通过自定义response注解、利用Java反射机制、设置自定义拦截器以及实现WebMvcConfigurer接口来实现这一目标。 首先,我们来看自定义response注解。在Spring Boot中,可以...
本实例将深入探讨如何创建一个名为`Result`的自定义注解,并了解如何在实际应用中使用它。 首先,我们需要定义自定义注解`Result`。在Java中,自定义注解的定义通常以`@interface`关键字开始。例如: ```java ...
Java 类自定义排序 Java 中的自定义排序是指在编写 Java 程序时,通过实现 Comparable 接口来实现对对象的排序。在本节中,我们将通过一个实体类的示例来演示如何实现自定义排序。 自定义排序的必要性 在 Java ...
### VBA自定义类型返回函数解析 #### 一、VBA与自定义类型基础 VBA(Visual Basic for Applications)是Microsoft Office等应用程序中的内置编程语言。它支持面向对象编程和过程式编程,并且可以创建宏来自动化...
然而,直接将ResultSet作为方法的返回值并不是最佳实践,原因在于ResultSet是依赖于数据库连接的。一旦Connection关闭,ResultSet也会随之关闭,可能导致数据无法正确读取。因此,为了确保数据的稳定访问,我们可以...
本篇文章将深入探讨“result接口”和相关的JAR包,以及它们在实际开发中的应用。 首先,让我们理解“result接口”。在软件工程中,接口是一种定义了特定功能的合同,它规定了类或对象必须实现的方法。Result接口很...
本文将详细讲解Linux Shell自定义函数的定义、返回值处理以及变量作用域。 **一、定义自定义函数** 在Shell中定义函数有两种基本语法形式: 1. 带`function`关键字: ```bash function funname () { action; ...
1.调用云函数的时候,云函数调试时返回值不是null,但是到了前端拿到的result却是null。 2.调试云函数,本地调试和云端测试/真机测试结果不一样。表现为本地测试正常运行,云端和真机出错。 解决方法:异步操作的...
对于习惯了Visual Studio(简称VS)开发环境中的.NET开发者来说,按下`///+Tab`键即可自动生成带有参数和返回值的代码注释,这大大提高了开发效率。然而,在使用IntelliJ IDEA进行Java开发时,这种便捷的功能似乎并...
总结起来,Python的`threading`模块虽然不直接支持获取线程函数的返回值,但通过自定义线程类和辅助方法,我们可以实现类似的功能。这种实现方式可以用于监控并行任务的状态,从而更好地控制和管理多线程程序的执行...
本文将详细介绍如何在C# WinForm中实现子窗口的返回值处理以及窗口取消的处理。 首先,我们需要创建一个子窗口类。这个类通常是继承自`System.Windows.Forms.Form`的。在子窗口中,我们可以定义一些属性或者方法来...
1. 当设计自定义函数时,应确保其参数和返回值的类型清晰明确,以避免类型转换错误。 2. 对于大型项目,应进行适当的功能模块化,将复杂的逻辑分解为多个小函数。 3. 在可能的情况下,优先使用已有的内置函数,因为...
除了内置Result类型,Struts2还允许自定义Result类型,以满足更复杂的业务需求。开发者可以通过实现`com.opensymphony.xwork2.Result`接口或继承`com.opensymphony.xwork2.DefaultResult`抽象类来自定义Result类型。...
在这里,`currentActivity`是当前启动新Activity的Activity,`TargetActivity`是我们要启动的带有返回值的Activity,`REQUEST_CODE`是一个自定义的int值,用于在onActivityResult()中区分不同的启动请求。...
在描述中提到的博文链接中,作者可能详细讲解了如何使用`window.open`来创建自定义弹窗,并从弹出窗口中获取返回值。通常,我们不能直接从`window.open`的返回值获取用户在新窗口中的操作,因为返回的是一个`Window`...
标题中的“有返回值的线程”指的是在编程中如何在线程执行完后获取到一个结果。线程通常用于执行异步任务,而当我们需要这些任务执行的结果时,就需要用到带返回值的线程机制。Java语言中,可以通过实现`Callable`...
在WCF中,参数和返回值可以是各种类型,包括基本类型、自定义对象、数组等。对于复杂类型的参数,如自定义对象,我们需要确保服务端和客户端有相同的定义。例如,如果我们有一个`Person`类,那么在服务端和客户端都...
返回值可以是单一的数值、记录集或者复杂的自定义类型。 1. **性能提升**:因为存储过程在首次创建时会被编译成服务器内部的执行计划,所以后续调用时无需再次编译,从而提高了执行速度。 2. **安全性增强**:存储...
这里将x和y相加的结果赋值给函数返回值。 3. **调用函数**:在VBA的其他部分,你可以像调用内置函数一样调用自定义函数。例如: ```vb Sub Test() Dim result As Integer result = AddNumbers(3, 5) MsgBox ...
本示例中的主题是“vc++调用python源码(带返回值)测试”,这涉及到微软的Visual C++(vc++)作为C++的IDE,如何通过交互方式调用Python脚本,并接收返回值。这种技术通常被称为语言间互操作或封装,它允许开发者利用...