我想在托管 bean 操作方法中检索 JSF 输入框的值,而不会将它与任何托管 bean 属性关联。例如
<p:inputText id="txtuserid" value="" />
我的用例是,在我的应用程序中,我想在这里和那里提示用户为每个 DML 操作输入密码,因此希望在我的每个 UI 上都有一个密码和评论相关字段,并且备注需要保存在一个用于审计目的的公用表。
我怎样才能做到这一点?
我想在托管 bean 操作方法中检索 JSF 输入框的值,而不会将它与任何托管 bean 属性关联。例如
<p:inputText id="txtuserid" value="" />
我的用例是,在我的应用程序中,我想在这里和那里提示用户为每个 DML 操作输入密码,因此希望在我的每个 UI 上都有一个密码和评论相关字段,并且备注需要保存在一个用于审计目的的公用表。
我怎样才能做到这一点?
只需像 JSF 在幕后所做的一样:获取 HTTP 请求参数。如果您熟悉基本的 HTML,就会知道每个 HTML 输入元素都将其name=value
对作为 HTTP 请求参数发送。
给定一个
<h:form id="formId">
<p:inputText id="userId" /> <!-- Note: no value attribute at all, also no empty string! -->
...
<p:commandButton value="submit" action="#{bean.submit}" />
</h:form>
它基本上生成以下HTML
<form id="formId" name="formId">
<input type="text" name="formId:userId" ... />
...
<button type="submit" ...>submit</button>
</form>
您可以从以下位置获取它ExternalContext#getRequestParameterMap()
:
public void submit() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
String userId = ec.getRequestParameterMap().get("formId:userId");
// ...
}
如有必要,不要忘记手动转换和验证它,就像 JSF 在幕后所做的那样。换句话说,只需通过编写额外的代码来重复 JSF 的工作,这样您的代码就不会DRY :)
如果remark
s 属性独立于任何实体,那么它将仅作为属性依赖于托管 bean sessionScoped 或 requestScoped 根据您的需要,依赖于您想要的。如果您希望此属性独立于任何 Java Bean,则可以使用binding
inputText 标记的属性。
为此,请参阅此处 M. @BalusC 的良好回应:JSF 中的“绑定”属性如何工作?何时以及如何使用它?
另请参阅:在 JSF 表单中使用绑定的原因