nha*_*rer 5 java jsp struts2 ognl valuestack
我有一个显示在每个页面上的搜索框。搜索框的 JSP 代码通过图块插入到每个页面中。
搜索框有一个表单和一个操作类SearchAction,需要为下拉框预加载一些属性。班级SearchAction有一个input()方法来执行此初始化。
一些页面在主区域也有自己的表单。还有自己的动作类。他们还有一种input()方法可以进行一些预加载。
更新:
我添加了一个精简的示例,因为可能不清楚我要做什么。这是一个register.jsp带有RegisterAction. 该页面还包含搜索表单。(顺便说一句:为了保持简短,我在操作类中省略了 getter/setter 和其他内容):
register.jsp:
<s:form action="executeSearch">
<s:textfield key="name" label="Name"/>
<s:textfield key="age" label="Age"/>
<s:submit/>
</s:form>
<s:form action="executeRegister">
<s:textfield key="firstName" label="First Name"/>
<s:textfield key="lastName" label="Last Name"/>
<s:textfield key="age" label="Age"/>
<s:submit/>
</s:form>
Run Code Online (Sandbox Code Playgroud)
struts.xml:
<action name="*Search" class="action.SearchAction" method="{1}">
<result name="success">/searchresult.jsp</result>
</action>
<action name="*Register" class="action.RegisterAction" method="{1}">
<result name="input">/register.jsp</result>
<result name="success">/registerOk.jsp</result>
</action>
Run Code Online (Sandbox Code Playgroud)
SearchAction.java:
public class SearchAction extends ActionSupport {
private String name;
private int age;
@Override
public String input() throws Exception {
// preload the search form with some demo data
name = "test";
age = 20;
return INPUT;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
...
}
Run Code Online (Sandbox Code Playgroud)
RegisterAction.java:
public class RegisterAction extends ActionSupport {
private String firstName;
private String lastName;
private int age;
@Override
public String input() throws Exception {
// preload the register form with some demo data
firstName = "John";
lastName = "Rambo";
age = 10;
return INPUT;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
...
}
Run Code Online (Sandbox Code Playgroud)
假设我调用该操作inputRegister.action。然后就RegisterAction.input()被调用了。属性已设置。结果SUCCESS会register.jsp被渲染。
但是我的搜索表单呢?我如何访问搜索操作及其模型。ValueStack当然,这些都不在其中。我也没有看到调用任何方法SearchAction来初始化其模型的方法。我特意选择age参加这两个动作课程。在呈现的页面中,您可以看到搜索表单也访问了RegisterAction-*.properties(因为它位于 之上ValueStack)。但它需要访问SearchAction. 它必须显示 20 而不是 10。

我显然做错了。但即使经过大量谷歌搜索,我仍然没有找到正确的方法。
视图的概念用于执行任意数量的操作,并且任何操作都可以有任意数量的结果。结果用于返回视图。返回视图的操作放置在 的顶部,ValueStack以便通过评估 OGNL 表达式轻松访问。结果视图可以映射到任何操作类中的任何操作。它对调用它的操作一无所知,但它可以再次使用 OGNL 来确定它。您可以将操作映射到同一操作类的不同方法,因此不需要有很多input()方法。
编辑:
你的问题是你的有界表单字段错误。每个表单应该有一个单独的存储以正确显示它。字段受名称限制,您最好有一个用于搜索条件变量的表单 bean,并将其放在操作上下文中的某个位置。
<s:form action="executeSearch">
<s:textfield key="searchBean.name" label="Name"/>
<s:textfield key="searchbean.age" label="Age"/>
<s:submit/>
</s:form>
<s:form action="executeRegister">
<s:textfield key="firstName" label="First Name"/>
<s:textfield key="lastName" label="Last Name"/>
<s:textfield key="age" label="Age"/>
<s:submit/>
</s:form>
Run Code Online (Sandbox Code Playgroud)
注意:该key属性生成name、label和value。
每个操作都需要初始化 a searchBean,除非它具有会话范围。如果你将一个 bean 放入会话中,那么你应该使用#session.前缀。您可以在文档页面上找到有关OGNL的更多信息。
| 归档时间: |
|
| 查看次数: |
9185 次 |
| 最近记录: |