我刚开始阅读Core JavaServer Faces,第3版.他们这样说(强调我的):
对于可以在JSF页面中使用的bean,有两种不同的机制,CDI bean和JSF托管bean,这是一个历史事故.我们建议您使用CDI bean,除非您的应用程序必须在像Tomcat这样的普通servlet运行器上运行.
为什么?他们没有提供任何理由.我一直在使用@ManagedBean在GlassFish 3上运行的原型应用程序中的所有bean,我还没有发现任何问题.我不介意迁移@ManagedBean到@Named,但我想知道为什么我应该打扰.
定义View Params之间有什么区别:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
并在ManagedBean中定义属性,如下所示:
@ManagedProperty(value = "#{param.id}")
private Integer id;
Run Code Online (Sandbox Code Playgroud) 我手头有一个小而完整的Java EE 6应用程序.
传统的注释正在使用: @Resource,@EJB,@Singleton,@PostConstruct,@PreDestroy,@PersistenceContext,@ManagedBean,@ManagedProperty,@RequestScope,@ApplicationScope,...
我想评估是否有必要引入CDI,并标准化依赖注入,bean生命周期管理等的通用策略.
问题:有没有人知道将传统Java EE 6注释转换为CDI注释的好文章,示例或手册?
为什么Java EE 6 CDI缺少@ViewScoped和@FlashScoped注释?(特别是前者让我感到奇怪,因为CDI源于Seam世界,它已经知道了非常相似的ScopeType.PAGE ...)
使用CDI时建议的解决方法是什么?使用Seam 3?
谢谢
我想在ManagedBean中使用注释@Inject或@Produce注入CDI Bean.我使用的CDI Bean是:
@Named
@Startup
@ApplicationScoped
public class BaseBean {
private List<String> custs;
public List<String> getCusts() {
return custs;
}
public void setCusts(List<String> emps) {
this.custs = emps;
}
public BaseBean(){
}
@PostConstruct
void init() {
custs = new ArrayList<String>();
custs.add("Cust1");
custs.add("Cust3");
custs.add("Cust2");
custs.add("Cust4");
}
}
Run Code Online (Sandbox Code Playgroud)
我想要注入CDI Bean的ManagedBean是:
@SessionScoped
@ManagedBean
public class Hello implements Serializable {
@Inject
private BaseBean dBean;
private static final long serialVersionUID = 1L;
private List<String> customers;
private List<String> customersSelect;
public Hello() {
}
@PostConstruct
void init() …Run Code Online (Sandbox Code Playgroud) 在JSP中,可以使用EL表达式(如$ {myBean.myAttribute})来使用CDI托管bean.这里没问题.
我想在JSP文件中使用@Inject的"常规注入"(即不使用EL表达式),例如:<%!@Inject MyBean myBean; %>然后是<%= myBean.getMyAttribute()%>.即使使用EL表达式可以实现该示例,其他一些用例也不能.
这似乎并不完全支持应用程序服务器:
- JBoss 6.0.0,JBoss 6.1.0,Resin 4.0.22:好的,它运行得很好.
- JBoss 7.0.1,GlassFish 3.x(测试了几个版本):FAILS,myBean仍为null.
它应该在JSP中正常工作,因为:
(1)它根据各种相关规范在servlet中正常工作;
(2)JSP在运行时被转换为servlet.
你们知道我想要做的事情是否得到支持?任何内部/实施信息可能?
最好的祝福.
感谢您的时间.
我正在解决如何在不使用会话范围托管bean的情况下将值从一个页面传递到另一个页面的问题.对于大多数托管bean,我希望只有Request范围.
我创建了一个非常非常简单的计算器示例,它将来自第5阶段的请求bean(CalculatorRequestBean)上的操作产生的Result对象作为初始化值传递给下一阶段生命周期中初始化的请求bean的新实例.
事实上 - 在生产环境中,我们需要传递更复杂的数据对象,这不像下面定义的结果那样原始.
您对此解决方案的看法是什么,它考虑了两种可能性 - 我们保持相同的观点或者我们导航到新的观点.但在这两种情况下,我都可以使用视图范围的托管bean获取传递的先前值.
计算器页面:
<?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">
<h:head>
<title>Calculator</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Value to use:"/>
<h:inputText value="#{calculatorBeanRequest.valueToAdd}"/>
<h:outputText value="Navigate to new view:"/>
<h:selectBooleanCheckbox value="#{calculatorBeanRequest.navigateToNewView}"/>
<h:commandButton value="Add" action="#{calculatorBeanRequest.add}"/>
<h:commandButton value="Subtract" action="#{calculatorBeanRequest.subtract}"/>
<h:outputText value="Result:"/>
<h:outputText value="#{calculatorBeanRequest.result.value}"/>
<h:commandButton value="Calculator2" action="calculator2"/>
<h:outputText value="DUMMY" rendered="#{resultBeanView.dummy}"/>
</h:panelGrid>
</h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)
带有运算乘法和除法的Calculator2页面:
<?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" …Run Code Online (Sandbox Code Playgroud) 我有一个(请求范围的)列表,用户可以从中选择"PQ"(链接列表).单击或以其他方式输入浏览器时,将显示每个PQ的主页面.每个PQ的页面都是表格
http://localhost:8080/projectname/main.jsf?id=2
这是PQ bean的第一个:
@Named
@ViewScoped
public class PqHome implements Serializable
{
@PersistenceContext(unitName="...")
private EntityManager em;
private Integer id;
private PQ instance;
@PostConstruct
public void init()
{
System.out.println("ID is " + id); // ID from URL param
instance = em.find(PQ.class, id);
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public PQ getInstance()
{
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
这是main.xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
...>
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="id" value="#{pqHome.id}">
<f:convertNumber integerOnly="#{true}" />
</f:viewParam> …Run Code Online (Sandbox Code Playgroud) 我正在尝试建立一个基于JBoss AS7的Web应用程序堆栈,用于满足以下要求的小规模研究原型和学生项目:
我想使用与Ajax相关的范围,例如ViewScope - 或者可能是MyFaces Orchestra中的(View)AccessScope - 用于我的托管bean,以及PrimeFaces组件.
基于JPA的持久性应该相当简单,无需处理OpenSessionInView模式等.我对JPA2的主要问题是可怕的LazyInitializationException,尤其是在AJAX调用中.我不要求在谈话手动控制.
我希望尽可能少地使用依赖项,因此主要依赖于JBoss AS7附带的内容.
现在,我已经建立了一个项目,其中包含以下(主要是提供的)Maven依赖项:
到目前为止看起来相当苗条.缺少的是对JSF特定范围的进一步支持,并且当在JSF页面中迭代集合时,我总是得到一个LazyInitializationException.现在,我的持久性服务类看起来像这样:
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
@Stateful @RequestScoped
public class TestEntityService implements Serializable {
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
// ... some methods working with the entityManager ...
}
Run Code Online (Sandbox Code Playgroud)
和我的ResourceFactory bean:
public class ResourceFactory {
@Produces @PersistenceUnit
private EntityManagerFactory entityManagerFactory;
}
Run Code Online (Sandbox Code Playgroud)
我尝试过失败与组合@Named代替@Stateful或@SessionScoped代替@RequestScoped.然而,我发现添加Seam 3 Persistence,Solder&Faces模块似乎可以解决我的大多数问题,但这会为我的项目增加大量的新依赖项(例如,seam-security,prettyfaces,drools,joda-time和其他依赖项) ).
我的问题是: …
我目前正在将一个项目从JBoss 4.2.2迁移到JBoss 6.0.0,我还在使用CDI添加依赖注入,并从JSF 1.2迁移到JSF 2.0.我将一个beans.xml文件添加到ejb-package以及war-package中.
现在我有一个使用托管bean的xhtml页面LoginBean.java.已经在faces-config.xml中配置了bean,如下所示:
<managed-bean>
<description>Sample description</description>
<managed-bean-name>loginBean</managed-bean-name>
<managed-bean-class>com.sample.managedbeans.LoginBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)
所以,首先我删除了上面的配置并添加@ManagedBean @SessionScoped到类本身.因为我想CDI添加到项目中,我改变了@ManagedBean对@Named(与质疑2930889).
现在,当我提交相应xhtml的表单时,字段username和password(在JSP中使用#{loginBean.username})为null.当我改回来时@ManagedBean,它工作正常.
我在这里错过了什么吗?
亲切的问候,塞巴斯蒂安
我编写了一个ViewScoped Managed-Bean,每当我在webbrowser中刷新页面时,Managed-Bean似乎都被重新创建,文章为null,它会加载一个新的文章对象,依此类推.对我来说,它看起来与RequestScoped的行为相同.
我将Eclipse IDE用于Java EE开发人员,最新的JDK,Apache Tomcat 7.0.8和Mojarra 2.0.3.
怎么了?
托管bean:
...
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
...
@ManagedBean
@ViewScoped
public class CreateArticle {
@ManagedProperty(value = "#{index.facade}")
private PersistenceFacade facade;
private Article article;
private Vector<ArtCategory> artcat;
public CreateArticle() {
artcat = ArtCategory.listArtCat();
}
@PostConstruct
public void postCreateArticle() {
if (article == null) {
try {
article = facade.createArticle();
} catch (DAOException e) {
e.printStackTrace();
}
}
}
public void setFacade(PersistenceFacade facade) {
this.facade = …Run Code Online (Sandbox Code Playgroud)