首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >H的奇怪行为:命令链接操作(MethodExpression)

H的奇怪行为:命令链接操作(MethodExpression)
EN

Stack Overflow用户
提问于 2009-11-12 23:10:55
回答 2查看 1.6K关注 0票数 1

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

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history" />

支持豆:

代码语言:javascript
复制
public String toView() {
    return "back_to_" + Util.getRequestParameter("toview");
}

问题是,在xml页面上,方法被多次调用。例如,当getXML()方法成功地获得带有getRequestParametercid参数时,它会被调用一次,当我单击Back to history链接时,再次调用该方法,但这一次,cid参数是null,通常会导致NullPointerException

编辑:

在dataTable页面上,每一行都有4个commandLinks,每一行都有2个params。不确定这会有什么害处,但是在几次导航单击之后,某些东西似乎会使服务器慢下来/崩溃。我总是在访问数据库之后关闭资源。

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

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

我可能被一些无聊的问题困住了,但我已经尝试了一段时间了。如果你有任何想法,请救救我!

谢谢你,丹尼尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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>,但这对于“完全”对象更有用。例如,您可以将它用于行对象,以便在单击命令链接时立即设置它。示例:

代码语言:javascript
复制
<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}

票数 2
EN

Stack Overflow用户

发布于 2009-11-13 11:33:11

代码语言:javascript
复制
<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history" />

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

在没有看到应用程序的完整逻辑和流程的情况下,很难肯定地说,但是将其更改为这样做可能会有效果:

代码语言:javascript
复制
<h:outputText value="#{calculationBean.xml}" />
...
<h:commandLink action="#{myBean.toView}" value="Back to history">
    <f:param name="cid" value="#{param.cid}" />
</h:commandLink>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1726052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档