我有两个变量“ userId”和“ name”。例如,当我单击“ SHOW USERID”按钮时,它可以正常工作并设置为“ renderUserId =
true”,并使用“ render”显示它,但是如果我单击另一个“ SHOW”按钮,则表示Bean处于重建状态并且松动了“ renderUserId =
true”,它变为“ false”和“ renderName = true”,因此显示确定,但是USERID被隐藏。
我的问题是,渲染xhtml时如何避免丢失bean值?
这是我的代码的简单模拟。
注意:如果我在“ h:commandButton”中使用“ actionListener”而不是“
f:setPropertyActionListener”,我将得到相同的结果,则该bean将被重建
example.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface componentType="com.bean.ExampleBean">
<cc:attribute name="userId" type="java.lang.Integer"/>
<cc:attribute name="name" type="java.lang.String"/>
</cc:interface>
<cc:implementation>
<h:panelGrid id="example_panel" columns="1" width="100%">
<h:outputText value="USERID: #{cc.attrs.userId}" rendered="#{!cc.attrs.renderUserId}"/>
<a4j:commandButton value="SHOW USERID" render="example_panel"
rendered="#{!cc.attrs.renderUserId}">
<f:setPropertyActionListener value="#{true}"
target="#{cc.attrs.renderUserId}"/>
</a4j:commandButton>
<a4j:commandButton value="HIDE USERID" render="example_panel"
rendered="#{cc.attrs.renderUserId}">
<f:setPropertyActionListener value="#{false}"
target="#{cc.attrs.renderUserId}"/>
</a4j:commandButton>
<h:outputText value="NAME: #{cc.attrs.name}" rendered="#{!cc.attrs.renderName}"/>
<a4j:commandButton value="SHOW NAME" render="example_panel"
rendered="#{!cc.attrs.renderName}">
<f:setPropertyActionListener value="#{false}"
target="#{cc.attrs.renderName}"/>
</a4j:commandButton>
<a4j:commandButton value="HIDE NAME" render="example_panel"
rendered="#{cc.attrs.renderName}">
<f:setPropertyActionListener value="#{false}"
target="#{cc.attrs.renderName}"/>
</a4j:commandButton>
</h:panelGrid>
</cc:implementation>
</ui:composition>
ExampleBean.java
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;
@FacesComponent("com.bean.ExampleBean")
public class ExampleBean extends UINamingContainer {
private Integer userId;
private String name;
private boolean renderUserId;
private boolean renderName;
}
这里有一个主要的误解。那不是支持豆。这是一个支持组件。
JSF
UI组件实例不在视图范围内,而是在请求范围内。它们会在渲染响应结束时销毁(将其状态保存到JSF视图状态之后),并在视图构建期间进行重新创建(并且它们的状态将从JSF视图状态恢复)。
您已将有状态属性分配为组件的实例变量。这是不对的。您应该将它们显式存储在JSF状态。正确的方法是让getter和setter委托给UIComponent#getStateHelper()
。声明为<cc:attribute>
已隐式执行的任何属性都可以这样做。您绝对不需要将它们重新声明为支持组件的实例变量。
那些未声明为的布尔值<cc:attribute>
必须重新实现,如下所示:
public Boolean getRenderUserId() {
return (Boolean) getStateHelper().eval("renderUserId", Boolean.FALSE);
}
public void setRenderUserId(Boolean renderUserId) {
getStateHelper().put("renderUserId", renderUserId);
}
在您的action(listener)方法中,只需进行相应的调用即可setRenderUserId(true)
。
不要忘记相应地修复EL表达式:
#{cc.renderUserId}
我不明白在spring mvc中使用dispatcher servlet只创建了一个bean对象,还是每个请求都创建了一个新对象? 控制器代码:- 在代码中,我在LoginBean对象中设置数据,并在方法abc中的modelandview对象中设置它。 然后,在jsp中,我没有为usename输入任何值,在这种情况下,当我提交表单并调用处理程序方法(initform)时,我试图打印相同的lb.ge
我有一个遗留的Java1.6运行localhostTomcat 7应用程序使用JSP页面,一个带有框架的框架集,javascript,但没有像Struts这样的框架。我使用请求或会话从servlet传递一个对象以在页面中显示,这很好。 然而,我最近做了一些更改,现在我无法从会话或请求中检索到相同的对象。它以前工作得很好,所以我不确定是什么坏了,但我甚至无法将字符串值从JSP返回到servlet。
问题内容: 我刚刚启动了一个简单的Java测试项目,该项目使用Hibernate管理某些实体,并提供REST接口来操纵这些对象并提供一些其他业务逻辑。REST接口是使用RESTEasy和Jetty创建的。 到目前为止,一切工作正常,但是我感觉我实际上写了太多样板代码。由于我在这些Java框架中没有太多经验,所以我只是想知道是否有人可以给我提示如何改善这种情况。 每个请求创建hibernate会话
我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它
我正在尝试用java编写以下SOAP请求,但似乎很难在请求中引用id类型元素。有人知道如何使用java编写以下请求javax.xml.soap?我从一个非常简单的请求开始。非常感谢任何帮助。谢谢!
基本上,我们希望每一个请求都重新加载用户的权限,因为用户的权限可能会在不同的web请求之间发生变化。 例如,一个用户登录并随后被授予新的权限(并通过电子邮件通知他们拥有新的权限),我知道该用户实际获得新权限的唯一方法是注销,然后再次登录。如果可能的话,我会尽量避免。 欢迎任何友好的建议。