【问题标题】:Keep get parameters when submitting a form提交表单时保留获取参数
【发布时间】:2012-06-19 05:28:34
【问题描述】:

我正在尝试在 JSF 中做一些简单的事情,但由于某种原因我无法让它工作。 我想要的是使用 GET 参数到达的页面中的表单发布信息,并在我提交表单时保留此 GET 参数。

<f:metadata>
    <f:viewParam name="someId" value="#{someController.something}" converter="#{someConverter}" />
</f:metadata>

这是我选择绑定 GET 参数的方式,这在我执行 GET 请求时工作正常。

在同一个页面上,我有一个

<h:form>
    <!-- (... various input ...) -->
    <h:commandLink action="#{someController.create}"  value="Create" />
</h:form>

当我提交它时,即使数据是正确的,我也永远不会让我的“某物”不为空。

用例很简单,我有一个一对多的关系,我想以 id 作为 GET 参数访问“一”,并在页面上和列表下方列出“多”,表单允许我在“许多”列表中添加一个新元素。

我想让它工作(当然)并尽可能地清洁,

谁能告诉我实现这一目标的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: jsf-2 java-ee-6


    【解决方案1】:

    要么将SomeController bean 设为@ViewScoped,这样只要你与同一个视图交互,bean 就会一直存在,

    @ManagedBean
    @ViewScoped
    public class SomeController {
        // ...
    }
    

    或者在UICommand组件中使用&lt;f:param&gt;来传递GET参数

    <h:commandLink>
        <f:param name="someId" value="#{param.someId}" />
    </h:commandLink>
    

    【讨论】:

    • 我忘了提到我使用 CDI 而不是 JSF 作为容器,因为我听说 JSF 容器已被弃用。我应该保留我的选择还是改用 ManagedBean?如果我坚持使用 CDI,使用 @SessionScoped 的最佳方法是什么?谢谢
    • 已弃用? :) 废话。它们仍然适用于不支持 CDI 的准系统 servlet 容器,如 Tomcat/Jetty/等。只有当您有一个支持 CDI 的容器并且您想在其他 Java EE 工件(如 servlet、过滤器、Web 服务、EJB 等)中注入托管 bean 时,CDI 确实更易于使用。会话范围绝对是错误的选择。 CDI 提供@ConversationScoped 作为视图范围的替代品,但您需要自己开始和结束对话。
    • 在应用程序中同时使用 ManagedBean 和 CDI 是一种好习惯,还是我应该只使用一个?谢谢你的回答,简洁明了,问题解决了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多