jsf托管bean中的JSF inputText和Sessions

时间:2009-05-25 03:14:29

标签: java jsp jsf

我想知道如何从托管bean中读取输入文本的值。 我知道有可能以这种方式阅读并且它非常直接。

<h:inputText id="username" value="#{mylogin.username}" required="true" />

但是,如果我说我有一个像

这样的值
 <h:inputText id="username" value="some_value" required="true" />

我想在我的托管bean中读取这个“some_value”。 有可能吗?

另一个问题是可以访问托管bean中的会话变量,还是应该以某种方式将它们传递给那里?

3 个答案:

答案 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中的会话变量..?

请参阅UIComponent.getClientId

答案 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();