JavaServer Faces(JSF)是一种模型 - 视图 - 展示器框架,通常用于创建基于HTML表单的Web应用程序。使用标准组件和渲染工具包,可以使用Facelets或JSP标记定义有状态HTML视图,并通过支持bean连接到模型数据和应用程序逻辑。
使旧的 httpssession 失效会删除当前 httpssession 的上下文
我的应用程序使用 @ViewScoped LoginBean 处理登录,该 LoginBean 注入了一个存储用户信息和当前 HttpSession 的 @SessionScoped SessionBean。 这个应用程序允许用户N单独
如何将 Web 应用程序从 Spring MVC 重新设计为 JSF?
我可以使用什么来进行数据访问、计时器等? Seam、jBoss、GlassFish?或者只是 Tomcat + JSF + Hibernate/JPA? 我只需要向 Spring MVC 页面添加一个 JSF 组件,但恐怕我必须重写整个...
h:commandLink / h:commandButton 的 oncomplete 属性未调用
我们正在从 JSF 1.2 迁移到 JSF 2.2.6 以及 RichFaces 4.5.2。面临未完成的问题没有被调用。 onclick 中的 JS 函数被调用,但 oncomplete 中的 JS 没有调用...
我在 JSF 中有一个命令按钮,当单击它时,它会执行一些 Java 代码。在执行此代码之前,我想执行一些检查,并且检查返回 true 我想显示一个弹出窗口,如何...
错误:jakarta.faces.view.facelets.TagAttributeException:jakarta.el.PropertyNotFoundException [重复]
在 wildfly-31.0.1.final 服务器中部署时出现错误 ERROR [nemo](默认任务 1)异常传递给 NewExceptionHandlerWrapper: jakarta.faces.view.facelets.TagAttributeException: /资源...
评估复合组件中是否设置了 MethodExpression 属性(获取 PropertyNotFoundException)
我有一个带有 MethodExpression 属性changeListener 的 UI 组件: 我有一个带有 MethodExpression 属性的 UI 组件 changeListener: <composite:interface> <composite:attribute name="changeListener" required="false" method-signature="void actionListener(javax.faces.event.ActionEvent)" /> .. </composite:interface> <composite:implementation> <p:remoteCommand name="ajaxOnChange" update="#{cc.attrs.onChangeUpdate}" oncomplete="#{cc.attrs.onchange}" actionListener="#{cc.attrs.changeListener}" /> .. </composite:implementation> 这个 changeListener 属性是一个可选方法表达式,用作 remoteCommand 中的 actionListener,我想仅在设置了 <p:remoteCommand> 属性时才渲染 changeListener。 我尝试了多种方法来检查属性是否设置,特别是: <c:if test="#{! empty cc.attrs.changeListener}"> 和 <p:remoteCommand rendered="#{cc.attrs.changeListener != null}" /> 但是我得到了 javax.el.PropertyNotFoundException,因为它尝试将属性评估为属性。 如何判断是否设置了可选方法属性? 谢谢 您已经在正确的方向上<c:if>了。 rendered 永远不会起作用。您只需要检查 EL 表达式 是否已设置,而不是实际将整个 EL 表达式作为值表达式进行计算并检查其结果是否不为空,如果 EL 表达式表示方法表达式,这当然会失败。 <c:if test="#{not empty cc.getValueExpression('changeListener')}"> ... </c:if> 然而,这个解决方案有点可怕:您在这里将方法表达式作为值表达式。然而,只要您没有实际评估所包含的 EL 表达式(就像您最初的 #{cc.attrs.changeListener} 尝试在幕后所做的那样),那么就没有什么问题。没有其他干净的方法,因为 JSF API 中没有像 UIComponent#getMethodExpression() 这样的东西。
Jakarta 部署时发生 wildfly-31.0.1.Final 错误
ERROR [nemo](默认任务 1)异常传递给 NewExceptionHandlerWrapper: jakarta.faces.view.facelets.TagAttributeException: /resources/components/new/commandLink.xhtml @53,44 test="#(lemp...
PrimeFaces 对话框 closeDynamic 不起作用
我们最近迁移到 PrimeFaces 11 并更改了代码以按照 https://primefaces.github.io/primefaces/11_0_0/#/core/dialogframework 打开和关闭对话框。 打开对话框,其中有...
在基于 JSF 2.1 和 Primefaces 6.0 的应用程序中,我尝试向数据表的标题添加工具提示。 在我当前的解决方案中,仅当精确指向鼠标时才会出现工具提示...
错误:jakarta.faces.view.facelets.TagAttributeBxception:jakarta.el.PropertyNotFoundException
在 wildfly-31.0.1.final 服务器中部署时出现错误 错误 [nemo](默认任务 1)异常传递给 NewExceptionHandlerWrapper: jakarta.faces.view.facelets.TagAttributeException: /资源...
Primefaces 14.0.0 中的图表导致 jQuery 出现错误
我从 Primefaces 13 更新到 Primefaces 14.0.0。图表功能已升级为使用 Chart.js,我相应地更新了我的代码。由于它不能开箱即用,所以我复制了示例......
自 PrimeFaces 14 起:datePicker 中的yearNavigator 显示为微调框而不是下拉菜单。 当你必须(在 100 年的列表中)到达 1917 年,而你在 2024 年,并且......
我面临着渲染通过嵌套复合组件中的构面传递的内容的问题。尽管分面被识别为非空,但这些分面内的内容不会出现在...
从 Jakara Faces 4.0 XHTML 访问 Kotlin 类
我一直在 WildFly (15.x -> 20.x) 上成功使用 Kotlin (1.4.10) 和 JSF (XHTML) 到 2018 年 12 月。使用 Java EE (8) 和 JSF。 我现在正在迁移现有的工作 Jakarta (Java) EE (1...
在某些情况下(例如每当发生异常时),如何在托管 bean 中以编程方式执行 JSF 内部页面转发?我不想在转发到其他页面时更改 URL。 对不对...
如果我尝试调用网络服务器上的 .xhtml 页面,我会收到 404。 我的 web.xml 如果我尝试调用网络服务器上的 .xhtml 页面,我会收到 404。 我的 web.xml <?xml version="1.0" encoding="UTF-8" ?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</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> </web-app> 我的项目结构: 在此输入图片描述 在我的容器上: 在此输入图片描述 当我调用“localhost/amazonlite/cart.xhtml”或“localhost/cart.xhtml”或“localhost/amazonlite/faces/cart.xhtml”或“http://localhost:8080/faces/cart.xhtml”时“我找不到资源。 faces-servlet 的 url 模式应该是简单的 *.xhtml,以便 JSF 处理任何路径上的所有 xhtml 文件,然后 url 应该是 http://localhost:8080/amazonlite/cart.xhtml 才能正常工作。 要对部署环境中使用的正确 URL 进行逆向工程:Web 应用程序的名称(本例中为“amazonlite”)默认是 URL 的一部分,Tomcat 侦听 HTTP 流量的默认端口是 8080。 Web 应用程序的名称默认为战争名称,不带 .war 扩展名。因此 amazonlite.war 变为 amazonlite。 供参考,问题中更改后的 web.xml: <?xml version="1.0" encoding="UTF-8" ?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</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>*.xhtml</url-pattern> </servlet-mapping> </web-app>
在 p:dataTable 中的 p:inputTextarea 中编辑多行文本
我想在单元格中编辑多行文本,所以我有以下代码: 我想在单元格中编辑多行文本,所以我有以下代码: <p:dataTable ... editable="true" editMode="cell"> <p:column ...> <p:cellEditor> <f:facet name="output"><h:outputText value="#{myBean.value}"/></f:facet> <f:facet name="input"><p:inputTextarea value="#{myBean.value}"/></f:facet> </p:cellEditor> </p:column> </p:dataTable> 但是我遇到了无法插入新行的问题,因为更改会在按下回车键时发送到后端。是否可以通过 ctrl+enter 发送更改或添加一个小的“确定”按钮? 你应该这样使用: <textarea cols="40" rows="3" value="#{myBean.value}" />
通过在javascript循环中单击commandButton多次发送Ajax请求
由于服务器限制,我遇到了问题。服务器只允许传输25MB以下的数据。应该上传的数据是80MB+。我正在使用 JSF、Primefaces 和 JavaEE...
<h:selectOneRadio>渲染表格元素,如何避免这种情况?
有没有办法告诉 JSF 在使用 时不应该渲染 元素? 我不使用表格,在这种情况下它完全没有意义。 任何帮助都是 有没有办法告诉 JSF 在使用 <table> 时不应该渲染 <h:selectOneRadio> 元素? 我不使用表格,在这种情况下它完全没有意义。 如有任何帮助,我们将不胜感激! JSF 2.3 具有 group 属性 根据 JSF 规范第 329 期,我向 group 添加了一个新的 <h:selectOneRadio> 属性,这应该会使这一切变得不那么乏味。父级 group 内具有相同 UIForm 值的所有单选按钮组件将彼此分组。此外,如果选择的项目具有非空 label,那么除了单选按钮本身和可选标签之外,它们不会呈现任何标记。如果有,标签将直接出现在单选按钮之后。 <!-- Just markup them the way you want! --> <ul> <ui:repeat id="items" value="#{bean.items}" var="item"> <li> <h:selectOneRadio group="foo" value="#{bean.selectedItem}"> <f:selectItem itemValue="#{item}" /> </h:selectOneRadio> </li> </ui:repeat> </ul> 以下场景也是可能的。当多个组件具有相同的 group,并且 value 属性和/或 UISelectItem 子组件不存在时,它将引用组中第一个组件的组件。 <h:selectOneRadio group="foo" value="#{bean.selectedItem}"> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneRadio> <h:selectOneRadio group="foo" /> <h:selectOneRadio group="foo" /> <h:selectOneRadio group="foo" value="#{bean.selectedItem}"> <f:selectItem itemValue="one" /> <f:selectItem itemValue="two" /> <f:selectItem itemValue="three" /> </h:selectOneRadio> <h:selectOneRadio group="foo" /> <h:selectOneRadio group="foo" /> <h:selectOneRadio group="foo" value="#{bean.selectedItem}"> <f:selectItem itemValue="one" /> </h:selectOneRadio> <h:selectOneRadio group="foo"> <f:selectItem itemValue="two" /> </h:selectOneRadio> <h:selectOneRadio group="foo"> <f:selectItem itemValue="three" /> </h:selectOneRadio> <h:selectOneRadio group="foo" value="#{bean.selectedItem}"> <f:selectItem itemValue="one" /> </h:selectOneRadio> <h:selectOneRadio group="foo" value="#{otherBean.selectedItem}"> <f:selectItem itemValue="two" /> </h:selectOneRadio> <h:selectOneRadio group="foo" value="#{lastBean.selectedItem}"> <f:selectItem itemValue="three" /> </h:selectOneRadio> 它将根据 2.3.0-m07 在 Mojarra 中提供。 带有直通元素的 JSF 2.2 如果您已经使用 JSF 2.2,请利用其新的 passthrough elements/attributues 功能,您可以将 name 属性显式设置为 passthrough 属性。为了在模型中设置提交的值,您只需要额外的<h:inputHidden>。 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:jsf="http://xmlns.jcp.org/jsf" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:a="http://xmlns.jcp.org/jsf/passthrough"> ... <!-- Just markup them the way you want! --> <ul> <ui:repeat id="items" value="#{bean.items}" var="item"> <li> <input type="radio" jsf:id="item" a:name="#{hiddenItem.clientId}" value="#{item}" a:checked="#{item eq bean.selectedItem ? 'checked' : null}" /> <h:outputLabel for="item" value="#{item}" /> </li> </ui:repeat> </ul> <!-- This one won't display anything. --> <h:inputHidden id="selectedItem" binding="#{hiddenItem}" value="#{bean.selectedItem}" rendered="#{facesContext.currentPhaseId.ordinal ne 6}" /> 深入的技术解释可以在此博客中找到:在 JSF 2.2 中使用 h:selectOneRadio 自定义布局。 PrimeFaces (JSF 2.x) 如果您碰巧使用PrimeFaces,那么您也可以将<p:selectOneRadio layout="custom">与<p:radioButton>一起使用。 <html ... xmlns:p="http://primefaces.org/ui"> <!-- This one won't display anything. --> <p:selectOneRadio id="foo" value="#{bean.selectedFoo}" layout="custom"> <f:selectItems value="#{bean.availableFoos}" /> </p:selectOneRadio> <!-- Just markup them the way you want! --> <ul> <li><p:radioButton for="foo" itemIndex="0" /></li> <li><p:radioButton for="foo" itemIndex="1" /></li> <li><p:radioButton for="foo" itemIndex="2" /></li> </ul> 您还可以循环遍历可用的项目,您只需要在 view build time: 期间执行此操作 <ul> <c:forEach items="#{bean.availableFoos}" varStatus="loop"> <li><p:radioButton for="foo" itemIndex="#{loop.index}" /></li> </c:forEach> </ul> 战斧(JSF 1.x 或 2.x) 如果您尚未使用 JSF 2.2 或者不喜欢 PrimeFaces UI,请使用 Tomahawk 的 <t:selectOneRadio>,它呈现与 <h:selectOneRadio> 相同的纯 HTML 输出,但支持 layout="spread" 属性,以便您可以定位按您想要的方式 <t:radio> 制作项目。 例如 <html ... xmlns:t="http://myfaces.apache.org/tomahawk"> <!-- This one won't display anything. --> <t:selectOneRadio id="foo" value="#{bean.selectedFoo}" layout="spread"> <f:selectItems value="#{bean.availableFoos}" /> </t:selectOneRadio> <!-- Just markup them the way you want! --> <ul> <li><t:radio for="foo" index="0" /></li> <li><t:radio for="foo" index="1" /></li> <li><t:radio for="foo" index="2" /></li> </ul> 自定义渲染器 提供定制Renderer。这只是一点点工作。从下面显示的第一个“另请参阅”链接开始: 另请参阅: 如何覆盖 h:selectOneRadio 渲染器? jsf-impl中的渲染器类在哪里? 是否可以使用 JSF 构建干净的 CSS 布局而不使用表格? 在没有 HTML 表格的情况下渲染 selectManyCheckbox 我不知道这对您来说是否足够合理,但是,这是一个示例解决方法。 xhtml代码: <ui:repeat value="#{myBean.valueList}" var="radioValue"> <input type="radio" name="radioSelection" value="#{radioValue}" checked="#{radioValue == myBean.selectedRadioValue ? 'checked' : ''}">#{radioValue}</input> </ui:repeat> 支撑豆: private String selectedRadioValue; private List<Integer> valueList; public MyBean() { valueList = new ArrayList<Integer>(); for (int i = 0; i < 15; i++) { valueList.add(i); } } public String getSelectedRadioValue() { return selectedRadioValue; } public List<Integer> getValueList() { return valueList; } public void actionMethod() { HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); selectedRadioValue = request.getParameter("radioSelection"); } 由于您无法直接在 xhtml 上为单选选项分配值,因此您需要从请求参数中获取它并在操作方法中手动分配它。