【问题标题】:Java Server Faces equivalent to Html.ActionLinkJava Server Faces 等价于 Html.ActionLink
【发布时间】:2014-09-07 19:26:36
【问题描述】:

我正在将 NetBeans 用于 Java EE 中的 Web 应用程序。

我有一个用于缺勤实体类 (absenceController) 的控制器和一个用于员工实体类 (employeeController) 的控制器。

我可以通过缺席控制器控制的任何页面进入员工创建页面:

<h:commandLink action="#{absenceController.prepareCreate}"
    value="#{bundle.ListAbsenceCreateLink}"/>

我可以通过employeeController控制的任何页面进入缺勤创建页面:

<h:commandLink action="#{employeeController.prepareCreate}"
    value="#{bundle.ViewEmployeeCreateLink}" />

当我想设置一个新的缺勤实例时,我需要提前设置员工,因此我尝试从员工视图页面(称为 Tasks.xhtml)访问缺勤创建页面,将员工实例发送为一个参数。

在 MVC .NET 中,我会使用 Html.ActionLink,有点像这样:

Html.ActionLink("Report Absence for employee"
, "Create"
, "Absence"
, new { employeeid = employee.Id } // <- I would only be able to send the id
, null)

在 Java 中,这是我得到的最接近的:

<h:commandLink action="/absence/create"
        value="#{bundle.TasksEmployeeCreateAbsenceLink}"  >
    <f:setPropertyActionListener target="#{absenceController.selected.employee}"
            value="#{employeeController.selected}" />
</h:commandLink>

文件夹结构如下图:

我知道动作标签不正确,但是有什么方法可以改变它以获得想要的结果吗?

【问题讨论】:

  • 必须是 GET 还是 POST 请求?你考虑过这种请求的幂等性吗?
  • 这将是一个 GET。如果我误解了幂等性,我很抱歉 - 可以多次致电,因为员工可能有很多缺勤。

标签: asp.net-mvc jsf netbeans html.actionlink


【解决方案1】:

实现我需要的一种方法是使用导航规则。 (就像在 cmets 中一样,自 JSF 2.x 以来有更好的方法来实现这一点)

我将以下内容添加到 faces-config.xml(在 &lt;application&gt;&lt;/application&gt; 部分内):

    <navigation-rule>
        <from-view-id>/employee/Tasks.xhtml</from-view-id>
            <navigation-case>
                    <from-action>absence/create</from-action> 
                    <from-outcome>absence/create</from-outcome>
                    <to-view-id>/absence/Create.xhtml</to-view-id>
            </navigation-case>
    </navigation-rule>  

【讨论】:

  • 导航规则太棒了 JSF 1.x。您确定在学习 JSF 时正在阅读最新的资源吗?如果您在*.xhtml 上正确映射了FacesServlet,则只需action="/absence/Create.xhtml" 甚至action="/absence/Create" 就可以在JSF 2.x 中实现完全相同的效果。更好的是,只需将 XHTML 文件名小写,这样您最终就可以继续使用干净的全小写 action="/absence/create"
  • @BalusC 我昨天确实尝试了所有这些东西,但是它们没有用...请您详细说明“在*.xhtml 上正确映射FacesServlet”。我应该检查另一个配置文件吗?感谢您对此的帮助,非常感谢。
  • 显然您实际上使用的是 JSF 1.x。没关系。我只是没想到这些天,当然不是因为使用 XHTML,这通常是 JSF 2.x 的默认设置。
  • 显然它以 1.x 后备模式运行。可能是错误的 faces-config 版本?
  • @BalusC 哦,天哪,刚回到家,重试了你所有的建议。毕竟是'C'的情况。非常感谢您为我指明了正确的方向。
【解决方案2】:

我使用的是 JSF 2.2,所以我需要做的就是在 Create 中使用正确的大小写:

<h:commandLink action="/absence/Create"
    value="#{bundle.TasksEmployeeCreateAbsenceLink}"  >
        <f:setPropertyActionListener target="#{absenceController.selected.employee}"
            value="#{employeeController.selected}" />
</h:commandLink>

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2012-03-25
    • 2011-10-30
    • 2010-09-25
    • 2013-11-24
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多