我有两个JSP,我在h:dataTable中显示数据库中的一些信息。其中一个是显示所有信息,其中一个是专门用户。我有一个showXML.jsp,它详细地显示了dataTable行的"XML“列,因为在dataTable中,这么大的String不是很好。因此,我要做的是传递行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" />支持豆:
public String toView() {
return "back_to_" + Util.getRequestParameter("toview");
}问题是,在xml页面上,方法被多次调用。例如,当getXML()方法成功地获得带有getRequestParameter的cid参数时,它会被调用一次,当我单击Back to history链接时,再次调用该方法,但这一次,cid参数是null,通常会导致NullPointerException。
编辑:
在dataTable页面上,每一行都有4个commandLinks,每一行都有2个params。不确定这会有什么害处,但是在几次导航单击之后,某些东西似乎会使服务器慢下来/崩溃。我总是在访问数据库之后关闭资源。
EDIT2:导致性能问题是因为我一直在通过@Resource查询连接。在我开始使用独立连接之后,这个问题已经解决了。
还有其他方法可以获取名称并导航回父页面吗?
我可能被一些无聊的问题困住了,但我已经尝试了一段时间了。如果你有任何想法,请救救我!
谢谢你,丹尼尔
发布于 2009-11-13 11:31:54
的问题是,在xml页面上,方法被多次调用。
它应该只是被多次调用的getter方法。这实际上是无害的,除非它们错误地包含比仅返回数据或在最高延迟加载时包含更多的代码逻辑。业务逻辑属于构造函数、初始化块和/或JSF事件方法(valueChangeListener,action),但肯定不属于getter方法。getter用于返回数据,仅此而已。
当我单击回历史链接时,
,但这次cid参数为null。
如果bean是请求作用域,并且没有将它作为请求参数传递给后续请求,那么它确实是空的。您还需要将它作为参数传递回来,就像您成功地执行"toview“参数一样。
在dataTable页面上,每一行都有4个commandLinks,每一行都有2个params。不确定这会有什么害处,但是在几次导航单击之后,某些东西似乎会使服务器慢下来/崩溃。我总是在访问数据库之后关闭资源。
可能代码不必要地加载了过多的数据和/或存储/复制了会话范围中的数据。java分析器可能有助于找出原因。
还有其他方法来获取父页面的名称吗?
不像将它作为参数传递给后续请求那样可靠。你在正确的轨道上,它只是需要流线型。另一种选择是<f:setPropertyActionListener>,但这对于“完全”对象更有用。例如,您可以将它用于行对象,以便在单击命令链接时立即设置它。示例:
<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}。
发布于 2009-11-13 11:33:11
<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>https://stackoverflow.com/questions/1726052
复制相似问题