我正在阅读Stackoverflow中的一篇旧帖子,内容如下:
In the big architectural picture, your own JSF code is the V:
M - Business domain/Service layer (e.g. EJB/JPA/DAO)
V - Your JSF code
C - FacesServlet
In the smaller developer picture, the architectural V is in turn dividable as follows:
M - Entity
V - JSP/XHTML page
C - Managed bean
So it's basically a M(MVC)C.
Run Code Online (Sandbox Code Playgroud)
在大写的情况下,JavaBean是一个模型,
但是在小写的情况下,Managed bean会变成一个控制器吗?
他们不是一回事> ?? 差异是什么?
我有一个用于本地化的属性文件:
foo=Bar
title=Widget Application
Run Code Online (Sandbox Code Playgroud)
这与resource-bundlefaces-config中的a相关:
<resource-bundle>
<base-name>com.example.messages.messages</base-name>
<var>msgs</var>
</resource-bundle>
Run Code Online (Sandbox Code Playgroud)
我可以使用EL在facelets视图中访问它:
<title>#{msgs.title}</title>
Run Code Online (Sandbox Code Playgroud)
但是,如果有像SQLExceptions这样的东西,我需要能够从托管bean编写消息.这一切都有效:
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "There was an error saving this widget.", null);
FacesContext.getCurrentInstance().addMessage(null, message);
Run Code Online (Sandbox Code Playgroud)
这是问题所在:我希望这些消息来自属性文件,以便它们也可以根据区域设置进行更改.有没有一种简单的方法来使用注入访问属性文件?
我知道Application-Scope持久存在于多个用户之间,因此我们应该确保所有ApplicationScoped ManagedBeans都是线程安全的.
我也明白,我们不需要关心RequestScoped ManagedBean的线程安全性.这是因为它仅针对一个HTTP请求而持续,并且如果被引用则针对每个请求进行新实例化.
但我不太清楚为什么我们应该担心SessionScoped ManangedBean的线程安全性.即使它在多个请求中持续存在,每个用户都可以获得自己的实例,对吧?
那么,为什么我们需要在SessionScoped ManagedBeand的情况下担心线程安全,这也适用于ViewScoped ManagedBean吗?ViewScope在同一视图的两个连续请求中持续存在,对吧?
我正在尝试使用BeanManager而不是Instance .select().get()创建CDI托管bean的实例.
这被建议作为我已经使用ApplicationScoped bean和他们的家属的垃圾收集的问题的解决方法 - 请参阅CDI应用程序和依赖范围可以合谋影响垃圾收集?对于背景和建议的解决方法.
如果在ApplicationScoped bean上使用Instance编程查找方法,Instance对象和从中获取的任何bean最终都依赖于ApplicationScoped bean,因此共享它的生命周期.但是,如果使用BeanManager创建bean,则会在Bean实例本身上设置句柄,并且显然可以明确地销毁它,我理解这意味着它将被GCed.
我目前的方法是在BeanManagerUtil类中创建bean,并返回Bean,实例和CreationalContext的复合对象:
public class BeanManagerUtil {
@Inject private BeanManager beanManager;
@SuppressWarnings("unchecked")
public <T> DestructibleBeanInstance<T> getDestructibleBeanInstance(final Class<T> type,
final Annotation... qualifiers) {
DestructibleBeanInstance<T> result = null;
Bean<T> bean = (Bean<T>) beanManager.resolve(beanManager.getBeans(type, qualifiers));
if (bean != null) {
CreationalContext<T> creationalContext = beanManager.createCreationalContext(bean);
if (creationalContext != null) {
T instance = bean.create(creationalContext);
result = new DestructibleBeanInstance<T>(instance, bean, creationalContext);
}
}
return result;
}
}
public class DestructibleBeanInstance<T> {
private T instance;
private Bean<T> …Run Code Online (Sandbox Code Playgroud) 我需要在另一个视图范围的bean中使用保存在视图范围bean中的一些数据.
@ManagedBean
@ViewScoped
public class Attivita implements Serializable {
//
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean
@ViewScoped
public class Nota implements Serializable {
@ManagedProperty("#{attivita}")
private Attivita attivita;
// Getter and setter.
}
Run Code Online (Sandbox Code Playgroud)
现在,也许我关于它的理论仍然很差,我注意到当#{attivita}注入时,Attivita构造函数被调用,从而创建另一个实例.这是正确的行为吗?如果我想引用同一个实例而不是创建一个新实例呢?
我对在JSF 2.x中的requestScoped bean中创建会话有疑问.我知道我们不需要在JSF 2.x中创建会话,因为我们可以直接使用sessionScoped bean来放置用户所需的数据.但我最近介绍了一个JSF代码,其中开发人员创建了session的实例变量并从facescontext获取会话,如下所示
@ManagedBean
@RequestScoped
Public class someClass(){
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
public void someFunction(){
//Some code here..
session.setAttribute("key","value");
//Some code here..
}
//rest of the code here...
}
Run Code Online (Sandbox Code Playgroud)
好吧,我告诉他们一个人不应该将"session"作为实例变量,也不需要在JSF 2中显式获取会话,而是使用sessionScoped bean.
对于第一个我给出了一个理由,"保持会话作为实例变量不是线程安全的",而对于第二个语句,我给出了"你正在为已经提供的JSF会话做一个解决方法".
我得到的反驳论点是,第一个原因"我们的网络应用是如此,因此不存在多线程问题".第二,我得到了"无论如何,一旦请求被处理,会话变量将被清除,所以这里没有任何错误.
我没有其他强项来纠正它.所以我的问题是,1)他们是否正确?2)我们应该以应该做的方式做任何其他具体原因吗?3)最后,任何可能促使他们使用这种方式的东西?
任何人都可以详细说明吗?请指正.谢谢
出于身份验证的目的,我将请求范围的支持bean注入另一个将存储已记录用户的会话范围bean.或者至少它应该...以下,一些代码:
请求scoped bean - 托管属性
@ManagedProperty(value="userLogin")
Run Code Online (Sandbox Code Playgroud)
错误 无法为托管bean凭据设置属性userLogin
堆栈跟踪
com.sun.faces.mgbean.ManagedBeanCreationException: Unable to set property userLogin for managed bean credentials
at com.sun.faces.mgbean.ManagedBeanBuilder$BakedBeanProperty.set(ManagedBeanBuilder.java:615)
at com.sun.faces.mgbean.ManagedBeanBuilder.buildBean(ManagedBeanBuilder.java:133)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:104)
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72)
at org.apache.el.parser.AstValue.getValue(AstValue.java:161)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:169)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at …Run Code Online (Sandbox Code Playgroud) 我是JSF的新手并且想知道:
如果我有一个处理给定页面的所有工作的控制器和一个包含所述页面的所有数据的bean,那么必须同时拥有
@ManagedProperty(value="#{myBean}")
Run Code Online (Sandbox Code Playgroud)
控制器上的注释和
@ManagedBean(name="myBean")
@SessionScoped
Run Code Online (Sandbox Code Playgroud)
表单bean上的注释?
我正在使用mojarra JSF 2.2.
我们定义的bean是基于anotation的例如.
@ManagedBean(name = "codeBean")
@ViewScoped
public class CodeRuleBean implements Serializable
Run Code Online (Sandbox Code Playgroud)
我使用tomcat 7.0.53来部署相同的.但是,我收到了警告说
警告:JSF1074:已经注册了名为"codeBean"的托管bean.
com.myclass.rule.ui.CodeRuleBean用com.myclass.rule.ui.CodeRuleBean.替换现有的托管bean类类型.
没有faces-config.xml.我faces-config.xml只用于定义导航规则.
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee \
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<application>
<navigation-handler>com.configurator.application.navigator.MyNavigator</navigation-handler>
</application>
<navigation-rule>
<navigation-case>
<from-outcome>codeRulePage</from-outcome>
<to-view-id>/pages/rule/shortCodeMain.xhtml
</to-view-id>
<redirect />
<to-flow-document-id />
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/pages/rule/shortCodeMain.xhtml</from-view-id>
<navigation-case>
<from-outcome>successPage</from-outcome>
<to-view-id>/pages/rule/successCodeRule.xhtml
</to-view-id>
</navigation-case>
</navigation-rule>
</<faces-config>
Run Code Online (Sandbox Code Playgroud)
这是web.xml,它不包含任何Web侦听器.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>MyWeb</display-name>
<context-param>
<description>State saving method: 'client' or 'server' …Run Code Online (Sandbox Code Playgroud) 我正在阅读JBoss中的这个示例,其中使用@RequestScopedbean备份JSF page来传递用户凭据信息,然后将其保存在@sessionScoped bean.以下是JBoss文档的示例.
@Named @RequestScoped
public class Credentials {
private String username;
private String password;
@NotNull @Length(min=3, max=25)
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@NotNull @Length(min=6, max=20)
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
Run Code Online (Sandbox Code Playgroud)
JSF表格:
<h:form>
<h:panelGrid columns="2" rendered="#{!login.loggedIn}">
<f:validateBean>
<h:outputLabel for="username">Username:</h:outputLabel>
<h:inputText id="username" value="#{credentials.username}"/>
<h:outputLabel for="password">Password:</h:outputLabel>
<h:inputSecret id="password" …Run Code Online (Sandbox Code Playgroud) managed-bean ×10
jsf ×7
cdi ×3
jsf-2 ×3
java ×2
java-ee ×2
annotations ×1
ejb ×1
javabeans ×1
jboss-weld ×1
jsp ×1