Jsf h:commandLink动作的怪异行为(MethodExpression)
我有两个JSP,其中我在Jsf h:commandLink动作的怪异行为(MethodExpression),jsf,parameters,command,Jsf,Parameters,Command,我有两个JSP,其中我在h:dataTable中显示了数据库中的一些信息。其中一个正在显示所有信息,其中一个是用户专用的。 我有一个showXML.jsp,它详细地显示了数据表行的“XML”列,因为在数据表中有一个String那么大就不好了。所以我要做的是传递行id和导航案例,以导航回父页面 <h:commandLink action="show_xml" value="Show"> <f:param name="cid" value="#{row.id}" />
h:dataTable
中显示了数据库中的一些信息。其中一个正在显示所有信息,其中一个是用户专用的。
我有一个showXML.jsp
,它详细地显示了数据表行的“XML”列,因为在数据表中有一个String
那么大就不好了。所以我要做的是传递行id和导航案例,以导航回父页面
<h:commandLink action="show_xml" value="Show">
<f:param name="cid" value="#{row.id}" />
<f:param name="toview" value="history" />
</h:commandLink>
支持Bean:
public String toView() {
return "back_to_" + Util.getRequestParameter("toview");
}
问题是在xml页面上,方法被多次调用。例如,h:outputText
中的getXML()
方法在使用getRequestParameter
成功获取cid
参数时调用一次,在我单击返回历史
链接时再次调用,但这次cid
参数为null
,传统上会导致NullPointerException
编辑:
在dataTable页面上,每行有4个commandLinks,每行有2个参数。不确定这是否有任何危害,但是在单击几次导航后,服务器似乎会减速/崩溃。我总是在访问数据库后关闭我的资源 EDIT2:性能问题是由于我一直通过
@资源
获取连接而导致的。在我开始使用独立连接后,这个问题已经解决了
是否有其他方法获取名称并导航回父页面
我可能遇到了一些noobish问题,但我已经尝试了一段时间了。如果你有任何想法,请帮忙 提前感谢,, 丹尼尔 问题是在xml页面上,方法被多次调用 应该只调用多次的getter方法。这实际上应该不会造成伤害,除非它们错误地包含了比仅返回数据或在最高延迟加载时更多的代码逻辑。业务逻辑属于构造函数、初始化块和/或JSF事件方法(valueChangeListener、action),但肯定不属于getter方法。一个getter用于返回数据,仅此而已 当我单击BacktoHistory链接时,但这次cid参数为null 如果bean是请求范围的,并且您没有将其作为请求参数传递给后续请求,那么它将确实为null。您还需要将其作为参数传回,这与您显然成功地对“toview”参数所做的相同 在dataTable页面上,每行有4个commandLinks,每行有2个参数。不确定这是否有任何危害,但是在单击几次导航后,服务器似乎会减速/崩溃。我总是在访问数据库后关闭我的资源 可能代码不必要地加载了太多数据和/或在会话范围中存储/复制了数据。java探查器可能有助于查明原因 是否有其他方法获取父页面的名称 不像将其作为参数传递给后续请求那样可靠。你在正确的轨道上,它只需要简化。另一种选择是
,但这对于“完整”对象更有用。例如,您可以将其用于行对象,以便在单击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}
我应该指出-如果不需要调用任何服务器端逻辑,请使用outputLink
。它将导致常规的GET
请求,而不是commandLink
的POST
。感谢您的回答calculationBean
是session
的作用域,但您是对的。xml
属性只是一个getXML()
方法,因此每次调用都会导致它获取参数,即使它是null
。我刚刚通过存储参数解决了这个问题。谢谢所有的答案,它们真的很有帮助!性能问题是因为连接没有关闭,但是我使用嵌套的try-catch-finally块处理这些资源。我会调查的。
<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history" />
<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history" />
<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history">
<f:param name="cid" value="#{param.cid}" />
</h:commandLink>