我想知道如何从托管bean中读取输入文本的值。 我知道有可能以这种方式阅读并且它非常直接。
<h:inputText id="username" value="#{mylogin.username}" required="true" />
但是,如果我说我有一个像
这样的值 <h:inputText id="username" value="some_value" required="true" />
我想在我的托管bean中读取这个“some_value”。 有可能吗?
另一个问题是可以访问托管bean中的会话变量,还是应该以某种方式将它们传递给那里?
答案 0 :(得分:3)
<h:inputText id="username" value="#{mylogin.username}" required="true" />
在我看来,这将是最好的方式。你有理由想避免这种情况吗?你可以像harto suggests那样使用组件绑定,但是(正如Vinegar指出的那样)你从这种方法中得不到任何东西。
<h:inputText id="username" value="some_value" required="true" />
如果要读取上述值,可以直接从请求参数中读取它。 ExternalContext封装了底层容器API,可以在托管bean中访问,如下所示:
FacesContext facesContext = FacesContext
.getCurrentInstance();
ExternalContext extContext = facesContext
.getExternalContext();
Map<String, String> params = extContext
.getRequestParameterMap();
但是,除了违反模型 - 视图 - 演示者合同之外,您还可能遇到一些实际问题。参数键可能不是“用户名”,但可能类似于“j_id_jsp_115874224_691:username”,具体取决于您是否将该组件设为任何NamingContainer的子组件(如UIForm - 请参阅{{ 3}})或者视图是否为命名空间。在任何地方对这个值进行硬编码可能是一个坏主意。您可以阅读有关JSF组件ID与呈现的HTML ID prependId attribute之间的关系的信息。如果要使用here生成密钥,则需要返回组件绑定,因为需要获取对组件的引用。
另一个问题是可以访问托管bean中的会话变量..?
答案 1 :(得分:2)
在后一种情况下,some_value
不是bean管理的,恕我直言。尽管如此,你可以阅读。做这样的事情,
FacesContext ctx = FacesContext.getCurrentInstance();
HttpServletRequest request =
(HttpServletRequest)ctx.getExternalContext().getRequest();
request.getParameter("username");
同样,关于访问会话变量,
FacesContext ctx = FacesContext.getCurrentInstance();
HttpServletRequest request =
(HttpServletRequest)ctx.getExternalContext().getSession(false);
答案 2 :(得分:2)
读取组件值的常用方法是创建对托管bean中组件的绑定,并从中读取值。
例如:
<h:inputText id="username" value="some_value" required="true"
binding="#{mylogin.usernameField}" />
然后,在托管bean中:
private UIInput usernameField;
public void setUsernameField(UIInput usernameField) {
this.usernameField = usernameField;
}
public UIInput getUsernameField() {
return usernameField;
}
最后,要访问字段值:
Object value = usernameField.getValue();