0

我创建了一个网页,它检查来自 URL 的视图参数,并调用 bean 的 init 方法来检索该用户。然后用该用户的信息填充该页面上的字段。

但是出了点问题。

我的 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-adaptions ( http://localhost:8080/KwetterJSF/) 的情况下启动网页,我会收到以下错误消息:

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

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

User: #{userBean.name}  

我对此不是很有经验,即使我自己研究了一下,我也无法弄清楚。有人知道解决方案吗?

4

1 回答 1

1

有2个问题。


首先,您正在<f:event>@PostConstruct.

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

也可以看看:


其次,为了正确执行 JSF 页面,您需要确保出现在浏览器地址栏中的 URL 模式与FacesServlet注册在/WEB-INF/web.xml. 因此,如果是例如*.jsf,那么您需要确保通过/page.jsfURL 打开页面,而不是/page.xhtml. 如果您不这样做,JSF 标记/组件和 EL 表达式将不会被识别,因此将被视为“纯文本”。

然而,更好的是FacesServlet直接将*.xhtml. 这使您免于虚拟 URL 的头痛。

于 2012-10-08T19:07:55.933 回答