我有下面的代码:
<h:inputText id="userName" />
...
<h:commandButton actionListener="..." action="...">
<f:param name="userInput" value="user" />
</h:commandButton>
基本上我想获得inputText的值(由客户端提交)并将其存储到<f:param>
标记的属性value
中。我想这样做,所以我可以从请求参数访问用户名。有办法做到这一点吗?我知道我可以使用bean来存储输入值,但我只是想知道是否可以将请求值存储到请求参数对象中。
有一些方法:
-
从请求参数图中获取。根据标准HTML规范,HTML输入元素的name属性表示HTTP请求参数名称。在JSF中,HTML输入元素的名称与组件的客户端ID相同。
那么,给定一个
<h:form id="form"> <h:inputText id="userName" ... />
生成一个
<input name="form:userName">
,您可以通过以下方式获得提交的值String userName = context.getExternalContext().getRequestParameterMap().get("form:userName");
-
由
UIInput#getValue()
自行从组件处获取。JSF已经执行了应用请求值、转换/验证它们以及更新模型值的步骤。如果没有将输入组件的value
属性绑定到bean属性,那么它就会留在组件本身中。你只需要访问它。组件根据客户端ID在组件树中可用。UIInput userNameComponent = context.getViewRoot().findComponent("form:userName"); String userName = (String) userNameComponent.getValue();
-
将输入组件绑定到视图,并将
UIInput#getValue()
作为动作方法参数传递。<h:inputText binding="#{userName}" ... /> <h:commandButton ... action="#{bean.submit(userName.value)}" />
public void submit(String userName) { // ... }
无需多言,仅仅将输入值绑定到bean将更加简洁。
不需要f:param
。您可以像这样访问提交的文本:
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("generatedParameter");
生成的参数名在您的例子中并不像userName
那么简单,因为JSF准备了您组件的命名容器的id。最简单的方法是检查生成的HTML代码,看看输入组件的名称是什么。