参数是子程序中使用的一种变量,用于引用作为子程序输入提供的数据。
给定一个函数: def foo(num = 42, bar = 100): 打印(“数字:”,数字) 我如何向 foo 添加代码以了解 foo 是否在没有 num 和/或 bar 参数的情况下被调用?
我想用一些参数调用Action类,但我无法做到这一点。 请建议我如何在应用程序中使用映射 struts.xml 文件传递参数。 我正在使用 Struts2 框架...
在 Struts 2 的 JSP 页面上使用 OGNL 根据条件将 bean 分配给对象
在Struts 2 / OGNL页面中,是否可以根据条件将任何类型的bean分配给对象? 例如, 在Struts 2 / OGNL页面中,是否可以根据条件将任何类型的bean分配给对象? 举个例子, <s:if test"%{customer != null}"> <s:set var="someobject" value="customer"> </s:if> <s:else> <s:set var="someobject" value="user"> </s:else> 是的,可以。但你确定你应该这样做吗? 这似乎是业务,而不是表示,因此为什么在视图中而不是在控制器中? 而不是 <s:if test"%{customer != null}"> <s:set var="someobject" value="customer"> </s:if> <s:else> <s:set var="someobject" value="user"> </s:else> SomeObject is of type : <s:property value="%{#someobject.class.name}" /> 你可以在你的行动中使用 public String getSomeobject(){ return (customer!=null) ? customer : user; } 并且仅在 JSP 中 SomeObject is of type : <s:property value="%{someobject.class.name}" /> 当您的操作对对象一无所知时,您的用例更合适,但随后您将在视图中放入大量业务逻辑... <s:set>标签将变量存储在作为映射的值堆栈上下文中。因此任何对象都可以设置在 var 属性中指定的键下。如果您在带有 <s:set> 标签的页面上频繁使用相同的键,那么它将覆盖之前设置的值。例如 <s:set var="someobject" value="customer"> <s:set var="someobject" value="user"> 之后,如果您使用 user 引用,则只能检索 someobject 对象。 关于参考资料,您可以阅读OGNL文档。 该框架使用标准命名上下文来评估 OGNL 表达式。处理 OGNL 的顶级对象是 Map (通常 称为上下文映射或上下文)。 OGNL 有一个概念 是上下文中的根(或默认)对象。在表达上, 无需任何属性即可引用根对象的属性 特殊的“标记”概念。对其他对象的引用标有 英镑符号 (#)。 使用上面的示例,您可以使用对 someobject 的引用来获取 user 属性 name。 Hello, <s:property value="#someobject.name"/>
我有一个 URL=“deliverable.do?id=123” 单击提交按钮后,它会转到 validate() 方法并找到一些缺失的字段。 然后,当它返回显示问题时(这是......
它现在似乎可以工作了,谢谢。 我的问题是参数似乎在其中一个函数中丢失了。 我在 Windows 7 上使用 Code::Blocks 和 GNU GCC 编译器。 好吧,我有一个功能...
我有以下动作映射: ... 一个 两个 我有以下动作映射: <action name="theAction" ...> ... <param name="param1">one</param> <param name="param2">two</param> ... <param name="paramN">nth-number</param> ... </action> 我可以使用Interceptor中的以下行获取参数映射: Map<String, Object> params = ActionContext.getContext().getParameters(); 如上所述,有没有办法获取拦截器参数,如以下映射中所定义: <action name="theAction" ...> ... <interceptor-ref name="theInterceptor"> <param name="param1">one</param> <param name="param2">two</param> ... <param name="paramN">nth-number</param> </interceptor-ref> ... </action> action 参数定义如下,action 参数和拦截器参数应该是分开访问的。 <action name="theAction" ...> ... <param name="param1">one</param> <param name="param2">two</param> ... <param name="paramN">nth-number</param> .... <interceptor-ref name="theInterceptor"> <param name="param1">one</param> <param name="param2">two</param> ... <param name="paramN">nth-number</param> </interceptor-ref> ... </action> 请注意,我不想在拦截器中将参数字段声明为 //all fields with their getters and setters private String param1; private String param2; ... private String paramN; 在 Dev Blanked 的回答之后,我实施了他的技术。它不起作用,所以我在这里分享我的代码。我使用的是 Struts 2.3.1.2。 图书馆 asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang-2.5.jar freemarker-2.3.18.jar javassist-3.11.0.GA.jar ognl-3.0.4.jar struts2-core-2.3.1.2.jar xwork-core-2.3.1.2.jar 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> <constant name="struts.devMode" value="true" /> <package name="the-base" namespace="/" extends="struts-default" abstract="true"> <interceptors> <interceptor name="header" class="demo.interceptors.HttpHeaderInterceptor"></interceptor> <interceptor-stack name="theStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="header"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="theStack"></default-interceptor-ref> </package> <package name="the-module" extends="the-base"> <action name="theAction"> <result>/the-action.jsp</result> <interceptor-ref name="theStack"> <param name="header.Cache-control">no-store,no-cache</param> <param name="header.Pragma">no-cache</param> <param name="header.Expires">-1</param> <param name="header.arbitrary">true</param> </interceptor-ref> </action> </package> </struts> 拦截器: package demo.interceptors; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.StrutsStatics; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class HttpHeaderInterceptor extends AbstractInterceptor { private final Map<String, String> interceptorConfigs = new HashMap<String, String>(); @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("Calling 'intercept' method."); HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE); for(Entry<String, String> entry: interceptorConfigs.entrySet()) { String header = entry.getKey(); String value = entry.getValue(); System.out.printf("Adding header: %s=%s\n",header,value); response.setHeader(header, value); } return invocation.invoke(); } public Map<String, String> getInterceptorConfigs() { System.out.println("calling method 'getInterceptorConfigs'"); return interceptorConfigs; } public void addInterceptorConfig(final String configName, final String configValue) { System.out.printf("Calling method 'addInterceptorConfig' with params configName = %s, configValue=%.\n",configName, configValue); interceptorConfigs.put(configName, configValue); } } 控制台输出:(当按下theAction时) Calling 'intercept' method. 在您的自定义拦截器中,您可以定义如下所示的地图 private final Map<String, String> interceptorConfigs = new HashMap<String, String>(); public Map<String, String> getInterceptorConfigs() { return interceptorConfigs; } public void addInterceptorConfig(final String configName, final String configValue) { interceptorConfigs.put(configName, configValue); } 然后在您的操作映射中,您可以传入如下参数..这些将存储在拦截器的映射中 <action name="yourAction" class="your.actionClass"> <result name="success">some.jsp</result> <interceptor-ref name="defaultStack"> <param name="yourInterceptor.interceptorConfigs.key">value</param> <param name="yourInterceptor.interceptorConfigs.aParamName">paramValue</param> </interceptor-ref> </action> “yourInterceptor”是指您在将拦截器添加到struts.xml时指定的拦截器的名称。当像上面那样配置时,拦截器内的“interceptorConfigs”映射将具有 , 键/值对。 如果您想让这些可用于您的操作,您只需在 ActionContext 中将地图设置为上下文变量即可。然后可以在操作中检索它。 简而言之,我会说不,如果您在 interceptor-ref 元素中定义拦截器参数,则无法获取它们。这些参数是在构建期间设置并应用于拦截器的。但是,如果您将参数放入 interceptor 元素,例如 <interceptor name="theInterceptor" class="com.struts.interceptor.TheInterceptor"> <param name="param1">one</param> <param name="param2">two</param> </interceptor> 您可以即时检索它们 PackageConfig packageConfig = Dispatcher.getInstance().getConfigurationManager().getConfiguration().getPackageConfig("default"); Map<String, Object> interceptorConfigs = packageConfig.getInterceptorConfigs(); InterceptorConfig interceptorConfig = (InterceptorConfig)interceptorConfigs.get("theInterceptor"); Map<String, String> params = interceptorConfig.getParams(); 如果您不想在拦截器上定义属性来保存值,那么 OGNL 将不会设置这些值,但会尝试,所以我看不出不定义这些属性的原因,如果您的 xml 配置标记为无效,拦截器 bean 不包含这些属性,在这种情况下构建器可能会抛出异常。因此,我不建议不定义参数的属性。
修改输入参数或声明新变量并修改它是否更有效(或在其他方面更好)?
我有一个代码,正如你所看到的,我可以用以下两种方式之一编写,问题是唯一的区别是因为在第二个函数中参数被声明为非常量我可以使用它
我有一个代码,正如你所看到的,我可以用以下两种方式之一编写,问题是唯一的区别是因为在第二个函数中参数被声明为非常量我可以使用它
如何将参数从 <s:iterator> 标签内的文本字段传递到 Struts 2 中的操作?
我有一个带有 标记列表的 JSP,该列表使用 getter/setter 迭代在操作中创建的对象。 我能够将映射值从操作拉到 我有一个带有 <s:iterator> 标签列表的 JSP,它使用 getter/setter 迭代在操作中创建的对象。 我能够将映射值从操作拉到 <s:iterator> 标签的文本字段,现在我希望能够将文本字段值从 <s:iterator> 传递回操作类以映射对象,但我意识到它不会调用我的 setter 方法。 这是我的JSP: <s:iterator status="stat" value="parameterList" > <tr id="<s:property value="#stat.index"/>"> <td><s:textfield id="parameterList[%{#stat.index}].queryParameter" name="parameterList[%{#stat.index}].queryParameter" cssClass="size30" labelposition="left" ></s:textfield> </td> <td><s:textfield id="parameterList[%{#stat.index}].parameterValue" name="parameterList[%{#stat.index}].parameterValue" cssClass="size30" labelposition="left" ></s:textfield> </td> </tr> </s:iterator> 这是该操作的片段: private List<QueryParameter> parameterList = new ArrayList<QueryParameter>(); public void setParameterList(List<QueryParameter> parameterList) { this.parameterList = parameterList; } public DQA getDqaObject() { return dqa; } 当我导航到 JSP 时,getter 被调用得很好,但是当我从 JSP 提交表单时,我期望放入 <s:iterator> 标记内的文本字段中的值应该传递并更新操作类中的对象,但是setter 没有被调用。 我解决了这个问题,问题是在我的 getter 中(我忘记在问题中发布)有一些逻辑阻止 getter 继续实际调用对象 setter 来设置参数。 OGNL 在创建新对象时不会调用 setter 方法。如果您想更新现有对象,也不需要它。它应该在填充操作之前初始化。 prepare拦截器可以调用您的操作,如果它实现了Preparable来执行prepare()方法,您可以在其中初始化要更新的对象。 如果您需要一个参数来从数据库检索对象,您可以使用paramsPrepareParams拦截器的堆栈。您可以查看说明在 Struts 2 中绑定后更改参数。 也不要使用 ModelDriven 接口,因为默认情况下它无法与上述堆栈一起正常工作。它需要重新配置默认堆栈以使模型在 params 拦截器 触发之前推送,否则您必须手动处理参数,即来自操作上下文或已弃用的 ParametersAware。
如何在 Struts 中拥有一个包含对象 id 的 URL,然后将其传递给一个操作以通过该 id 显示该对象?例如URL 是 /users/1,它显示了一个具有 id 的用户对象...
我正在编写一种小型脚本语言。 我正在寻找一种可移植的 C++ 方法将参数推送到调用堆栈上,以便我的函数能够正常读取它们。 这可能吗? 它必须...
我正在用操作附加参数,但在我的 Struts 2 页面上遇到异常。 PWC6212:需要等号 下面是我的操作,附加了参数代码,需要提交...
为什么这不是 C/C++ 中的编译器错误:#define + 三元函数参数
给出以下 C 代码: #包括 #包括 #定义 COLOR_RED 255, 0, 0 #定义颜色_蓝色 0, 0, 255 无效showColor(int r,int g,int b) { 原则...
我正在开发一个存储过程,我想知道它最初是从哪里调用的,我的意思是,当我调用我的过程时我在哪个数据库中。 我想实现这个目标...
这段代码按预期工作;但是,它不适用于任何类型的输入: const input = [{选项A: {a: 1}, 选项B: {b: 1}, 选项C: {c: 1}]; input.map(({选项A, 选项B, 选项C}) =&g...
Jenkins - 触发器/调用构建在其他项目上 - 发送多行字符串参数需要帮助
我有 2 个 Jenkins 工作: projectA - 将定期运行最新版本并更新文本文件以触发 yes。当触发器设置为YES时,它将触发下游projectB,其中包含多个...
我想知道是否有人知道如何从 R 中 glmmadmb 的输出中提取色散参数的估计值。我正在使用负二项式模型,并且想使用此代码
函数添加(a,b){ /* … */ } 如果我们像 Add(1) 这样调用这个 JavaScript 函数,为什么即使我们只向函数传递了错误数量的参数,也没有收到错误? JavaS 如何...
当参数之一是接口时,Visual Studio 似乎会停止类型检查函数参数。 考虑以下几点: ' 接口和实现它的类: 公共接口...
提供不带值的参数来选择默认值:`script -log` vs `script -log filename`
我想要的是开关参数和字符串参数的组合。 有 3 种情况(不仅仅是 2 种): -未给出日志 -log给定,默认文件名 -log 给定的文件名 所有这些州都可以