В качестве альтернативы получению параметров непосредственно из запроса в вашем bean-компоненте вы можете использовать view parameters
.
Они должны быть объявлены на Facelet, где вы используете управляемый компонент, следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body>
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
</f:metadata>
<!-- Rest of Facelet here -->
</h:body>
</html>
Если вы сейчас запросите эту страницу, будет вызван установщик вспомогательного компонента со значением запроса, указанным для параметра id. Это работает как для GET
, так и для (не лиц) POST
запросов.
Преимущество в том, что здесь можно использовать стандартные конвертеры и валидаторы JSF. Конечно, если ваш управляемый компонент не привязан к конкретному представлению, это решение менее идеально.
Небольшая особенность, на которую следует обратить внимание, заключается в том, что при выполнении обычной обратной передачи после исходного запроса, предоставившего параметр представления, сеттер в вашем компоненте будет вызываться снова, даже если компонент находится в области просмотра и явно не указано новое значение. при условии.
Чтобы проверить, работает ли это, я использовал следующий управляемый компонент:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
@ManagedBean
@ViewScoped
public class MyBean {
Long id;
@PostConstruct
public void test() {
System.out.println("post construct called");
}
public void actionMethod(ActionEvent event) {
System.out.println("action called");
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
И следующий Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body>
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
</f:metadata>
<h:outputText value="#{myBean.id}"/>
<h:form>
<h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
</h:form>
<form method="post">
<input name="id" value="4" />
<input type="submit" value="submit" />
</form>
</h:body>
</html>
Введите число в поле ввода и нажмите кнопку отправки. Если число снова отображается на экране, значит тест прошел успешно. Обратите внимание, что вторая форма является обычной формой и не публикует никакого состояния JSF. Я проверил это на JBoss AS 6, и это работает. Доказательство параметра id в качестве параметра GET также работает.
person
Arjan Tijms
schedule
02.01.2011