当点击一个按钮时,如何跳过使用JSF的JSR-303 Bean验证?
解释一些方法有点冗长的问题......考虑一个表单中的列表:
<h:form id="form">
<h:commandButton value="Add row">
<f:ajax execute="foo" listener="#{bean.add()}" render="foo" />
</h:commandButton>
<h:dataTable id="foo" var="foo" value="#{bean.foos}">
<h:column>
Name: <h:inputText id="field" value="#{foo.name}" required="true" />
<h:messages for="field" />
</h:column>
<h:column>
<h:commandButton value="Remove">
<f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)
当用户单击添加或删除行时,操作应该在没有验证的情况下执行.问题是,JSF重新呈现整个列表并尝试验证它.如果存在未验证的草稿更改,则会发生验证错误,并且永远不会调用侦听器方法(因为验证失败会阻止该操作).但是,添加immediate="true"到f:ajax允许方法执行,尽管有验证错误.但是,验证错误仍然会发生并显示在此处.
我看到两个选择:
1)使用immediate ="true"并且不显示验证错误
对于非验证按钮,设置immediate ="true"和h:消息:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Run Code Online (Sandbox Code Playgroud)
然后设置保存按钮(实际上应该尝试保存表单)以发送该参数:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
这会导致验证,但除非SHOW_VALIDATION存在参数,否则不会显示消息.
2)有条件地在facelets中声明验证:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
并保存按钮:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
这会导致字段仅在VALIDATE参数存在时进行验证(=按下保存按钮时).
但这些似乎都是一种黑客攻击.我怎样才能简单地使用JSR-303 Bean验证,但在声明时跳过它?
我在SO上讨论了一些其他的例子,讨论了一些奇怪的解决方法,但似乎都没有用,并且它们都是在JSF 2之前的版本中解决的.因此,它可以简单地输出映射的键吗?我试过ui:repeat和c:forEach就像下面没有运气一样:
<c:forEach items="${myBean.myMap.keySet}" var="var">
<h:outputText value="#{var}"/>
</c:forEach>
Run Code Online (Sandbox Code Playgroud) 使用类似的东西时
<h:panelGrid columns="1">
<ui:repeat var="o" value="#{mybean.list}">
<h:outputText value="#{o.text}"/>
</ui:repeat>
</h:panelGrid>
Run Code Online (Sandbox Code Playgroud)
让我们说10个列表条目我只得到1行例如:一个tr与1 td而当我使用c:forEach我得到10(但是c:forEach实际上是邪恶的,它用ajax弄乱了一切)
我使用mojarra 1.2 - 这是一个典型的Mojarra bug,它在MyFaces实现中不存在吗?它会在Mojarra版本的2.x中消失吗?
一如既往,我有点困惑.
在这里https://community.jboss.org/wiki/ModularWebAppsWithJSF2我已经了解到它很容易并且开箱即用,可以在JSF 2.0之后将模板捆绑在单独的jar中.
唯一的问题是:我无法让它发挥作用.我只是在Web应用程序WEB-INF/lib中包含的jar中部署所有类型的"page.xhtml"(META-INF目录,资源目录,root;有和没有faces-config.xml)并请求一些东西像http://host/demo/faces/page.xhtml或在模板上做"包含"或"装饰".我得到一个例外.
这里Java EE6>将JSF facelets(xhtml)和ManagedBeans打包为JAR,我最喜欢的JSF老师解释了使用自定义ResourceResolver来做到这一点.当我调试资源解析我毫不怀疑这将工作,并将尝试.
这是关于力学的问题 - 这两种方法有什么区别?
究竟是在META-INF /资源中自动查找哪些资源?
我开始学习JavaServer Faces(JSF).我正在使用GlassFish 3+.我刚刚在NetBeans中创建了一个新的JSF项目并运行该项目.它工作正常,但在检查XHTML输出时,我注意到XML声明留在了.这弄乱了DOCTYPE声明(它总是应该是文档中的第一个).

JSF应该删除XML声明,还是我做错了什么?
我正在使用JSF来呈现HTML页面.我像这样设计页面:
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="language" content="fr" />
<title><ui:insert name="title">My app</ui:insert></title>
</h:head>
<h:body>
<div id="top">
<ui:include src="/header.xhtml"/>
</div>
<h:panelGroup id="center" layout="block" >
<ui:insert name="center"/>
</h:panelGroup>
<div id="bottom">
<ui:include src="/footer.xhtml"/>
</div>
</h:body>
Run Code Online (Sandbox Code Playgroud)
此模板有一些"客户端"页面,如下所示:
<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:p="http://primefaces.org/ui"
template="/layouts/master.xhtml">
<ui:define name="center">
<ui:define name="title"><h:outputText value="#{myBean.description}"/></ui:define>
<ui:include src="#{myBean.url}"/>
</ui:define>
Run Code Online (Sandbox Code Playgroud)
在客户端,我必须在标题中添加元信息.如果我们有像outputScript或outputStylesheet这样的标签,可以在文档中的任何地方设置并在html"head"标签中呈现,那就太棒了.
我没有发现任何事情.当我处于这种情况时,有没有办法在标题中添加标记?谢谢 !
我正在尝试切换显示一个页面的页面<rich:dataTable>.在我刚刚包含<ui:include>模板之前,它只会显示整个表格.
<ui:include src="../log/viewDlg.xhtml"/>
Run Code Online (Sandbox Code Playgroud)
现在我希望能够在网页上打开/关闭它.在页面上显示可能有一个按钮或链接.我怎样才能实现它?
更新1:由于一些奇怪的原因,我无法让它出现,这是我到目前为止基于反馈写的内容
视图:
<a4j:commandLink value="View"
action="#{bean.showview}" render="viewPanel"/>
<h:panelGroup id="viewPanel">
<h:panelGroup id="tableRenderPanel" rendered="#{bean.showPolicyView}">
<ui:include src="../log/viewDlg.xhtml"/>
</h:panelGroup>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
支持豆:
private boolean showPolicyView = false;
public void showView() {
showPolicyView = !showPolicyView;
}
public boolean isShowPolicyView(){
return showPolicyView;
}
Run Code Online (Sandbox Code Playgroud) 我如何有条件地渲染<ui:define>?
模板中的数据取决于所需的数据<f:viewParam>.
但是如果提供了无效的视图参数,那么<ui:define>不应该渲染,因为应该使用模板的默认内容.
我尝试过使用<c:if>但不起作用.
我需要在HTML DOM load事件期间使用ajax执行JSF托管bean操作方法,类似于jQuery $(document).ready(function() { $.ajax(...) }).我只能在这个项目中使用JSF生成的JavaScript.有没有办法在原生JSF中做到这一点?我可以使用哪个事件或者我可以使用哪个JSF ajax函数?
我正在使用JSF 2.0,Facelets和PrimeFaces.
我正在使用Javascript和JSF为网站开发FB登录应用程序.我在这里发布了我的代码.问题是,当我运行我的应用程序时,它不会显示JSF页面,而是抛出以下异常:
Nov 28, 2013 7:21:46 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/FacebookLogin] threw exception [javax/servlet/jsp/jstl/core/Config] with root cause
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:344)
at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:153)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这里有什么问题,我该如何解决?
facelets ×10
jsf ×8
jsf-2 ×5
ajax ×1
composition ×1
head ×1
javascript ×1
jsf-1.2 ×1
jstl ×1
map ×1
mojarra ×1
packaging ×1
primefaces ×1
richfaces ×1
templating ×1
uiinclude ×1
uirepeat ×1
xml ×1