Странное поведение действия h: commandLink (MethodExpression) - PullRequest
1 голос
/ 13 ноября 2009

У меня есть две JSP, где я отображаю некоторую информацию из базы данных в h:dataTable. Один из них показывает всю информацию, и один из них специально для пользователя. У меня есть showXML.jsp, который детально показывает столбец "XML" строки dataTable, так как такой большой String не будет хорош в dataTable. Поэтому я передаю идентификатор строки и регистр навигации, чтобы вернуться на родительскую страницу.

<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() в h:outputText вызывается один раз, когда он успешно получает параметр cid с getRequestParameter, и снова, когда я нажимаю ссылку Back to history, но на этот раз cid параметр null, традиционно вызывающий NullPointerException.

EDIT:


На странице dataTable каждая строка имеет 4 commandLinks, по 2 параметра в каждой. Не уверен, что это приносит какой-либо вред, однако, кажется, что-то замедляет работу сервера после нескольких щелчков мышью Я всегда закрываю свои ресурсы после доступа к базе данных.

EDIT2: Проблемы с производительностью были вызваны тем, что я получал соединения через @Resource. Это было решено после того, как я начал использовать автономные соединения.

Есть ли другой способ получить имя и вернуться на родительскую страницу?


Я, вероятно, застрял с какой-то нубистской проблемой, но я уже некоторое время пытаюсь. Пожалуйста, если у вас есть идеи, помогите!

Заранее спасибо, Daniel

Ответы [ 2 ]

2 голосов
/ 13 ноября 2009

Проблема в том, что на странице xml методы вызываются несколько раз.

Это должны быть только методы получения, которые вызываются несколько раз. Это на самом деле не должно причинить вреда, если только они неправильно содержат больше логики кода, чем только возврат данных или максимальная ленивая загрузка. Бизнес-логика принадлежит конструкторам, блокам инициализации и / или методам событий JSF (valueChangeListener, action), но определенно не относится к методу-получателю. getter существует для возврата данных , больше ничего.

когда я нажимаю на ссылку Назад в историю, но на этот раз параметр cid равен нулю

Если bean-компонент является областью действия запроса и вы не передали его в качестве параметра запроса для последующего запроса, тогда он действительно будет нулевым. Вам также необходимо передать его обратно в качестве параметра, так же, как вы, очевидно, успешно сделали это для параметра "toview".

На странице dataTable каждая строка имеет 4 commandLinks, по 2 параметра в каждой. Не уверен, что это приносит какой-либо вред, однако, кажется, что-то замедляет работу сервера после нескольких щелчков мышью. Я всегда закрываю свои ресурсы после доступа к базе данных.

Может быть, код излишне загружает слишком много данных и / или сохраняет / дублирует данные в области сеанса. Профилировщик 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} на странице шоу.

1 голос
/ 13 ноября 2009
<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>
...