什么是单元测试JSF 2.0托管bean的最有效方法.我见过JBoss的JSFUnit,但看起来它是用于测试facelets页面中的组件而不是托管bean本身.
我想找到一种方法来有效地单独测试托管bean.
有任何想法吗?
我正在运行Glassfish 3.0,我正在实现JDBCRealm用于登录身份验证.用户名和角色保存在名为usertable的表中.身份验证按预期工作.
但问题是,当用户登录时,如何在应用程序中检索登录用户的用户名?
PS:我正在实现JSF页面和Managed Bean
我试图更好地理解@ViewScopedJSF 2中bean 的低级工作原理.服务器在请求之间保持视图范围的bean在哪里?我注意到我的视图范围的bean需要实现Serializable,所以它们必须被序列化到某个位置.
任何人都可以解释这个或提供解释它的文档的链接?
我问这个问题是因为我可能在我的webapp中引入了与范围相关的缺陷.了解@ViewScoped工作原理将有助于我排除一些潜在的原因.
这是我在这个美丽网站的第一个问题.我google了很多,但我没有找到任何解决方案.
我是JSF的新手,我正在通过Kent Ka lok Tong的"JSF 2 API和JBoss Seam"学习它.
现在我有一个简单的登录实现的问题.我有一个登录页面:
<?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>Login</title>
</h:head>
<h:body>
<h1>Login</h1>
<h:messages for="loginForm" />
<h:form id="loginForm">
<h:inputText id="username" value="#{loginRequest.username}" required="true" />
<h:inputSecret id="password" value="#{loginRequest.password}" required="true" />
<h:commandButton value="Login" action="#{loginRequest.doLogin}"></h:commandButton>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
和一个支持bean:
package app.controller;
import app.model.beans.User;
import javax.faces.bean.RequestScoped;
import javax.inject.Named;
@Named("loginRequest")
@RequestScoped
public class LoginRequest {
private String username;
private String password;
public String getUsername() {
return username;
}
public void …Run Code Online (Sandbox Code Playgroud) 我从jsf页面调用managedBean OverzichtAlle.java overzichtAlleGroepen.xhtml
但是当我进入这个页面时,由于Nullpointerexception,我得到的错误消息无法实例化managedBeans.OverzichtAlle ...
当我调试时,我看到我的ejbFacade为空...
这是EJB
@EJB private ProjecttypeEFacade ejbFacade;
Run Code Online (Sandbox Code Playgroud)
这是我的构造函数:
public OverzichtAlle()
{
projE = ejbFacade.findAll();
omvormenProjectTypes();
}
Run Code Online (Sandbox Code Playgroud)
projE是一个List(实体列表)
我究竟做错了什么?
我在f:metadata元素中使用prerender视图事件调用另一个页面.
如果我使用<h:link>它导航到页面工作并调用侦听器方法.
但是,如果我使用属于调用页面的托管bean的操作方法的结果导航到页面,则不会调用prerenderview中指定的侦听器(如果通过链接调用它).它会导航到第二页,只是没有监听器调用.
我真的更喜欢从action方法调用,因为我使用它来做一些工作并在会话映射中放置一个变量来使用.我不确定如何使用链接实现相同的功能.对象可能相当大...... kb不是Mb,但仍然不是我想要放在请求中的东西.
我已经尝试使调用页面请求的托管bean作用域并查看作用域.
如果从托管bean结果调用它,是不是可以获取prerenderview?正如我所说,我从一个链接开始工作.
<body>
<ui:define name="metadata">
<f:view>
<f:metadata>
<f:event type="preRenderView" listener="#{businessBean.init}" />
</f:metadata>
</f:view>
</ui:define>
<ui:composition template="#{navigationprops.soulard_2col_uprefs_template}">
Run Code Online (Sandbox Code Playgroud) 我有两个变量"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> …Run Code Online (Sandbox Code Playgroud) 我确实遇到了与此处所述相同的问题:JBoss7.1.3:@EJB在@Inject失败的情况下工作 可能是相同的设置(Wildfly 8.0).
尽管有一个带有生产者的Resource类,但我无法注入一个Logger实例.在Controller中Neiter,也不在EJB中.[问题1]如果我错了,请纠正我,我应该能够将它们注入@Model bean以及使用@Stateless(EJB)注释的bean,不应该吗?
package com.doe.webapp.service.auxilliary.cdiproducer;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;
@Dependent
public class Resources {
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器的开始:
package com.doe.webapp.controller.security;
import java.io.IOException;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;
import javax.enterprise.inject.Produces;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.Pattern;
import org.slf4j.Logger;
import …Run Code Online (Sandbox Code Playgroud) 我正在为Xpages应用程序构建managedBean.目前,bean在视图范围的faces-config中注册,因为我需要它在每个页面加载时重新初始化(见下文).bean的构造函数初始化了几个类变量,这些变量的值在整个类的代码中被引用.其中一个变量是Domino session对象,另一个例子是当前的document datasource:
private Session session;
private DominoDocument ds;
Run Code Online (Sandbox Code Playgroud)
两者都在构造函数中初始化为
session=DominoUtils.getCurrentSession();
ds=(DominoDocument) resolveVariable(dsName);
Run Code Online (Sandbox Code Playgroud)
(resolveVariable是一个内部帮助方法;不要认为我需要在这里解释一下)
除了构造函数和各种帮助器方法之外,在同一个类中还有一些其他公共方法在按钮单击时调用.大多数这些附加方法都使用相同的文档数据源以及当前的会话对象.
发生的事情是我的其他方法可以访问和使用全局数据源对象(ds)但是如果它们试图访问全局会话对象则会引发错误; 进一步向下堆栈跟踪我发现似乎导致错误:
NotesException: Object has been removed or recycled
Run Code Online (Sandbox Code Playgroud)
我的代码现在根本没有回收,会话对象必须在途中丢失.
作为一种解决方法,我开始将会话对象从SSJS传递到每个方法中
public void testMethod(Session s){System.out.println("my name is"+ s.getEffectiveUserName()); }
哪个工作正常.但是为什么bean对象会记住所有其他对象和变量而忘记全局会话?
BTW:我试图将我的managedBean绑定到会话范围,但这根本没有帮助.是的,我甚至在做出改变之后重启了整个服务器......
我有这个CSS代码:
td[data-date='2016-03-08']{
background-color: #F7F7F7;
}
Run Code Online (Sandbox Code Playgroud)
我想将其应用于要从数据库加载的多个日期。所有这一切都可能在我生成CSS代码的JSF托管bean中发生。
所以我的问题是,如何应用将从JSF托管bean中获得的CSS?