我创建了一个网页,它从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}
我对此并不太熟悉,即使我自己研究了一点,也无法弄明白。有人知道解决方案吗?
答案 0 :(得分:1)
有两个问题。
首先,您将<f:event>
与@PostConstruct
混合在一起。
@PostConstruct
只能是不获取参数的方法。这解释了例外情况。摆脱那个注释。无论如何,当视图参数发挥作用时,它运行得太早。
其次,为了正确执行JSF页面,您需要确保浏览器地址栏中显示的URL模式与FacesServlet
中注册的/WEB-INF/web.xml
匹配。因此,如果是*.jsf
,那么您需要确保按/page.jsf
网址打开该页面,而不是/page.xhtml
。如果不这样做,JSF标签/组件和EL表达式将无法识别,因此被视为“纯文本”。
然而,更好的方法是直接将FacesServlet
映射到*.xhtml
的网址格式。这可以避免虚拟URL头痛。