viewParam事件出错了

时间:2012-10-08 18:23:48

标签: jsf-2 javabeans facelets viewparams

我创建了一个网页,它从URL检查view-parameter,并调用bean的init方法来检索该用户。然后,该页面上的字段将填充该用户的信息。

但是出了点问题。

My Facelets页面:

<?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:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Tweetpage of #{userBean.getName()}</title>
    </h:head>
    <h:body>
        <f:metadata>
            <f:viewParam name="user" value="#{userBean.name}" />
            <f:event type="preRenderView" listener="#{userBean.init}" />
        </f:metadata>
        <h:commandButton value="Login" action="#{loginBean.login()}" id="login" />
        <div class="namebox">
            <label>User: #{userBean.name} </label> <br/>
            <br/>
        </div>
</h:body>
</html>

UserBean.java:

package beans;

import ...

@Named
@RequestScoped
public class UserBean implements Serializable {
    private String userName;
    private String name;
    private String bio;
    private String web;
    private Collection<Tweet> tweets;
    private Collection<User> followers;
    private User user;
    @Inject
    private @Named(value = "kwetterService")
    KwetterService service;

    @PostConstruct
    public void init(ComponentSystemEvent event) throws AbortProcessingException {
        System.out.println(name);
        user = service.find(name);
        if (user != null)
        {
            name = user.getName();
            bio = user.getBio();
            web = user.getWeb();
            tweets = user.getTweets();
            followers = user.getFollowing();
        }
    }
}

由于未调用System.out.println(name),我认为网页不会调用init。如果我在没有URL-adapttions(http://localhost:8080/KwetterJSF/)的情况下启动网页,则会收到以下错误消息:

  

WELD-000049无法调用[方法] @PostConstruct public   beans.UserBean@3c836d3d上的beans.UserBean.init(ComponentSystemEvent)

如果我添加参数(http://localhost:8080/KwetterJSF/index.xhtml?user=Sjaak),我会得到以下结果:

User: #{userBean.name}  

我对此并不太熟悉,即使我自己研究了一点,也无法弄明白。有人知道解决方案吗?

1 个答案:

答案 0 :(得分:1)

有两个问题。


首先,您将<f:event>@PostConstruct混合在一起。

@PostConstruct只能是获取参数的方法。这解释了例外情况。摆脱那个注释。无论如何,当视图参数发挥作用时,它运行得太早。

另见:


其次,为了正确执行JSF页面,您需要确保浏览器地址栏中显示的URL模式与FacesServlet中注册的/WEB-INF/web.xml匹配。因此,如果是*.jsf,那么您需要确保按/page.jsf网址打开该页面,而不是/page.xhtml。如果不这样做,JSF标签/组件和EL表达式将无法识别,因此被视为“纯文本”。

然而,更好的方法是直接将FacesServlet映射到*.xhtml的网址格式。这可以避免虚拟URL头痛。