我有两个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
查询关联,因此导致了性能问题。在我开始使用独立连接后,这已经解决了。
有没有其他方法可以获取名称并导航回父页面?
我可能会遇到一些无聊的问题,但我现在已经尝试了一段时间了。如果您有任何想法,请帮忙!
提前致谢, 丹尼尔
答案 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>