Может ли кто-нибудь пояснить, как мы можем использовать этот фрагмент в целом или в реальном мире?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Может ли кто-нибудь пояснить, как мы можем использовать этот фрагмент в целом или в реальном мире?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
<f:viewParam>
управляет установка, преобразование и проверка параметров GET. Это как <h:inputText>
, но тогда для параметров GET.
Следующий пример
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
делает в основном следующее:
id
.required
, validator
и converter
и вложить в него <f:converter>
и <f:validator>
, как с <h:inputText>
)#{bean.id}
, или, если атрибут value
отсутствует, установите его как атрибут запроса с именем id
, чтобы он был доступен #{id}
в представлении.Поэтому, когда вы открываете страницу как foo.xhtml?id=10
, значение параметра 10
устанавливается в bean-компоненте таким образом, прямо перед визуализацией представления.
Что касается проверки, в следующем примере для параметра устанавливается значение required="true"
и допускаются только значения от 10 до 20. Любая ошибка проверки приведет к отображению сообщения.
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
</f:metadata>
<h:message for="id" />
Вы можете использовать <f:viewAction>
а> для этого.
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
<f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />
с участием
public void onload() {
// ...
}
Однако <f:viewAction>
является новым с JSF 2.2 (<f:viewParam>
уже существует с JSF 2.0). Если вы не можете выполнить обновление, лучше всего использовать <f:event>
вместо этого.
<f:event type="preRenderView" listener="#{bean.onload}" />
Однако это вызывается при каждом запросе. Вам нужно явно проверить, не является ли запрос обратной передачей:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
Если вы хотите также пропустить случаи сбоя преобразования/проверки, сделайте следующее:
public void onload() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
Использование <f:event>
таким образом, по сути, является обходным путем/хаком, именно поэтому <f:viewAction>
был введен в JSF 2.2.
Вы можете передать параметры просмотра в навигационных ссылках, установив для атрибута includeViewParams
значение true
или добавив параметр запроса includeViewParams=true
.
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
который генерирует с приведенным выше примером <f:metadata>
в основном следующую ссылку
<a href="next.xhtml?id=10">
с исходным значением параметра.
Этот подход только требует, чтобы next.xhtml
имел также <f:viewParam>
для того же самого параметра, иначе он не будет передан.
<f:viewParam>
также можно использовать в сочетании с простыми HTML-формами GET.
<f:metadata>
<f:viewParam id="query" name="query" value="#{bean.query}" />
<f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
<label for="query">Query</label>
<input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
<input type="submit" value="Search" />
<h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
...
</h:dataTable>
В основном с этим компонентом @RequestScoped
:
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
Обратите внимание, что <h:message>
соответствует <f:viewParam>
, а не простому HTML <input type="text">
! Также обратите внимание, что входное значение отображает #{param.query}
, когда #{bean.query}
пусто, потому что в противном случае отправленное значение вообще не будет отображаться при ошибке проверки или преобразования. Обратите внимание, что эта конструкция недействительна для компонентов ввода JSF (она уже делает это скрыто).
<f:event type="preRenderView">
не вызывается при каждом запросе? Он вызывается при каждом запросе.
- person BalusC; 06.02.2013
@PostConstruct
bean-компонента с областью видимости не вызывается при каждом запросе.
- person BalusC; 06.02.2013
value
отсутствует, установите его как атрибут запроса для имени id
, чтобы он был доступен #{id}
в представлении., вы говорите об использовании тега c:set
? (Я не вижу точного значения, наверное, меня смущает #{param.id}
)
- person Tarik; 07.03.2015
<f:event type="preRenderView" listener="#{bean.onload}" />
для доступа к параметру представления в onload
после удаления @PostContruct
из onload
. У меня есть раскрывающийся список на странице (не ajax, так как я собираюсь отправить изменение при отправке). При отправке страницы (перенаправление) измененное значение этого раскрывающегося списка сбрасывается до значения по умолчанию (первый элемент), я вижу, что установщик раскрывающегося списка вызывается дважды. Во-первых, за изменение, внесенное пользователем, а во-вторых, за его автоматический сброс, как я уже сказал. Когда я снова возвращаюсь к @PostConstruct
, все становится нормально. Сеттер вызывается только один раз для последнего выбора пользователя. Что я могу здесь сделать?
- person user2918640; 04.04.2016
Отправлять параметры из представления в другое представление, из представления отправителя в представление получателя использовать viewParam и includeViewParams=true
В отправителе
Отправитель.xhtml
<f:metadata>
<f:viewParam name="ID" value="#{senderMB._strID}" />
</f:metadata>
“includeViewParams=true”
в ответ Строка события нажатия кнопки Нажмите кнопку запуска senderMB.clickBtnDetail(dto) с dto от senderMB._arrDataОтправитель.xhtml
<p:dataTable rowIndexVar="index" id="dataTale"value="#{senderMB._arrData}" var="dto">
<p:commandButton action="#{senderMB.clickBtnDetail(dto)}" value="見る"
ajax="false"/>
</p:dataTable>
В senderMB.clickBtnDetail(dto) мы назначаем _strID с аргументом, который мы получили из события кнопки (dto), здесь это Sender_DTO и назначаем senderMB._strID
Sender_MB.java
public String clickBtnDetail(sender_DTO sender_dto) {
this._strID = sender_dto.getStrID();
return "Receiver?faces-redirect=true&includeViewParams=true";
}
Ссылка при нажатии станет http://localhost:8080/my_project/view/Receiver.xhtml?*ID=12345*
В ресивере
Receiver.xhtml
<f:metadata><f:viewParam name="ID" value="#{receiver_MB._strID}"/></f:metadata>
Он получит идентификатор параметра из представления отправителя и назначит его параметру Receiver_MB._strID.
Receiver.xhtml
<f:event listener="#{receiver_MB.preRenderView}" type="preRenderView" />
в тег метаданных f:
Receiver.xhtml
<f:metadata>
<f:viewParam name="ID" value="#{receiver_MB._strID}" />
<f:event listener="#{receiver_MB.preRenderView}"
type="preRenderView" />
</f:metadata>
Теперь мы хотим использовать этот параметр в нашем методе чтения базы данных, он доступен для использования
Receiver_MB.java
public void preRenderView(ComponentSystemEvent event) throws Exception {
if (FacesContext.getCurrentInstance().isPostback()) {
return;
}
readFromDatabase();
}
private void readFromDatabase() {
//use _strID to read and set property
}