JSF中的inputText和JSF管理的bean中的Sessions

3

我想知道如何从托管bean中读取输入文本的值。 我知道可以通过以下方式读取,而且非常简单明了。

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

但是,如果我有一个像这样的值:

 <h:inputText id="username" value="some_value" required="true" />

我想在我的托管Bean中读取“some_value”,这是可能的吗?

另一个问题是,在托管Bean中访问会话变量是否可能,还是我应该以某种方式将它们传递到那里?


在你的问题的第二部分,你是在谈论Servlet会话还是会话范围的托管bean? - harto
3个回答

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

在我看来,这是最好的方法。您是否有避免此方法的原因?您可以像harto建议的那样使用组件绑定,但是(正如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();

但是,除了违反模型-视图-表示器协议外,您可能会遇到一些实际问题。参数键可能不是 "username",而可能是类似于 "j_id_jsp_115874224_691:username" 的东西,这取决于您是否使组件成为任何 NamingContainer(如 UIForm - 请参见 prependId属性)的子级或视图是否具有名称空间。在任何地方硬编码此值都可能是一个坏主意。您可以在此处阅读JSF组件ID和呈现HTML ID之间的关系。如果要使用UIComponent.getClientId生成密钥,则需要回到组件绑定,因为您需要获取对组件的引用。

另一个问题是是否可以在托管bean中访问会话变量..? 请参见ExternalContext.getSessionMap

非常感谢您抽出时间向我解释这些事情,我真的很感激。我之所以问这个问题是因为JSF是我学习的第一个Java框架,我真的很喜欢它。这个问题是为了教育目的而提出的(在此之前我尝试过搜索,但没有找到好的解释),在实际应用中我不会像那样使用它,但我想知道如何做到这一点。 - Dmitris
啊,我完全忘记了命名问题。谢谢你指出来。进一步处理地图是一个更好的想法。+1 - Adeel Ansari

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); 

1
参数名称不能为“username”(请参见我的答案);此外,如果您愿意,可以避免转换为servlet API。 - McDowell
我非常喜欢这种方式,因为它不会将bean与JSF绑定在一起。 - Dmitris

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

那就是组件绑定。在我看来,这不是一个好主意。这就是我没有提到它的原因。但是,是的,这是一种方法。实际上,在这种情况下,您会失去POJO的简单性,并将您的bean与JSF完全绑定在一起。 - Adeel Ansari
当然 - 除非您想对组件进行其他操作,否则这并不实用。最好的方法是众所周知的 - 只需使用值绑定表达式即可。 - harto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接