【问题标题】:JSF inputText and Sessions in jsf managed beanjsf 托管 bean 中的 JSF inputText 和 Sessions
【发布时间】:2009-05-25 03:14:28
【问题描述】:

我想知道如何从托管 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?

标签: java jsp jsf


【解决方案1】:
<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”,这取决于您是否使组件成为任何NamingContainers 的子项(如UIForm - 请参阅prependId attribute)或者如果视图是命名空间的。在任何地方硬编码这个值可能是个坏主意。您可以阅读 JSF 组件 ID 和呈现的 HTML ID here 之间的关系。如果您想使用UIComponent.getClientId 生成密钥,则返回到组件绑定,因为您需要获取对组件的引用。

另一个问题是可以访问托管 bean 中的会话变量吗..?

ExternalContext.getSessionMap

【讨论】:

  • 非常感谢您花时间向我解释事情。对此,我真的非常感激。我问的原因是因为 JSF 是我正在研究的第一个 java 框架,我真的很喜欢它。问题是出于教育目的(在此之前我尝试过,但没有找到好的解释),在实际应用中我不会那样使用它,但我想知道它是如何完成的。
  • 啊,我完全忘记了命名问题。感谢您指出。进一步处理地图是一个更好的主意。 +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); 

【讨论】:

  • 参数名可能不是“用户名”(见我的回答);此外,如果您愿意,您可以避免转换为 servlet API。
  • 我真的很喜欢这种方式,因为它不会将 bean 绑定到 JSF。
【解决方案3】:

读取组件值的常用方法是在托管 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 完全绑定。
  • 当然 - 除非您想对组件执行其他操作,否则这是不切实际的。最好的方法是众所周知的 - 只需使用值绑定表达式。
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 2015-10-24
  • 2023-03-05
  • 1970-01-01
  • 2011-07-10
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多