Java @非请求作用域Bean中的ManagedProperty(value=";{param.id}";)
我需要将参数(POST)传递给@managedBean,我使用了如下托管属性:Java @非请求作用域Bean中的ManagedProperty(value=";{param.id}";),java,jsf,jsf-2,managed,javabeans,Java,Jsf,Jsf 2,Managed,Javabeans,我需要将参数(POST)传递给@managedBean,我使用了如下托管属性: @ManagedProperty(value = "#{param.id}") private int id; Bean的作用域是ViewScope 我最终会出现以下错误: 无法创建托管bean收据。发现以下问题:-表达式#{param.id}request引用的对象的范围比引用的托管bean视图范围短 我能做什么 arjan看一看: 我的页面: Facelet标题 有两种方式: 使bean请求具有作用域,
@ManagedProperty(value = "#{param.id}")
private int id;
Bean的作用域是ViewScope
我最终会出现以下错误:
无法创建托管bean收据。发现以下问题:-表达式#{param.id}request引用的对象的范围比引用的托管bean视图范围短
我能做什么
arjan看一看:
我的页面:
Facelet标题
有两种方式:
@ManagedProperty
@ManagedBean
@RequestScoped
public class RequestBean {
@ManagedProperty(value="#{param.id}")
private Integer id;
@ManagedProperty(value="#{viewBean}")
private ViewBean viewBean;
}
视图范围bean在@PostConstruct
和请求范围bean的操作方法期间可用。您只需记住,在没有参数的情况下回发到同一视图时,id
可能会丢失@ManagedBean
@ViewScoped
public class ViewBean {
private Integer id;
@PostConstruct
public void init() {
id = Integer.valueOf(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"));
}
}
这样,初始id
在整个视图范围内都可用作为直接从bean中的请求获取参数的替代方法,您可以使用
查看参数
需要在使用托管bean的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>
以及以下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状态。我在JBossAS6上测试了它,它可以正常工作。证明id参数作为GET参数也有效。谢谢,第一个解决方案(将ViewScope bean注入RequestScope bean)是一个好的和流行的实践吗???我的应用程序由GlassFish提供,我也可以使用CDI bean,但我决定使用JSF bean做一些项目,因为我对JSF非常陌生,这是个好主意吗?取决于
id
的用途。您想在每次请求时“刷新”它吗?走第一条路。还是要在整个视图范围内使用初始值?走第二条路。谢谢,非常完整的描述。@Tarik:我总是从代码片段中省略显而易见的内容,以使答案更集中。考虑到问题的表述方式,OP非常清楚需要getter/setter。如果OP不知道,我宁愿添加一条注释,比如/+getter+setter
,而不是添加一大堆显而易见的注释。只要让你的IDE自动生成getter/setter并将它们隐藏在类的最底层。据我在书籍和教程中发现的,它们只适用于Get参数,你确定它们可以用于Post参数吗???…嗯,虽然我不是这方面的权威人士,但我很确定我以前在POST参数中使用过。我会再次检查并更新我的答案。我再次测试并更新了我的答案。这只是两个文件,所以应该很容易复制。我还查看了Mojarra源代码,以了解这些参数最终是如何解析的。在Mojarra 2.03中,它位于UIViewParameter第217行:String paramValue=context.getExternalContext().getRequestParameterMap().get(getName());由于请求参数映射始终包含POST和GET请求中的参数,因此这会自动说明它应该工作。然而,在JSF规范中,没有明确的语句支持POST和GET。规范似乎没有明确说明这一点。感谢您为我花费的时间。祝你好运:)。Java程序员和编程语言一样优秀。
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;
}
}
<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>