【问题标题】:Why does JSF form preserve values?为什么 JSF 表单保留值?
【发布时间】:2013-09-02 19:28:15
【问题描述】:

这是我的登录页面的支持 bean。为什么调用logIn() 方法后会保留值?我的意思是在我提交表单并返回登录页面后,我之前输入的用户名已经存在。我认为通过使用@RequestScoped 注释不会保留值。

@Controller
@ManagedBean
@RequestScoped
public class LogInBean implements Serializable {

    private static final long serialVersionUID = 2092611147930386873L;

    @Autowired
    private UserService userService;
    private String username;
    private String password;
    private boolean rememberMe;

    public String logIn() {
        return "index?faces-redirect=true";
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isRememberMe() {
        return rememberMe;
    }

    public void setRememberMe(boolean rememberMe) {
        this.rememberMe = rememberMe;
    }

}

【问题讨论】:

  • 对于@RequestScoped,情况总是如此,只要您不注入任何具有“更高”范围的bean,它们可以使数据保持更长时间。我假设它只是保存输入的浏览器。尝试使用其他用户名。在这种情况下,浏览器无法再决定显示哪一个,应该将该字段留空。
  • 似乎总是保存最新的输入,记住我复选框也是如此。我还注意到在调用 logIn() 方法时会创建 cookie。
  • 需要一个 cookie,这就是会话 ID 的存储方式。

标签: jsf-2 jsf-2.2


【解决方案1】:

这是因为您实际上使用的是应用程序范围的 Spring 托管 bean,而不是请求范围的 JSF 托管 bean。

您的主要错误是您将 JSF bean 管理注释与 Spring bean 管理注释混合在一起,并且以某种方式期望它们能够无缝地相互理解。

@Controller
@ManagedBean
@RequestScoped

因此这是不正确的。您实际上最终得到了两个完全独立的托管 bean 实例,一个由 JSF 管理,另一个由 Spring 管理。 @RequestScoped 注释特定于 JSF bean 管理工具。 Spring 的等效项 @Scope("request") 不存在,因此 Spring 托管 bean 默认为应用程序范围。当像#{logInBean} 那样在 EL 范围内引用 bean 时,由于 Spring bean EL 解析器,Spring 托管的优先于 JSF 托管的,并且您最终会得到一个应用程序范围的 Spring 托管 bean。这完全解释了症状。

通过去掉 JSF bean 管理注释并放置所需的 Spring 范围注释来相应地修复它:

@Controller
@Scope("request")

(另一种方法是去掉 Spring bean 管理注释并将 @Autowired 替换为 @EJB,就像在没有任何第三方库的情况下使用标准 Java EE 堆栈时通常所做的那样)

如果您仍然遇到这个问题,那么另一个可能的原因是您正在同步提交登录,而输入字段中没有autocomplete="off",然后前往此问答:@987654321 @。

【讨论】:

  • 通过用 Spring 注释替换 JSF bean 管理注释使其工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2013-11-17
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多