【发布时间】:2015-05-20 03:03:54
【问题描述】:
我正在使用 JSR356 Web 套接字,并希望向我的服务器端点类添加一些函数和值,而不是创建另一个 ManagedBean。
我还想在请求之间保留 bean 属性,所以我用注释 @ViewScoped 注释了我的服务器端点。现在它看起来像这样:
@Named
@ViewScoped
@ServerEndpoint(value = "/session", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
public class ChatEndpoint implements Serializable {
@EJB
private LanguageHelper languageHelper;
private String language;
public void filterByLanguage() {
if (language == null)
language = "US";
}
@OnOpen
public void open(final Session session) throws IOException, EncodeException {
// ...
}
@OnMessage
public void onMessage(final Session session, final ChatMessage chatMessage) {
// ...
}
@OnClose
public void onClose(Session session) throws IOException {
// ...
}
// getters & setters
}
在我的 view xhtml 上,我正在尝试使用 ajax 更新属性 language。
<h:form>
<h:outputLabel value="Select languages you want to practice" for="languages"/>
<h:selectOneMenu value="#{chatEndpoint.language}">
<f:selectItems value="#{chatEndpoint.languageHelper.languages}" var="l"
itemLabel="#{l.language}" itemValue="#{l.code}"/>
<f:ajax event="change" listener="#{chatEndpoint.filterByLanguage}" render="@form" execute="@this"/>
</h:selectOneMenu>
</h:form>
起初,当 ajax 调用方法 filterByLanguage 时,值设置为字段 language,但之后,当我调用使用 @OnOpen 到 javascript 注释的方法时,language 为空。我认为 viewsocoped 应该在请求之间保持状态。谁能解释这种行为?提前致谢!
【问题讨论】:
标签: jakarta-ee jsf-2 websocket view-scope