我有一个简单的页面,它与@RequestScoped
支持 bean 相关联。我从传递参数“项目”的其他页面进入此页面。所以当我进入正确的页面时,我有 url 之类的contextRoot/faces/jsf.xhtml?project=123
。
看法:
<f:metadata>
<f:viewParam name="project" value="#{entityBean.projectId}" />
</f:metadata>
...
<p:commandButton value="#{msg['button.add']}"
actionListener="#{entityBean.addNewEntity((entityName),(entityDescritpion))}"
ajax="true" update=":projectDetailForm"/>
支持豆:
@Named("entityBean")
@RequestScoped
public class EntityBean implements Serializable{
private String projectId;
@PostConstruct
public void init() {
params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
for (Map.Entry<String, String> entry : params.entrySet()) {
System.out.println(entry.getKey() + " / " + entry.getValue());
}
if (params.get("project") != null) {
projectId = params.get("project");
} else {
HttpServletRequest request =
(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
String projectId = request.getParameter("project");
}
}
//projectId getter and setter
//public void addNewEntity(String name, String desc) {}
}
第一次打开页面时一切正常。GET 参数已成功处理。但是,由于 bean 是请求范围的,它在请求结束时被销毁,并在后续回发时重新创建。在这些回发期间,GET 参数不再可用,即使它在浏览器地址栏中可见。我尝试了三种通过甚至从获取参数的方法,f:viewParam
但ExternalContext
我ServletContext
无法获取这些参数。
我不想更改@RequestScoped
为@SessionsScoped
,也不能使用@ViewScoped
,因为我正在使用 CDI bean,我不想混合它们。