当我调试我的接缝应用程序时,我突然意识到我并不真正了解参数传递的工作原理。以下术语让我很困惑。所以我想问这个非常普遍的问题,希望能够很好地解释什么与什么以及某些事情有什么关系。
首先,要从一个页面到下一个页面,您可以使用h:commandButton或s:按钮。我理解s:按钮不提交表单,但这并不能帮助我理解差异。如果您没有通过从一个页面到下一个页面提交表单,那么您在做什么?
我的应用程序涉及在表单中输入信息,点击按钮然后转到运行查询后显示结果的新页面。我似乎已经看到这个活动是用s:按钮进行的,那么如果它不是“提交表单”怎么办呢?我觉得我在这里缺少一些基本的东西。
至于参数本身...根据我所见,您可以使用以下三种方法之一传递参数:
我确信这个问题显示出很多无知。
希望你们其中一位雄辩的人能“得到”我所要求的东西并给我一个解释这个过程。
提前致谢。
TDR
答案 0 :(得分:27)
如果您没有提交表格 然后,从一个页面到另一个页面 你在做什么?
导航到另一个页面而不提交任何表单字段。
我的应用涉及输入信息 在一个表单中,按一下按钮然后 转到显示的新页面 运行查询后的结果。它 好像我看过这个活动 用s:按钮放置
s:按钮不会提交表单,因此页面上的值不会应用于模型。您必须使用commandButton / Link。您可能看到的活动是将已填充的值传递给另一个页面。
经常使用s:button / link,因为这些通常用于导航。您可以使用f:param将已填充的值传递到另一个页面。 h:commandButton / Link用于提交表单,因此值在表单字段中。当然,没有什么可以阻止你使用f:param来实现这一点。
此处使用的参数用于将请求参数应用于模型,反之亦然。
可与上述所有内容结合使用,但与page.xml params一起使用时有点无意义,因为它们可用于执行相同的工作
如果您从这个页面开始:
http://mydomain.com/myapp/home.seam?name=damo
home.page.xml包含:
<param name="name" value="#{person.name}"/>
然后,当加载页面时,将调用person.setName("damo")
,因为URL中存在匹配的请求参数。
您可以将链接的值存储在下一页的链接中:
<s:link value="Go to Page 2" view="/page2.xhtml">
<f:param name="name" value="#{person.name}"/>
</s:link>
点击该链接并导航至http://mydomain.com/myapp/page2.seam page2.page.xml包含:
<param name="name" value="#{someOtherBean.name}"/>
然后会调用someOtherBean.setName("damo")
。
Page2可能有一个像这样的s:按钮:
<s:button value="Say Hello" action="#{someOtherBean.sayHello}">
<f:param name="subject" value="#{someOtherBean.name}"/>
</s:button>
方法可以是:
@Name("someOtherBean")
public class SomeOtherBean {
@RequestParameter("subject") //same value as the 'name' in f:param
private String subject;
public void sayHello() {
System.out.println("Hello "+subject);
}
}
希望这有帮助!
答案 1 :(得分:2)
这个问题已经有了很好的答案。我只想添加一些额外的信息。
如果您没有通过从一个页面到下一个页面提交表单,那么您在做什么?
onclick
属性导航到下一页之前,进行客户端验证或运行javascript。action
属性调用bean中的方法。我的应用程序涉及在表单中输入信息,点击按钮然后转到运行查询后显示结果的新页面。我似乎已经看到这个活动发生在s:button
<s:button>
/ <s:link>
所述,我们不会提交表单,因此您可以在第二页运行查询,但肯定没有先前输入的数据。<a4j:support>
/ <a4j:ajax>
标记和输入字段,那么如果您在长时间运行的对话中或者您的bean中,您可以在第二页中访问该数据是会话作用域。如果您在第二页中看到表单数据,则可能是原因。可以选择将@RequestParameter注释添加到辅助bean。我收集的是,当你在视图中设置f:param时也会使用它。这是否意味着page.xml中的那个被忽略了?
是的,通过page.xml
设置的值将被覆盖。请看下面的例子
假设您的page.xml
有以下行。
<param name="name" value="#{myBean.name}"/>
并且您的bean具有getter
属性的setter
和name
方法,您可以将变量name
定义如下。
@RequestParameter
String name;
现在,如果你这样调用这个页面。
http://...../app_name/home.seam?name=william
将调用setName
并将名称property
设置为“william”。
现在假设您像这样定义变量。
@RequestParameter("userName")
String name;
并像这样调用页面。
http://...../app_name/home.seam?name=william&userName=tony
然后调用setName
方法并将name
属性设置为“william”。但是这个值被“tony”值覆盖了。