我在Java EE 6应用程序服务器(GlassFish v3)中使用带有Facelets的JSF 2.0.我在web.xml中为异常配置了一个错误页面:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error-all.xhtml</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
这是/error-all.xhtml测试页面:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
template="/resources/templates/decorator.xhtml">
<ui:define name="title">Title</ui:define>
<ui:define name="body">
<h1>Body</h1>
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
我实现了一个托管bean,当我点击我的一个commandLinks时,它会故意抛出RuntimeException.当发生这种情况时,会显示/error-all.xhtml页面的内容,但它不会通过Facelets获取进程,因此不会应用template ="/ resources/templates/decorator.xhtml".
使用谷歌浏览器,我只看到"标题"和"正文",结果没有布局.如果我要求Chrome检查这些元素,我会得到完整的源代码,其中包括ui:composition和ui:define标记,Chrome显然无法理解.这证实了我的理论,即Facelets页面没有被处理.
所以,我的问题是,如何解决这个问题?如何处理错误页面并返回HTML代码,该代码是模板与错误页面内容组合的结果?
今天我想了解JSF生命周期的一些功能.让我开始吧:
1 - 阶段2:应用请求值 - 在此阶段,视图中的每个组件将在请求中搜索其值并将新值设置为它们
嗯,好的.因此,View将由于之前的Beans参数而构建.之后,有一个部分视图,使用请求值生成.(对吧?之后,在3°阶段,他们将进行比较).但是,例如,如果在创建最后一个视图期间缺少请求列表中的值?值将为null?
2 - 阶段5:调用应用程序 - 一旦将请求的所有值成功设置到辅助bean,将处理在应用请求值阶段排队的操作事件.在我们的例子中,提交按钮动作方法.
这根本不清楚.此时我(在bean上)从前一阶段更新的值(如果验证和应用请求未失败).好的,现在发生了什么?在处理申请请求值阶段期间排队的操作事件的含义是什么?这意味着,例如,如果操作是提交,则该过程已完成?这就是为什么ajax调用,如果不在2°阶段呈现,将会失败?或者失败的地方?
3 - 阶段6:渲染响应 - 在此阶段,组件树将呈现给客户端.
这意味着使用更新的bean值更新服务器上的View?然后,在此之后,HTML代码是从此视图创建的?或者只是它制作了HTML代码并保存了View状态?
希望你能帮我 :)
我编写了一个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) 在postgres数据库中,我有一个表,其中包含一个int []字段.
在我的模型中,我有一个映射表的持久bean,包括int []字段.在本课程中,我已经实现了所有需要的setter/getter.
现在,我有一个托管bean,它也扮演控制器角色,并链接到模型bean.所以,在我的xhtml中我试图这样做:
<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
<h:inputText value="#{baseNumber}"/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)
baseSetList 是int []数组.
问题是,当我提交表单时,只有这个元素不会更新.初始化正在运行,getter被调用,但不是save,所以它必须是绑定的东西.长话短说,我试图用一个自定义类的ArrayList替换int []数组,它可以包装int(就像一个可写的Integer),但它不起作用.
也许这是重复不能正确绑定,我真的不知道.这是我经过多年的PHP :)后在java中的第一个项目.
我在我的jsf应用程序中使用facelets进行模板化.我想在ui:composition标签中有条件地包含一个模板文件.如果用户已登录,则模板必须为"authorized.xhtml",如果用户未登录,则模板必须为"unauthorized.xhtml".有办法吗?谢谢.
<ui:composition template="/templates/unauthorized.xhtml">
<ui:composition template="/templates/authorized.xhtml">
Run Code Online (Sandbox Code Playgroud)
我正在使用JSF 1.2.
我想通过使用<ui:repeat>和<p:dialog>使用创建动态对话框窗口<ui:include>.但是当我尝试下面的时候有一个例外.
main.xhtml
<p:outputPanel id="windowsPanel" layout="block" style="width:100%;">
<p:outputPanel rendered="#{mainView.dynamicWindows ne null}">
<ui:repeat var="item" value="#{mainView.dynamicWindows}">
<p:dialog binding="#{item.dialog}">
<ui:include src="#{item.includedWindowPath}" />
</p:dialog>
</ui:repeat>
</p:outputPanel>
</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)
MainView.java
@ManagedBean(name = "mainView")
@SessionScoped
public class MainView extends BaseView {
private static final long serialVersionUID = -6291834350102049312L;
private List<Window> dynamicWindows;
@PostConstruct
public void init() {
fillWindows();
}
private void fillWindows() {
dynamicWindows = new ArrayList<Window>();
for (int i = 0; i < 3; i++) {
Window window = new Window("Header " …Run Code Online (Sandbox Code Playgroud) 使用Netbeans在Glassfish 3.1.2.2上部署Web应用程序,并且我的h标签都不会显示在Web上.例如:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">
<head>
<title>Draft Savvy Beers</title>
</head>
<h:form>
<h:body>
<h1>Search for beers</h1>
<p><strong>Would you like to search for a beer?</strong>
<h:inputText value="#{draftSavvyController.searchTerm}" />
<h:commandButton value="#{draftSavvyController.searchforBeers}" /></p>
</h:body>
</h:form>
</html>
Run Code Online (Sandbox Code Playgroud)
仅显示文本,不显示输入字段或按钮.使用普通的旧HTML显然会显示字段和按钮,但我无法以这种方式访问我的控制器.这是我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>login.xhtml</welcome-file>
</welcome-file-list>
</web-app>
Run Code Online (Sandbox Code Playgroud)
如果我能提供更多信息,请告诉我.我很陌生......
我正在使用JSF 2.1.8实现一个Web应用程序,我遇到了ui:include标记的问题.我有这个代码
<h:panelGroup id="panelContenido">
<ui:fragment rendered="#{!empty navigationManagerSystem._Navegable}">
<ui:include src="#{navigationManagerSystem._Navegable._IncludePath}" />
</ui:fragment>
<ui:fragment rendered="#{empty navigationManagerSystem._Navegable}">
<ui:include src="/system/navigation/error.xhtml" />
</ui:fragment>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
该navigationManagerSystem bean被JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容.如果我按照这样的常量执行此操作,<ui:include /system/home/index.xhtml" />但是如果我将它放在变量中则不行,即使我已经看到变量在屏幕打印之前保持该值.我不知道它是否能与持有/system/home/index.xhtml页豆,这是有关视图作用域.
无论如何,如果我在页面渲染后立即刷新页面,则正确包含xthml.顺便说一句,我已经简化了要包含的页面,以便没有任何jstl标签,因为我知道它们可能会导致View Scope出现问题.
有什么想法吗?
假设我有一个用户名来验证,在这种情况下,当验证失败时,我需要以红色显示用户名outputText和用户名inputText字段以及错误消息.
我试图在面板组中绑定所有这些,以便在验证失败时,所有字段都应该受到影响.但是简单地放置panelgroup是行不通的.
我的支持bean验证器
public void emailValidate(FacesContext context,
UIComponent componentToValidate,
Object value)
throws ValidatorException {
String email = value.toString();
if (!Validator.isEmailAddress(email))
{
FacesMessage message =
new FacesMessage(FacesMessage.SEVERITY_ERROR,"Email","Please enter valid email address");
throw new ValidatorException(message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的Jsf
<h:panelGroup>
<h:outputText value="Email"/>
<h:message for="emailInput/>
<h:inputText id="emailInput" value="#{mybean.email}" validator="#{mybean.emailValidate}"/>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud) 我有一张表格.表中的一列显示一行按钮,用于编辑和删除表条目.当我删除一个条目时,从按钮的action属性中调用控制器,它按预期工作.
但是,一旦我添加了一个对话框让用户确认删除,就会删除错误的条目.它始终是当前表中的最后一个条目.我不知道原因是什么 - 我使用相同DataTable var的按钮和对话框.
我正在使用JSF 2(Mojarra 2.1.6)和Primefaces 3.5在Suse 12.2机器上部署JBoss 7.1.1.
表格:
<h:form id="downloads">
<ui:include src="components/table.xhtml"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
桌子:
<ui:composition>
<p:dataTable value="#{controller.currentLevelResources}"
var="download" id="downloadTable" scrollHeight="120" rows="10">
<p:column sortBy="#{download.name}">
<f:facet name="header">Name</f:facet>
<h:outputText id="downloadName" value="#{download.name}" title="#{download.description}" />
</p:column>
...
<p:column>
<ui:include src="menuBar.xhtml"></ui:include>
</p:column>
Run Code Online (Sandbox Code Playgroud)
菜单栏:
<ui:composition>
<p:commandButton id="edit"
action="#{downloadEditController.editResource(download)}"
icon="ui-icon-gear" title="Edit" oncomplete="updateStyles()"
update=":downloads" />
<p:commandButton id="delete" onclick="deletedDlg.show();"
icon="ui-icon-trash" title="Delete" oncomplete="updateStyles()" />
<p:dialog header="Delete confirmation" widgetVar="deletedDlg"
resizable="false">
<h:panelGroup layout="block" style="padding:5px;">
<h:outputText
value="The Resource #{download} will be deleted. Proceed?" />
</h:panelGroup>
<p:commandButton …Run Code Online (Sandbox Code Playgroud)