Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF托管bean中的JSF inputText和会话_Java_Jsp_Jsf - Fatal编程技术网

Java JSF托管bean中的JSF inputText和会话

Java JSF托管bean中的JSF inputText和会话,java,jsp,jsf,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读取输入文本的值。 我知道这是可能的阅读方式,它是非常直接的前进

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

但是如果我有这样一个值呢

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

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


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

在后一种情况下,
某些值不是bean管理的,IMHO。尽管如此,你可以读到这一点。这样做,

FacesContext ctx = FacesContext.getCurrentInstance();
HttpServletRequest request =
      (HttpServletRequest)ctx.getExternalContext().getRequest(); 
request.getParameter("username");
同样,关于访问会话变量

FacesContext ctx = FacesContext.getCurrentInstance();
HttpServletRequest request =
      (HttpServletRequest)ctx.getExternalContext().getSession(false); 

读取组件值的一种常见方法是在托管bean中创建与组件的绑定,并从中读取值

例如:

<h:inputText id="username" value="some_value" required="true"
    binding="#{mylogin.usernameField}" />
最后,要访问字段值:

Object value = usernameField.getValue();

在我看来,这是最好的办法。你想避免这样做有什么原因吗?您也可以使用组件绑定,但(正如醋指出的)这种方法没有任何好处

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

如果要读取上述值,可以直接从请求参数中读取。封装了底层容器API,可以在托管bean中访问,如下所示:

FacesContext facesContext = FacesContext
    .getCurrentInstance();
ExternalContext extContext = facesContext
    .getExternalContext();
Map<String, String> params = extContext
    .getRequestParameterMap();
FacesContext FacesContext=FacesContext
.getCurrentInstance();
ExternalContext=facesContext
.getExternalContext();
Map params=extContext
.getRequestParameterMap();
但是,除了违反模型视图演示者契约之外,您还可能遇到一些实际问题。参数键可能不是“username”,但可能类似于“j_id_jsp_115874224_691:username”,这取决于您是否将组件设置为任何s的子级(如-请参阅)或视图是否具有名称空间。在任何地方硬编码这个值可能是个坏主意。您可以阅读JSF组件ID和呈现的HTML ID之间的关系。如果要使用生成密钥,则返回到组件绑定,因为需要获取对组件的引用

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


请参阅。

在问题的第二部分,您是在谈论servlet会话,还是会话范围的托管bean?这将是组件绑定。不是个好主意,伊姆霍。这就是我没有提到它的原因。但是是的,这就是路。实际上,在本例中,您失去了POJO的简单性,并将bean完全与JSF绑定在一起。当然,除非您想对组件做其他事情,否则这是不实际的。最好的方法是众所周知的——只需使用一个值绑定表达式。参数名不能是“username”(参见我的答案);另外,如果您愿意,您可以避免使用servlet API。我非常喜欢这种方式,因为它不会将bean与JSF联系在一起。非常感谢您花时间向我解释。我真的很感激。我问这个问题的原因是因为JSF是我正在学习的第一个java框架,我非常喜欢它。这个问题是出于教育目的(在它之前,我尝试过古德,但没有找到好的解释),在reall应用程序中,我不会像那样使用它,但我想知道如何做到。啊,我完全忘记了命名问题。谢谢你指出。进一步处理地图是一个更好的主意+1.
<h:inputText id="username" value="some_value" required="true" />
FacesContext facesContext = FacesContext
    .getCurrentInstance();
ExternalContext extContext = facesContext
    .getExternalContext();
Map<String, String> params = extContext
    .getRequestParameterMap();