h:link/h: методы вывода кнопки автоматически вызываются при загрузке страницы без каких-либо кликов
У меня есть 3 страницы с 3 ссылками, которые я пытался реализовать с h:link
или просто <a>
тег. Но в обоих случаях методы, связанные с этими ссылками, вызываются при каждом переходе на страницу.
Вот <a>
реализация тега:
<a href="#{bean.gotoMySrchie()}">
<h:graphicImage library="images" name='vo2/FavPlus.png' />
</a>
<a href="#{bean.gotoMySearches()}">
<h:graphicImage library="images" name='vo2/SearchesPlus.png' />
</a>
<a href="#{bean.gotoMyBids()}">
<h:graphicImage library="images" name='vo2/BidsPlus.png' />
</a>
h:link
реализация выглядит так:
<h:link title="Searches" id="searchesLogo" value="" outcome="#{bean.gotoMySearches()}">
<h:graphicImage library="images" name='vo2/SearchesPlus.png' />
</h:link>
Проблема в том, что каждый из этих методов действия вызывает мою базу данных, и это полная трата вызова. Так есть ли способ в JSF2 перемещаться между страницами, используя методы действия для фактического выполнения чего-либо, но без вызова этих методов, когда они мне не нужны для вызова?
1 ответ
<a href="#{bean.gotoMySrchie()}">
<h:link ... outcome="#{bean.gotoMySearches()}">
Они называются выражениями значений, потому что их возвращаемое значение должно быть напечатано там во время генерации вывода HTML во время фазы ответа рендеринга JSF. Их возвращаемое значение используется как href
в полученном выводе HTML. Щелкните правой кнопкой мыши страницу в веб-браузере, выполните Просмотр исходного кода и посмотрите на значение href
приписывать. Если эти методы вернулись String
вы увидите именно ту строку, которая там печатается.
Они, в отличие от того, что вы ожидали, не называются выражениями методов во время JSF, вызывая фазу приложения как результат обратной передачи. Это просто фундаментальное недоразумение. Чтобы вызвать действия во время обратной передачи, вам нужно <h:commandXxx action>
, Это, однако, запускает POST-запрос, а не GET-запрос, что может иметь много других последствий.
Щелчок по простой ссылке по умолчанию отправляет запрос GET, а не запрос POST. Если вы хотите продолжать использовать GET, что хорошо в данном конкретном случае, то вы должны выполнять работу с базой данных в @PostConstruct
метод резервного компонента, связанного с целевой страницей, а не во время загрузки страницы, содержащей эти ссылки, как вы делали там.
<h:link ... outcome="/searches">
<h:graphicImage ... />
</h:link>
@Named
@RequestScoped // Or @ViewScoped
public class SearchesBean {
@PostConstruct
public void init() {
// Here.
}
// ...
}