h:commandLink动作的奇怪行为(MethodExpression)

时间:2009-11-12 23:10:56

标签: jsf parameters command

我有两个JSP,我在h:dataTable中显示数据库中的一些信息。其中一个显示所有信息,其中一个用户专门。 我有showXML.jsp详细显示了dataTable行的“XML”列,因为String在dataTable中不是很好。所以我正在做的是传递行ID和导航案例,以导航回父页面。

<h:commandLink action="show_xml" value="Show">
   <f:param name="cid" value="#{row.id}" />
   <f:param name="toview" value="history" />
</h:commandLink>

在xml页面上,我有一个h:commandLink,其动作设置为方法:

JSP:

<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history" />

支持Bean:

public String toView() {
    return "back_to_" + Util.getRequestParameter("toview");
}

问题是在xml页面上,多次调用方法。例如,getXML()中的h:outputText方法在成功获取cid getRequestParameter参数时会被调用一次,当我点击Back to history时}链接,但这次cid参数为null,传统上导致NullPointerException

修改


在dataTable页面上,每行有4个commandLinks,每个都有2个参数。不确定这会造成什么伤害,但是在点击几次导航后,某些东西似乎会减慢/崩溃服务器。我总是在数据库访问后关闭我的资源。

EDIT2:由于我一直在通过@Resource查询关联,因此导致了性能问题。在我开始使用独立连接后,这已经解决了。

有没有其他方法可以获取名称并导航回父页面?


我可能会遇到一些无聊的问题,但我现在已经尝试了一段时间了。如果您有任何想法,请帮忙!

提前致谢, 丹尼尔

2 个答案:

答案 0 :(得分:2)

  

问题是在xml页面上,多次调用方法。

应该只是多次调用的getter方法。这实际上不应该受到伤害,除非它们错误地包含更多的代码逻辑,而不仅仅是返回数据或者在最高延迟加载时。业务逻辑属于构造函数,初始化块和/或JSF事件方法(valueChangeListener,action),但肯定不在getter方法中。 getter 返回数据,仅此而已。

  单击“返回历史记录”链接时

,但这次cid参数为空

如果bean是请求范围的,并且您没有将它作为请求参数传递给后续请求,那么它确实将为null。您需要将其作为参数传回,就像您显然成功为“查看”参数所做的那样。

  

在dataTable页面上,每行有4个commandLinks,每个都有2个参数。不确定这会造成什么伤害,但是在点击几次导航后,某些东西似乎会减慢/崩溃服务器。我总是在数据库访问后关闭我的资源。

可能代码不必要地在会话范围中加载太多数据和/或存储/复制数据。 Java分析器可以帮助查明原因。

  

有没有其他方法可以获取父页面的名称?

不如将其作为参数传递给后续请求那样可靠。你走在正确的轨道上,只需简化。另一种选择是<f:setPropertyActionListener>,但这对“完整”对象更有用。例如,您可以将它用于行对象,以便在单击commandlink时立即设置它。例如:

<h:dataTable value="#{bean.list}" var="row">
    ...
    <h:commandLink value="show" action="show">
        <f:setPropertyActionListener target="#{bean.row}" value="#{row}" />
        <f:param name="toview" value="history" />
    </h:commandLink>

这样您就可以在展会页面上即时访问#{bean.row}

答案 1 :(得分:1)

<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history" />

我会说NullPointerException问题就在这里。您的模型依赖于存在的cid请求参数,但是在提交此页面时,表单不会发送此参数。我猜测calculationBean是请求范围,需要cid参数来创建xml属性后面的值。提交表单后,calculationBean会被实例化,导致它尝试从数据源中读取xml

如果没有看到应用程序的完整逻辑和流程,很难确定,但将其更改为可能会有这个诀窍:

<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history">
    <f:param name="cid" value="#{param.cid}" />
</h:commandLink>