6

我有这样的支持bean:

@ManagedBean
@SessionScoped
public class TestBean {

    private String testString;

    public String getTestString() {
        return testString;
    }

    public void setTestString(String testString) {
        this.testString = testString;
    }
}

我的 xhtml 页面也很简单:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"    
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      >

    <h:head></h:head>

    <h:body>

        <h:form>
            <h:inputText value="#{testBean.testString}"/>
            <h:commandButton action="#{testController.testAction}"/>
        </h:form>

    </h:body>

 </html>

我想要的一切 - 渲染我的h:inputText元素没有价值(空)。
我是 JSF 的新手,所以,你能帮帮我吗?
最诚挚的问候!

更新!
它是简化的代码,我testString在其他地方使用并且testString具有价值,我想隐藏它!我想保持这个价值。

4

3 回答 3

7

如果它真的是一个请求/视图范围的bean,那么您很可能是浏览器内置自动完成/自动填充功能的受害者。autocomplete="off"您可以通过添加到有问题的输入组件来关闭它。

<h:inputText ... autocomplete="off" />

再次注意,填充输入的不是 JSF,而是网络浏览器本身。清除浏览器缓存,您会看到浏览器不会再这样做了。根据浏览器的品牌/版本,您还可以重新配置它以不那么急切地自动完成。


更新:根据您的问题更新,您的 bean 原来是会话范围的。这不是基于请求/视图的表单的正常范围。会话范围的 bean 实例在同一个 HTTP 会话中的所有浏览器窗口/选项卡(阅读:所有请求/视图)之间共享。您通常只在会话中存储登录用户及其首选项(语言等)。当您关闭并重新启动整个浏览器或使用不同的浏览器/机器时,您只会获得一个全新的实例。

将其更改为请求或查看范围。在这个特别简单的例子中,请求范围应该足够了:

@ManagedBean
@RequestScoped

也可以看看:


根据评论更新2 ,

哦,对了,我最好使用@RequestScoped。但这并不能解决我的问题——我想保留这个值,但我不想在 textInput 中显示它。该值在请求-响应周期的上下文中很重要。

现在具体的功能要求更加清晰了(在以后的问题中,请注意在准备问题时,我不知道您最初是这样问的)。在这种情况下,使用具有 2 个属性的视图范围 bean,如下所示:

@ManagedBean
@ViewScoped
public class TestBean {

    private String testString;
    private String savedTestString;

    public void testAction() {
        savedTestString = testString;
        testString = null;
    }

    // ...
}

例如,您也可以将其存储在数据库或注入的托管 bean 的属性中,而后者实际上又位于会话范围内。

于 2013-01-18T14:36:05.867 回答
2

您应该将输入文本绑定到支持 bean 中的某个其他字段。如果您想将该字段用于您的testString,请将输入的值复制到testString方法中testAction

<h:form>
     <h:inputText value="#{testBean.copyTestString}"/>
     <h:commandButton action="#{testController.testAction}"/>
</h:form>    

public String testAction()
{
    testString = copyTestString;
    return "destinationPage";
}
于 2013-01-18T14:40:34.057 回答
1

一些浏览器忽略自动完成 - 它可以帮助将自动完成放在表单标签中:

<h:form autocomplete="off">
于 2015-12-03T10:35:55.877 回答