Apache Struts 2是一个基于servlet的可扩展框架,在其架构中实现了模型 - 视图 - 控制器(MVC)模式,用于创建企业级Java Web应用程序。
SessionMap 与 Map 在 Struts 2 中使用会话有优势吗?
在 Web 应用程序中使用 SessionMap 相对于 Map 进行会话有什么优势吗? 我发现的一个优点是,您可以使 SessionMap 无效,但不能使 Map 无效。
我是 Struts 2 和 OGNL 的新手,正在制作一个带有注册页面的简单 Web 应用程序。有两个字段,密码和重新密码(重新输入密码)并使用验证框架...
Struts 2 中的 session 和 JSP EL 中的 sessionScope 相同吗?
公共类LoginAction扩展ActionSupport { 私有字符串用户名; 私有字符串密码; @覆盖 公共字符串execute()抛出异常{ ActionContext ct...
如何映射使用 Spring Boot 和嵌入式 Tomcat 运行的 Struts 2 操作?
我正在将 Struts 2 应用程序迁移到 Spring Boot。我在我的应用程序引导类中定义了 StrutsPrepareAndExecuteFilter。 @SpringBootApplication 公共类 ClearApplication 扩展
如何映射使用 Spring Boot 运行的带有嵌入式 Tomcat 的 Struts 2 操作?
我正在将 Struts 2 应用程序迁移到 Spring Boot。我在我的应用程序引导类中定义了 StrutsPrepareAndExecuteFilter。 @SpringBootApplication 公共类 ClearApplication 扩展
带有 Struts Filter 和 Tomcat 的 Spring Boot
我正在将 Struts 2 应用程序迁移到 Spring Boot。我在我的应用程序引导类中定义了 StrutsPrepareAndExecuteFilter。 @SpringBootApplication 公共类 ClearApplication 扩展
在 Struts 2 中使用自动完成功能后,没有为操作和结果“输入”定义结果
我收到错误: 没有为操作和结果“输入”定义结果。 直到我使用 Struts 2 自动完成时它才出现。 这是我的自动完成代码: 我收到错误: 没有为操作和结果“输入”定义结果。 直到我使用 Struts 2 自动完成时它才出现。 这是我的autocomplete代码: <s:form class="form-horizontal" style="margin:0 auto" role="form" theme="simple" action="Reports_open_cases"> <h4>Open Cases</h4> ..some controls here <div class="form-group"> <div class="col-xs-12 col-sm-4 col-md-4"></div> <div class="col-xs-12 col-sm-4 col-md-4" > <s:url id="advURL" action="xyz_action"/> <sj:select id="abc" name="abc" selectBoxIcon="true" href="%{advURL}" list="list_abc" listValue="name" listKey="Id " autocomplete="true" cssClass="form-control" /> </div> <div class="col-xs-12 col-sm-12 col-md-12 pull-right" style="text-align:right"><br> <div class="modal-footer" style="margin:0px; padding:10px 0px 10px"> <button class="btn btn-success" type="submit">Generate</button> <button class="btn btn-default" type="Reset">Reset</button> </div> </div> </s:form> 我的struts.xml(行动): <constant name="struts.devMode" value="true" /> <constant name="struts.multipart.maxSize" value="20000000" /> <package name="login" extends="struts-default,json-default" namespace="/"> <interceptors> <interceptor class="vercelon.actions.LoginInterceptor" name="loginInterceptor"> </interceptor> <interceptor-stack name="loginStack"> <interceptor-ref name="loginInterceptor"/> <interceptor-ref name="defaultStack"/> <interceptor-ref name="fileUpload"><param name="maximumSize">10485760</param> </interceptor-ref> </interceptor-stack> </interceptors> <action name="Reports_open_cases" class="vercelon.actions.Report" method="Generate_OpenCases"> <result name="success">/CMS/Reports_OpenCases.jsp</result> <result name="ERROR">/Error.jsp</result> <result name="input">/CMS/Reports_Menu.jsp</result> </action> <action name="xyz_action" class="vercelon.actions.Report" method="loadreports"> <result name="success" type="json"></result> </action> 除了将下拉菜单替换为自动完成之外,我没有进行任何其他更改。 当我将输入添加到我的struts.xml时,它不会显示此错误。但为我的表单定义的操作也不起作用。 我不明白添加此自动完成功能后需要在哪里进行更改。 当您从视图层调用某些操作时,拦截器会在操作执行之前运行。 似乎您的操作使用默认堆栈,其中包括 validation 和 workflow 拦截器。第一个拦截器对扩展 ActionSupport 的操作执行验证,第二个拦截器检查是否存在错误,然后返回 INPUT 结果。 但是,如果您在操作类上使用一些-validation.xml或基于注释的验证,那么映射到此类方法的每个操作都会由上面的拦截器进行验证,除非您已将这些拦截器配置为排除方法,或者使用基于前缀的方法验证方法,或跳过验证注释被应用。 所有这些情况都是为了避免对某些操作未使用的代码运行验证器,并且需要避免它们或重新配置拦截器堆栈以在没有这些拦截器的情况下运行。 在您的情况下,返回 json 结果的操作不需要验证字段而不是 term。如何配置和覆盖相关操作的拦截器配置:如何在同一页面上获取结果,为什么需要输入?. 使用 将 JSON 结果作为自动完成器的选择框的工作示例。 Autocompleter的源代码示例中使用的操作源代码。
在 Struts 2 中使用自动完成功能后,没有为操作定义结果
我收到错误: 没有为结果输入的操作定义结果。 直到我使用 Struts 2 自动完成时它才出现。 这是我的自动完成代码: 我收到错误: 没有为结果输入的操作定义结果。 直到我使用 Struts 2 自动完成时它才出现。 这是我的autocomplete代码: <s:form class="form-horizontal" style="margin:0 auto" role="form" theme="simple" action="Reports_open_cases"> <h4>Open Cases</h4> ..some controls here <div class="form-group"> <div class="col-xs-12 col-sm-4 col-md-4"></div> <div class="col-xs-12 col-sm-4 col-md-4" > <s:url id="advURL" action="xyz_action"/> <sj:select id="abc" name="abc" selectBoxIcon="true" href="%{advURL}" list="list_abc" listValue="name" listKey="Id " autocomplete="true" cssClass="form-control" /> </div> <div class="col-xs-12 col-sm-12 col-md-12 pull-right" style="text-align:right"><br> <div class="modal-footer" style="margin:0px; padding:10px 0px 10px"> <button class="btn btn-success" type="submit">Generate</button> <button class="btn btn-default" type="Reset">Reset</button> </div> </div> </s:form> 我的struts.xml(行动): <constant name="struts.devMode" value="true" /> <constant name="struts.multipart.maxSize" value="20000000" /> <package name="login" extends="struts-default,json-default" namespace="/"> <interceptors> <interceptor class="vercelon.actions.LoginInterceptor" name="loginInterceptor"> </interceptor> <interceptor-stack name="loginStack"> <interceptor-ref name="loginInterceptor"/> <interceptor-ref name="defaultStack"/> <interceptor-ref name="fileUpload"><param name="maximumSize">10485760</param> </interceptor-ref> </interceptor-stack> </interceptors> <action name="Reports_open_cases" class="vercelon.actions.Report" method="Generate_OpenCases"> <result name="success">/CMS/Reports_OpenCases.jsp</result> <result name="ERROR">/Error.jsp</result> <result name="input">/CMS/Reports_Menu.jsp</result> </action> <action name="xyz_action" class="vercelon.actions.Report" method="loadreports"> <result name="success" type="json"></result> </action> 除了将下拉菜单替换为自动完成之外,我没有进行任何其他更改。 当我将输入添加到我的struts.xml时,它不会显示此错误。但为我的表单定义的操作也不起作用。 我不明白添加此自动完成功能后需要在哪里进行更改。 当您从视图层调用某些操作时,拦截器会在操作执行之前运行。 似乎您的操作使用默认堆栈,其中包括 validation 和 workflow 拦截器。第一个拦截器对扩展 ActionSupport 的操作执行验证,第二个拦截器检查是否存在错误,然后返回 INPUT 结果。 但是,如果您在操作类上使用一些-validation.xml或基于注释的验证,那么映射到此类方法的每个操作都会由上面的拦截器进行验证,除非您已将这些拦截器配置为排除方法,或者使用基于前缀的方法验证方法,或跳过验证注释被应用。 所有这些情况都是为了避免对某些操作未使用的代码运行验证器,并且需要避免它们或重新配置拦截器堆栈以在没有这些拦截器的情况下运行。 在您的情况下,返回 json 结果的操作不需要验证字段而不是 term。如何配置和覆盖相关操作的拦截器配置:如何在同一页面上获取结果,为什么需要输入?. 使用 将 JSON 结果作为自动完成器的选择框的工作示例。 Autocompleter的源代码示例中使用的操作源代码。
如何通过 JavaScript 将对象从前端传递到 Struts 2 后端?
我尝试通过 JavaScript 将字段的值发送到 Struts 2 后端,但它返回 NullpointerException。 我尝试通过 JavaScript 将字段值发送到 Struts 2 后端,但它返回 NullpointerException。 <input type="hidden" id="employee.payslip.id" name="employee.payslip.id" value="5"/> .... 表单提交后,请求将被发送到以下 JavaScript 方法以发送到后端。 function payslipPayment(){ var formValues = $('#myform').serialize(); .... xmlhttp.open("get","../payslip/pay?"+formValues,false); xmlhttp.send(); } 请求将按如下方式创建并发送 http://localhost/payslip/pay/employee.payslip.id=5&employee.payslip.year=2013&.... 但是,在后端,当我尝试显示该值时,它返回NullPointerException。 Java: public class payslip { private Employee employee; public String pay{ System.out.println("Id:"+employee.payslip.id): System.out.println("Year:"+employee.payslip.year; ... } getter and setter } 课程: public class Employee { private Payslip payslip; .... getter and setter } public class Payslip{ private long id; ... getter and setter } 空指针异常表示员工或工资单未初始化。如果您使用的是 struts2,那么使用参数拦截器和模型驱动方法应该可以解决您的问题。 您需要将表单转换为json(如here)并发送到后端 然后 - 在java中你需要将json反序列化为java对象(例如,使用Jackson) 你可以像Alexey所说的那样,或者你可以遵循这种方法。您可以使用 ServletRequestAware 和 ServletResponseAware 接口,然后使用 request.getParameter() 获取传递的值。以下是如何执行此操作的示例。 Action类struts配置 <action name="hello" method="execute" class="com.home.struts2.HelloAction"> <result name="success">hello.jsp</result> </action> 动作课 public class HelloAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{ HttpServletResponse response; HttpServletRequest request; public String execute() { System.out.println("AjaxCall" + request.getParameter("param")); String infoXml = "Parameter passed: " + request.getParameter("param"); response.setContentType("text/html"); response.setHeader("Cache-Control", "no-cache"); try { response.getWriter().write(infoXml); } catch (IOException ioe) { ioe.printStackTrace(); } return null; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public HttpServletRequest getServletRequest() { return this.request; } } JavaScript var xmlHttp; function sendreq(){ var URL = "hello.action?param=sandy"; try{ xmlHttp=new XMLHttpRequest(); }catch (e){ try{ xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }catch (e){ try{ xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){ alert("Your browser does not support AJAX!"); return false; } } } xmlHttp.onreadystatechange = showMessage; xmlHttp.open("GET", URL, true); xmlHttp.send(null); } 实现员工和工资单的可序列化接口。另外,请确保两者都有空的构造函数。 启用 struts2 devMode 以获取附加日志。启用后,您将看到 OGNL 异常,了解具体是哪个字段出现问题。该错误必须非常容易处理。 http://www.mkyong.com/struts2/struts-2-development-mode-example/ 我猜用于该操作的拦截器堆栈存在一些问题,只需尝试使用defaultStack。 <action name="payslip/pay" class="..."> <interceptor-ref name="defaultStack"/> <result name="success">/success.jsp</result> <result name="input">/error.jsp</result> </action> 您使用的是框架还是普通的 servlet?如果您使用的是像 struts 这样的框架,那么所有这些答案都太复杂了。 从外观上看,我认为您只是使用了映射的 servlet,这意味着上面关于通过 url 传递命名参数的答案是正确的。您可以使用 post 来隐藏这些命名参数,而不是 get through。 以下是我仅使用 servlet 的方法。不过,如果我是你并且正在做一个完整的项目,我会使用 JSF,以便更轻松地传递数据。 java public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String payslipID = request.getParameter("payslipid"); } js <script> var payslipid = $('#employee_payslip_id') xmlhttp.open("POST","../payslip/pay",false); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("payslipid="+payslipid); </script> 正如另一篇文章中提到的,您必须单独获取(并放置在帖子中或获取数据)所有参数,除非您执行了一些单独的字符串列表。这样做并不是一件荒谬的事情,因为无论如何您都需要将所有这些值分离到 java 中它们自己的变量中。 编辑: 上面的答案实际上说明了您需要做什么,但也许它会有助于使其更清楚。在您定义操作的 struts 配置文件中,例如 <action class="org.example.Payslip" name="payslip"> <interceptor-ref name="params"/> <result name="success">/success.jsp</result> </action> 确保那里有参数拦截器。它将使得服务器将参数映射到设置器。这样您就不需要为您发送的每项内容进行 getparameter 调用。 此外,如果您按照上面的方式进行了映射,则网址应该类似于 .../payslip.action!pay?payslipid=1234&employeeid=1234。这告诉它使用 payslip.class 和 pay 函数。 在action标签中添加输入参数;它允许您将参数从 struts 操作类传递到 form/.jsp struts.xml <action name="..." class="UserAction"> <param name="id"></param> <result name="input">/WEB-INF/jsp/User.jsp</result> </action> 动作课 public class UserAction { private int id; // this is called by the struts.xml to set the value public void setId(int id) { this.id = id; } //a getter is needed as well to display value in the .jsp } 因为它是一个隐藏变量,不是值堆栈的一部分,您可以尝试以这种方式传递它。 如果这不是您的问题; 我认为你必须将 bean 注入到 Action 类中。 @注入员工; bean 到 Action 类中会有帮助。 还调试值堆栈。 Struts2 使用 params 拦截器来填充 HTTP 请求提交的表单值。 建议使用POST方法,因此如果您有敏感数据并且希望它不反映在URL中。 拦截器使用参数名称通过 OGNL 运行时来评估应该在 valueStack 中找到 引用的表达式。 你已经得到了NullPointerException,因为你没有初始化或注入依赖关系到由 OGNL 评估引用的对象。因为您使用的是嵌套 bean,所以所有嵌套属性都应该是可访问和初始化的(或者至少 Struts2 知道如何创建这些对象),并且属于放置在值堆栈的 top 上的操作类。 您需要使用ModelDriven接口。实现 ModelDriven 并重写其方法,然后使用 modelDriven 的方法返回您的对象。 Struts2 文档
如何使用 Struts 2 将多个文本字段放置在同一行而不使用 theme="simple"?
我想使用 Struts 2 设计一个在同一行显示用户 ID 和密码的网页。 如何在不使用 theme='simple' 的情况下管理它? <%@taglib uri="/struts-tags" prefix="s&
我一直在尝试制作一个注册页面,该页面需要 3 个值 ID、NAME、密码。我心里有一些想法,但我无法完成这个项目。 请有人能提供一些线索吗...
如何使用 <s:iterator> 迭代 HashMap 键并在 Struts 2 中打印列表值?
我有一个像这样定义的HashMap linkcategory = new HashMap>(); 正如您所看到的,每个键都指向一个 List 对象。当我尝试迭代...
如何在 Struts 2 中使用 Tuckey URL 重写?
我想重写基于 Struts 2 的应用程序的 URL(当前在开发环境中)。我搜索了它并找到了 Tuckey URL Rewrite 并将其设置在我的项目中。 现在,我想要...
如何使用按钮将值传递给操作而不是 Struts 2 中的 href 链接?
我有一个 href 链接,它将一些值传递给 Struts 2 中的操作类。
如何在 Struts 2 中将一些文本加载到 JSP 页面上?
我正在尝试将一些文本加载到 JSP 页面上。我真的不知道该怎么做。我正在使用 Struts 2,因此我可以使用它的标签。 这是正文中唯一的一行: 我正在尝试将一些文本加载到 JSP 页面上。我真的不知道该怎么做。我正在使用 Struts 2,所以我可以使用它的标签。 这是正文中唯一的一行: <s:property value="myTextToAdd" /> 我知道,这没什么好继续的,但我现在不知道该问什么。我只是希望能够调用 Java 类并让它返回我想要的 JSP 页面的文本。 首先,确保使用 Action -> JSP 流程。这允许为浏览器响应准备/呈现 JSP,因此它已经通过 Struts 标签(如 property 标签)填充了数据。在操作类中,您创建一个要通过 property 标签打印出来的属性。 private String myTextToAdd; //getter public String getMyTextToAdd(){ return myTextToAdd; } //setter you need if you want to submit it, could be here 然后在行动中你应该做类似的事情 public String execute(){ myTextToAdd = "Some text to out"; ... return SUCCESS; } SUCCESS 结果应返回 dispatcher 结果类型,这是默认值。您还配置了操作以将某些 URL 和结果映射到它。然后您可以使用 property 标签来输出该值。 参见 Struts2 tutorial 的详细解释。 这是 struts 2 的一些简单教程 Struts 2 Hello World 它将为您提供基本的启动介绍。试试这个也许你会对struts2有一些了解
如何使用 Struts 2 中操作中的 ArrayList 值填充 <s:select> 标记的值?
我正在开发一个简单的 Struts 应用程序。在我的 JSP 中,我有一个下拉列表框(使用 标签)。我需要用操作类中的 ArrayList 值填充这些值。我怎样才能做到这一点?
如何将 Map<ObjectA, List<ObjectB>> 传递给 Struts 2 中的操作?
我有一个事件对象,里面有一个Map>,ObjectA是标签,List是表格行。使用以下代码,我可以显示表格
我正在学习 JavaBrains 教程,完成课程后,我运行了该应用程序,但出现了异常。 汤姆猫日志: 严重:启动过滤器 struts2 时出现异常 原因:无法加载