我有一个页面,它接收请求参数,然后生成信息,
例如,http://example.com/xxx/weather.jsf?place=california
。
这样做的目的是让用户为链接添加书签。
在weather.jsf中,有两个outputtext和一个commandlink:
Humidity : <ice:outputText value="#{weatherBean.humidity}"/>
Visibility : <ice:outputText value="#{weatherBean.visibility}"/>
<ice:commandLink id="likeButton"
value="Like"
actionListener="#{weatherBean.doLike}" />
在managedBean中:
@ManagedBean(name="weatherBean")
@RequestScoped
public class WeatherBean
{
String humidity;
String visibility;
int numLike;
@PostConstruct
public void init()
{
System.out.println("init called");
HttpServletRequest request= (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String place = request.getParameter("place");
setHumidity(WeatherDao.getHumidity(place));
setVisibility(WeatherDao.getVisibility(place));
setNumLike(GeneralDao.getNumLike());
}
public void doLike(ActionEvent event)
{
System.out.println("doLike called");
GeneralDao.addNumberLike();
}
}
好的,页面生成完美。
但是,当我单击doLike
commandLink时,
它始终首先触发init
方法,然后调用doLike
方法。
由于请求参数为空,因此所有其他值都将重置。
有没有办法阻止刷新页面或调用init
方法?
我尝试了部分提交或立即,但没有运气。
答案 0 :(得分:1)
你的bean是@RequestScoped,所以在执行JSF生命周期后,你的bean实例会丢失,直到下一个请求进入,此时你得到一个bean的新实例,并重新执行PostContruct。
尝试将bean的范围更改为更长寿的内容,例如@ViewScoped。