Apache Struts 2是一个基于servlet的可扩展框架,在其架构中实现了模型 - 视图 - 控制器(MVC)模式,用于创建企业级Java Web应用程序。
我想知道,是否可以动态地将值设置为静态参数 动态价值在这里 我想知道,是否可以动态地将值设置为静态参数 <action name="TestApp_*" class="test.TestApp" method="{1}"> <param name="app_Id">Dynamic value here</param> <result name="input">WEB-INF/jsp/test/testView.jsp</result> </action> 我试过了 <action name="TestApp_*" class="test.TestApp" method="{1}"> <param name="app_Id">${app_Id}</param> <result name="input">WEB-INF/jsp/test/testView.jsp</result> </action> 不工作。它将 ${app_Id} 显示为常规文本。 请注意,它显示 ${app_Id} 作为常规文本到底是什么意思。Struts2 提供了这种灵活性,您可以动态设置 param 值。 您只需在操作类中设置这些值,即可将它们用作占位符。 public class MyAction extends ActionSupport { private int app_Id; public String execute() { // you execute logic this.app_Id= 123; return SUCCESS; } // getter and setter for app_Id } 您可以在结果配置中使用此app_Id <action name="TestApp_*" class="test.TestApp" method="{1}"> <param name="app_Id">${app_Id}</param> <result name="input">WEB-INF/jsp/test/testView.jsp</result> </action> 您可以获得更多详细信息配置结果中的参数 您可能已经(错误地)手动编写了 getter,而不是让 IDE 为您完成。 变量app_Id;必须有一个吸气剂getApp_Id(),而你可以有类似getapp_Id()或get_app_Id()之类的东西......但是如果你不发布你的操作代码,我们怎么知道它?! 此外,考虑更改变量(从现在开始)以尊重约定,即希望它们采用驼峰式命名,而不是下划线分隔...然后 appId 表示变量,getAppId() 表示 getter。 尝试这样做.. <result type="redirect"> <param name="location">WEB-INF/jsp/test/testView.jsp</param> <param name="inputName">app_Id</param> </result> 在jsp页面中你可以直接使用这个值就像 <s:properties value="app_Id"> 试试这个。 看看staticParams拦截器。 此拦截器使用操作配置中定义的静态参数填充操作。如果操作实现了Parameterizable,静态参数的映射也将直接传递给操作。静态参数将添加到请求参数映射中,除非 merge 设置为 false。 参数通常使用 <param> 中的 struts.xml 元素定义。 它展示了如何将此拦截器配置到您的操作配置中。 例如: <action name="someAction" class="com.examples.SomeAction"> <interceptor-ref name="defaultStack"> <param name="staticParams.parse">true</param> <param name="staticParams.overwrite">false</param> </interceptor-ref> <param name="num">${numValue}</param> <result name="success">good_result.ftl</result> </action> 这使得拦截器能够从操作配置中解析 OGNL 表达式的参数值。
Struts 2 - 当第二个操作与表单一起使用时,操作之间传递的参数会丢失
我有两个动作类,它们通过 ModelDriven 接口使用相同的模型。 每个动作类别都与形式有关。 我需要在两个操作中将值存储到同一模型。 从第一堂动作课开始(...
javax.servlet.ServletException:org.apache.jasper.JasperException:无法编译JSP类
在尝试运行我的示例项目时,出现以下错误: HTTP 状态 500 - -------------------------------------------------- ------------------------------------------ 类型异常报告 信息
我正在将一些旧的遗留应用程序升级到 Maven。这些应用程序在传统的 WebSphere Application Server 8.5.5 中运行,我使用 Eclipse 4.16.0 来运行 WAS 服务器。 它只编译...
我想通过访问 Struts 2 值堆栈中的属性来使 titleKey 属性参数化。所以,我想做这样的事情: 我想通过访问 Struts 2 值堆栈中的属性来使 titleKey 属性参数化。所以,我想做这样的事情: <display:table name="myListOfObjects" id="myId" requestURI="/myAction.action" pagesize="10"> <display:column property="myProperty" titleKey="my.internationalyzed.i18n.key.myProperty.<s:property value='anotherObject.aProperty'/>" /> ... 如您所见,我想在我的操作中访问公开对象的属性 <s:property value='anotherObject.aProperty'/> 并将值放入 titleKey 元素中。 如果我这样做,结果是一个表列,其标题为未解析的 my.internationalyzed.i18n.key.myProperty 字符串。换句话说,<s:property> 标签不会在 <display:column> 元素内部进行解释。 但是如果我把 <s:property value='anotherObject.aProperty'/> 在 <display:table> 元素之外,它会被正确解析,并且结果值会显示在页面上,因此属性会被正确公开和赋值。 您知道如何从 <display:column> 元素内部访问操作中公开的属性吗? 您可以在非struts标签内使用JSP EL表达式,因此在查看请求范围时表达式将要求请求公开值堆栈。例如 <display:column property="myProperty" titleKey="my.internationalyzed.i18n.key.myProperty.${anotherObject.aProperty}" />
我有一个工作显示标签单选按钮,代码如下。下面是代码: 我有一个工作显示标签单选按钮,代码如下。下面是代码: <s:form action="deleteUser.action" method="post"> <display:table id="conf" name="users" requestURI="viewUsers.action" pagesize="10"> <display:column title="Edit" scope="request"> <input type="radio" name="selectedUser" value="${conf.username}" onclick="getValue()" /> </display:column> <display:column property="username" title="User Name" /> <display:column property="email" title="Email" /> <display:column property="role" title="Role" /></display:table><s:submit method="deleteUser" key="Delete User" align="center" /> </s:form> 我已将 strtus2-core-2.3.4.jar 升级为 strtus2-core-2.3.14.jar 和其他一些罐子。 现在,当我选择一个单选按钮并单击“提交”时,我没有获得该单选按钮的基础值,而是将 ${conf.username} 放入我的 POJO 字段中。有人遇到过这个吗?我缺少任何库吗? 您可以从中获取值 <display:table uid="row" id="conf" name="users" requestURI="viewUsers.action" pagesize="10"> <display:column title="Edit" scope="request"> <input type="radio" name="selectedUser[%{#attr.row_rowNum - 1}]" value="<s:property value="%{#attr.row.username}"/>" onclick="getValue()" /> 至selectedUser列表。 ${} 用于 EL 表达式引用尚未放入请求或会话等的属性。
如何将 Spring Boot 应用程序与 Struts 2 集成
我们使用 Maven 制作了一个 Spring Boot 应用程序,以通过 OIDC/OAuth2 Connect Client 功能启用登录。该应用程序基于 Spring Security 5 和 Java 1.8。我们还有一个 Struts2 网络
在 Apache Struts 中,如何在不编写 Action 类的情况下重定向到外部 URL?
在我的 Struts 应用程序中,我需要创建一个端点 (URL),它只是告诉用户的浏览器重定向到外部 URL。 看起来这可以通过创建一个新的 Action 类来完成,并且
我正在尝试在Struts 6.2.0项目中实现CSRF。 struts.xml 我正在尝试在 Struts 6.2.0 项目中实现 CSRF。 struts.xml <package name="struts-security" abstract="true" extends="struts-default"> <interceptors> <interceptor-stack name="defaultSecurityStack" /> <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor" /> <interceptor name="tokenSessionStore" class= "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" /> </interceptors> <default-interceptor-ref name = "defaultSecurityStack" /> <global-results> <result name="error">/error401.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception" /> </global-exception-mappings> LoginAction.java @Namespace("/common") @Action("Login") @InterceptorRefs({ @InterceptorRef("token"), @InterceptorRef("tokenSessionStore") }) @Results({ @Result(name = "input", location = "login.Login", type = "tiles"), }) login.jsp <%@ taglib prefix="s" uri="/struts-tags"%> <s:form method="post" validate="true" theme="simple" name="form" id="paraFrm" > <s:token /> 它回来了invalid.token。因为我添加了返回页面,所以它重定向到错误页面。是否需要额外的代码来在操作页面或任何其他地方实现令牌。请重新打开它,因为旧的标记问题对我没有帮助。 要使用struts.xml中定义的拦截器,您应该添加注释 @ParentPackage("struts-security") 您正在尝试使用 tokenSession 拦截器。 tokenSession拦截器: 此拦截器基于 TokenInterceptor 构建,提供处理无效令牌的高级逻辑。与普通的令牌拦截器不同,该拦截器将尝试在使用同一会话的多个请求的情况下提供智能故障转移。也就是说,它将阻止后续请求,直到第一个请求完成,然后它不会返回 invalid.token 代码,而是尝试显示与未提交多个请求时原始有效操作调用将显示的相同响应首先。 示例代码: <action name="someAction" class="com.examples.SomeAction"> <interceptor-ref name="tokenSession/> <interceptor-ref name="basicStack"/> <result name="success">good_result.ftl</result> </action> <-- In this case, myMethod of the action class will not get checked for invalidity of token --> <action name="someAction" class="com.examples.SomeAction"> <interceptor-ref name="tokenSession> <param name="excludeMethods">myMethod</param> </interceptor-ref name="tokenSession> <interceptor-ref name="basicStack"/> <result name="success">good_result.ftl</result> </action> 正如您在示例中看到的,您缺少一些基本的拦截器。
我在 Windows Server 和 Mac OS 上使用 Tomcat 8 或 9 成功部署了 ROOT.war。但是当我在 Ubuntu VPS 上部署它时,我收到以下错误: 2023 年 5 月 17 日 23:28:21.127 信息 [主要] org.apache.
字面上导致 StackOverflowError - Tiles 3
从 Struts 1.3/Tiles 1.x 组合迁移到 Struts 2/Tiles 3。 但这确实是一个 Tiles 问题 以前有支持定义内的bean声明来支持
Struts2 + Bootstrap 数据表:如何在不加载所有数据的情况下分页
我在一些使用 Struts2 框架的应用程序中工作,在操作中我加载了一些列表中我们需要的所有数据,然后在 JSP 文件中迭代并显示在 中 我在一些使用 Struts2 框架的应用程序中工作,在操作中我加载了一些我们需要的所有数据 List<Object> 然后在 JSP 文件中,这个列表被迭代并使用引导框架显示在数据表中。 这很好用,但我知道如何在不在生成的 HTML 中加载完整数据的情况下执行此操作,就像我有 1.000.000(一百万)条记录一样。 我不希望所有记录都在 JSP 的结果 HTML 输出中,只有前 10 个记录,如果需要,则使用分页加载(使用 jQuery?)其余数据集。 添加到 Enrique San Martín 的评论中:http://legacy.datatables.net/usage/server-side 任何好的例子都应该使用iDisplayStart和iDisplayLength参数,当然还有"bServerSide": true的datatable()属性。 这里是博客文章的链接:使用 Ajax 将 jQuery 数据表与 Struts2 操作类结合使用。 好吧,这是一个很好的方法,但我必须将 request.getParameter 转换为 struts 变量(声明为私有,然后生成 getter 和 setter): 来自:https://datatables.net/development/server-side/jsp edit:此链接有一些 request.gP,其中包含数据表中的旧值,而我们必须使用以下参数: https://datatables.net/manual/server-side#Sent-parameters 喜欢一个动作: private String draw; private String length; private String order; private String search; private String start; getters&setters{} //or make it public 然后在 ajax 调用的 actionMethod 中查询数据库并返回数据集。 当我使用 struts2+datatables 进行完整分页时,我将编辑这个答案, 在数据表中有一些必要的配置(参见datatables.net的文档): <script> $(document).ready( function() { $('#datatable').dataTable( { "iDisplayLength": 5, "processing": true, "serverSide": true, "ajax": "paginateTableAction" } ); } ); </script> 最好的方法是在您的 DAO 中创建一个方法,该方法具有附加参数开始和结束,例如: getCustomers( int start,int end){ // get all customers // sublist the result and get the data from start index to end index } 在您的控制器中,您将做几乎相同的事情,您将通过 start 或 end 请求提供 POST 和 GET 参数 @RequestMapping(value = "/sublistedCustomers", method = RequestMethod.GET) public String getSublistedCustomers(@RequestParam("start") final int start,@RequestParam("end") final int end){ model.addAttribute("cutomersResult",yourDAO.getCustomers(start,end)); } 现在您的 JSP 文件中有一部分客户记录,您可以决定如何显示此子列表结果。
为什么 Struts-2 的 tiles 模板被称为“插件”而不是库?
插件为现有程序添加功能,库用于软件开发。 我们使用struts-2中的tiles-framework来开发像jdbc-api这样的应用程序,那它们为什么调用...
Struts2 映射 save.action\param1 alue1\param2 alue2 到 action
我们在 Tomcat 9 上使用 Struts 6.2,并将所有 .action 扩展映射到操作,例如 save-user.action 正确映射到操作。 Web 应用程序也需要处理这个 URL:save-user。
如何使用struts2 s:set variable inside s:select tag for list values?
我想在 s:select 中使用 s:set 变量: 纽约 我想在里面使用一个s:set变量s:select: <s:set var="cityNY">NewYork</s:set> <s:select name="cities" list="#{'%{#cityNY}':'%{#cityNY}'}" required="true" /> 上面只是在我的页面中打印相同的值 - %{#cityNY} 想要在 s:set 标签的选项中显示 if s:select 变量的值 您需要将上下文变量直接放入 OGNL 表达式而无需%{}。它将实例化一个地图。 <s:select name="cities" list="#{#cityNY:#cityNY}" required="true" /> list 属性值可以包含 OGNL 表达式。它默认用于解析 OGNL 的值而无需显式%{}。可以在 OGNL 表达式中直接引用子表达式。 #{exp1:exp2} 是一个 OGNL 表达式来实例化一个 Map。它里面有子表达式。每个子表达式应该返回一个不是集合的值。因为他们曾经为地图创建一个键/值对。 如果您使用相同的子表达式,那么最好使用以下代码实例化一个List <s:select name="cities" list="{#cityNY}" required="true" /> 它将生成一个 HTML <select> 标签,其中有一个 <option> 具有相同的值和文本。 如果您需要更多选项,那么您应该使用逗号向 OGNL 表达式添加值。 您可以在我对 OGNL/Struts2 JSP assigning bean to an object. 的回答中找到参考文档
如果我的动作类如下: 包 org.tutorial.struts2.action; 导入 java.util.Map; 导入 org.apache.struts2.interceptor.RequestAware; 导入 org.tu ...
我是 Struts2 框架的新手,我正在尝试添加一些配置属性,如 applicationId、timeout 等,这些属性将用于调用一些第 3 方 API。在一个Springboot项目中,我们...
在 Java 应用程序的内存中保存从密码库 (CyberArk) 检索到的纯文本密码是否安全?
我有一个具有图像上传功能的应用程序,图像存储在基本上是 SFTP 服务器的第 3 方服务上。访问此存储的凭据最初是硬
404 在 Tomcat 上通过 eclipse 运行项目时
我有一个具有以下目录结构的 Struts 2 项目。但是当我尝试在 Tomcat 7 上使用 Eclipse 运行这个项目时,它给了我 404 错误。 结构体.xml: 我有一个具有以下目录结构的 Struts 2 项目。但是当我尝试在 Tomcat 7 上使用 Eclipse 运行这个项目时,它给了我 404 错误。 Struts.xml: <?xml version="1.0" encoding="UTF-8"?> <struts> <action name="login" class="com.actions.LoginAction" method="execute"> <result name="success">/jsp/login.jsp</result> </action> </struts> login.jsp: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Login Page</title> </head> <body> <s:form action="login" method="post"> Login name : <input type="text" value="name"/> </s:form> </body> </html> 在路径 http://localhost:8080/StrutsPro/jsp/login.jsp 上运行时,会出现 HTTP 404 错误。 改为检查 web.xml。 否则将所有 .jsp 文件放在 WebContent 文件夹中 根据您的代码结构,您的项目屋顶文件夹中没有 index.jsp/html。在运行服务器时,默认情况下它会首先找到 index.html/jsp。如果它不可用,它将返回 404 错误。要解决此问题,您可以在 web.xml 文件中添加以下行, <welcome-file-list> <welcome-file>/jsp/login.jsp</welcome-file> </welcome-file-list> 保存所有更改并运行服务器。如果问题再次存在,您必须检查 Struts 配置文件和构建路径。 你的项目真奇怪 顺便说一句,你必须: 在你的struts.xml中声明一个<package>;动作不要直接进入 <struts> 元素; 给那个包"/StrutsPro"命名空间; 在您的 LoginAction 中声明一种检查用户凭据的方法(然后 execute() 将打开 JSP 页面以供用户填写,例如 tryToLogin() 将接收来自 POST 的数据并尝试根据数据库验证它们);或者,您可以使用两种方法指定两个不同的 Action 而不是一个 Action,这取决于您; 在您的<s:submit />中放置一个<s:form>按钮,以将数据发送到登录方法/操作; 调用指向您的操作的 url,而不是您的 JSP。 JSP就是视图,它总是由控制器返回,在Struts2中就是Action。您运行 Action,Action 会为您提供已评估的 JSP。你不运行 JSP. 例如,您应该调用:http://localhost:8080/StrutsPro/login.action 或 http://localhost:8080/StrutsPro/login.do ,根据您在 web.xml 中给 Actions 的扩展名 试试这个答案: 登录.jsp <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Login Page</title> </head> <body> <s:form action="login" method="post"> Login name : <s:textfield name="name"/> <s:submit value="Click Me" name="Click Me"></s:submit> </s:form> </body> </html> struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="com.actions.LoginAction"> <result name="success">/jsp/login.jsp</result> </action> </package> </struts> LoginAction.java private String name; //Create setter and getter methods for NAME. public String execute(){ return SUCCESS; } 您可以保存所有更改并重新启动服务器。要访问您输入网址的页面http://localhost:8080/StrutsPro/login.action 希望这对你有帮助。 我是 struts 的新手,我遇到了同样的错误。与 404 一起,在控制台中,它有 UnableToLodaConfiguration 错误,尽管我已经放置了正确的 struts.xml 配置。有人建议我将我的工作区从 Desktop 迁移到 C:\,令人惊讶的是它奏效了。 404 状态代码实际上意味着给定 url 的资源不可用。 要从服务器请求资源,请确保其有效且可编译,并在文档中包含 taglib 定义。 <%@ taglib prefix="s" uri="/struts-tags" %> 您不应该直接在 URL 中访问 JSP 页面。使用 action configuration 返回调度程序结果。 <action name="UnderConstruction"> <result>/UnderConstruction.jsp</result> </action>
没有为命名空间 / 和动作名称 register 映射的动作
我正在用 struts 2 做一个简单的网络应用程序。 下面是我的表单和对应的动作类结构。尝试注册新记录时出现以下错误。 注册.jsp <%@ page la...