JavaServer Faces(JSF)是一个模型 - 视图 - 展示器框架,通常用于创建Web应用程序。与JSF 1.x相比,版本2.x是领先一步,显着扩展了标准的组件和组件库集。
自 java 8 以来,tomcat 日志中出现“位置 X 处未知类型常量池”
我在 Tomcat 服务器上部署了一个基于 Java JSF2 Web 的应用程序,自从我们迁移到 Java 8 / Tomcat 8 后,此错误在 tomcat 输出中出现很多: 十二月2016 年 05 月 10:51:07 上午 com.sun.faces。
困惑:与经典 MVC 控制器相比,JSF2 中 Bean 的作用
我有一个与设计和架构更多相关的问题。我有基于经典 MVC 的背景,必须亲自接触 JSF2。我阅读了有关 JSF2 的 IBM 文章 (http://www...
在某些情况下(例如每当发生异常时),如何在托管 bean 中以编程方式执行 JSF 内部页面转发?我不想在转发到其他页面时更改 URL。 对不对...
我有 JSF 验证的特定用例。例如我有一个 inputText 字段: 我有 JSF 验证的特定用例。例如我有一个 inputText 字段: <p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}"> <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText> 输入的值是数字(在某些情况下,它也可以是字符串,因为这是复合组件的一部分,但如果我们假设这是一个数字,则可以更好地描述问题)。此输入是表单的一部分,在表单末尾我有提交按钮: <p:commandButton value="Save" actionListener="#{myBean.save}"/> 我的要求是什么: 按下提交按钮时,应处理所有验证,这是可以的,效果很好。 当在输入字段上触发模糊事件时,如果字段不为空,则应处理数字验证,这也可以。最后,我将 id name 的字段更新为一些值。 现在我有一个问题。我的第三个请求是当输入为空时不应处理输入验证。这是特殊情况,我将清除 id name 的字段。当我删除已在输入中输入的文本、从组件中删除焦点(例如按 TAB)时,也会出现这种情况,在这种情况下,还应该处理 AJAX 请求,并且名称输入也将被清除。 如何在输入字段为空时禁用对此字段的验证,并且仅针对此 ajax 事件? 让输入的 required 属性检查是否按下了保存按钮(可以通过隐式 EL 变量 #{param} 所提供的请求参数映射中其客户端 ID 的存在来识别)。 <h:form> <p:inputText ... required="#{param.containsKey(save.clientId) and myBean.required}" /> <p:commandButton binding="#{save}" ... /> </h:form> (注意:不要将其绑定到 bean 属性!代码按原样) 这样它只会在实际按下保存按钮时评估true。 或者,如果您对 binding 有问题和/或对按钮的客户端 ID 进行硬编码没有问题: <h:form id="formId"> <p:inputText ... required="#{param.containsKey('formId:buttonId') and myBean.required}" /> <p:commandButton id="buttonId" ... /> </h:form> 如果输入为空,只需在接受输入时删除必需的属性即可。然后编写一个自定义验证器,它只接受空输入或数字输入。 <p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator"> <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText> public class customerNumericInputValidator implements Validator { @Override public void validate(FacesContext facesContext, UIComponent uIComponent, Object object) throws ValidatorException { String number = (String) object; number = Strings.nullToEmpty(number).trim(); //if the request is a full request then number can not be empty if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number)) { FacesMessage message = new FacesMessage(); message.setSummary(Messages.getMessage("error empty value")); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } if(!Strings.isNullOrEmpty(number)) { if(!isNumber(number)) { FacesMessage message = new FacesMessage(); message.setSummary(Messages.getMessage("error not numerical value")); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } } } }
为了更好地理解 JSF (2.x) 中的 clientID 生成,有人可以向我解释一下 JSF 何时生成客户端 ID(哪个生命周期阶段、构建时间或渲染时间...)? ...
当我提交表单时,它应该调用另一个表单,以便我可以渲染它。我使用 primefaces,我希望它能像下面这样工作。但它抛出一个错误。 html ...
所以我有一个 JSF 应用程序。如果我提交表单,当我刷新页面时它会重新提交。我当然不希望这样。 索引.xhtml: [...] 所以我有一个 JSF 应用程序。如果我提交表单,当我刷新页面时它会重新提交。当然我不想要这样。 索引.xhtml: [...] <h:form > <h:outputText value="Form"/><br/> <h:inputText label="first" value="#{example.newExample.firstWord}" autocomplete="off"></h:inputText> <h:commandButton value="click" actionListener="#{example.NewExample()}"> </h:commandButton> </h:form> [...] 运行的方法: public void NewExample(){ pfDB.InsertNewExample(NewExample); NewExample.setFirstWord(null); NewExample.setSecondWord(null); } 所以每次我提交表单后刷新index.xhtml,NewExample()就会运行。 问题确实出在重新提交表格上。但浏览器(opera)没有显示警报。 我通过添加修复了它 FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml"); 在我的职能中 尝试通过ajax提交: <h:commandButton value="click" actionListener="#{example.NewExample()}"> <f:ajax /> </h:commandButton> 您可能需要渲染一些组件。
我从这个 Primefaces http://blog.primefaces.org/?p=1512 博客中复制了有关简单密码验证的确切代码 我从这个 Primefaces http://blog.primefaces.org/?p=1512 关于简单密码验证的博客中复制了确切的代码 <h:outputLabel for="pwd1" value="Password 1: *" /> <p:password id="pwd1" value="#{registerMB.password}" feedback="false" match="pwd2" label="Password 1" required="true" /> <h:outputLabel for="pwd2" value="Password 2: *" /> <p:password id="pwd2" value="#{registerMB.password}" feedback="false" label="Password 2" required="true" /> <f:facet name="footer"> <p:commandButton value="Register" action="/pages/public/login" /> <p:commandButton value="Cancel" immediate="true" action="/pages/public/login" /> </f:facet> 验证有效,但我只能得到验证错误。永远不会显示密码 1 应与密码 2 匹配的消息。还有这个配置吗? 我下载了 Primefaces 3.4.1 尝试添加以下内容 p:password 标签内的 validatorMessage 属性 id="pwd2": <p:password id="pwd2" value="#{registerMB.password}" feedback="false" label="Password 2" required="true" validatorMessage="password 1 should match password 2"/> 添加 p:message 标签以在 h:form 标签下方显示错误 <p:messages id="messages" showDetail="true" autoUpdate="true"/> 添加<p:messages id="messages" showDetail="true" autoUpdate="true"/> 就像 int Primefaecs 密码展示 <h:form id="form"> <p:panel header="Match Mode"> <p:messages id="messages" showDetail="true" autoUpdate="true"/> <h:panelGrid columns="2" id="matchGrid"> <h:outputLabel for="pwd1" value="Password 1: *" /> <p:password id="pwd1" value="#{passwordBean.password5}" match="pwd2" label="Password 1" required="true"/> <h:outputLabel for="pwd2" value="Password 2: *" /> <p:password id="pwd2" value="#{passwordBean.password5}" label="Password 2" required="true"/> </h:panelGrid> <p:commandButton id="saveButton" update="matchGrid" value="Save" /> </p:panel> </h:form> 您可以使用命名空间 jsf/core 中的元素命名属性 xmlns:f="http://xmlns.jcp.org/jsf/core" <div class="mb-3"> <h:outputLabel for="passwordInput" value="Password" styleClass="label"/> <h:inputSecret id="passwordInput" value="#{auth.userRegistration.password}" required="true" requiredMessage="Password is required" styleClass="form-control" maxlength="30"> <f:validator validatorId="passwordValidator" /> <f:attribute name="password2" value="#{password2}"/> </h:inputSecret> <h:message for="passwordInput" styleClass="error"/> </div> <div class="mb-3"> <h:outputLabel for="passwordInput2" value="Confirm Password" styleClass="label"/> <h:inputSecret id="passwordInput2" binding="#{password2}" required="true" maxlength="30" requiredMessage="Password are not matched" styleClass="form-control"/> <h:message for="passwordInput2" styleClass="error"/> </div>
我有一个命令按钮和一个对话框。问题是对话框出现后就消失了(1-2 毫秒后)。我的命令按钮或其对话框有问题吗? 我有一个命令按钮和一个对话框。问题是对话框出现后就消失了(1-2 毫秒后)。我的命令按钮或其对话框有问题吗? <p:commandButton id="showDetailsButton" title="Details" onclick="details.show();" process="@this" update=":tabView:myForm:myDialogId" icon="ui-icon-search"> </p:commandButton> <p:dialog id="myDialogId" header="Details" widgetVar="details" resizable="false" height="600" width="450" > //some stuff </p:dialog> 将 onclick 更改为 oncomplete,现在工作正常。 <p:commandButton id="showDetailsButton" title="Details" oncomplete="details.show();" process="@this" update=":tabView:myForm:myDialogId" icon="ui-icon-search"> 默认情况下,<p:commandButton>呈现为 <button type="submit" ....> ... </button> 编辑:如果您已通过指定ajax禁用了ajax=false行为,请阅读下面的评论。 因此它将触发回发。因此,您的页面向服务器发出 POST 请求并刷新。 顺便说一句,这里不需要 PrimeFaces 命令按钮,只需使用 <input type="button" onclick="details.show()" value="Details"/> 从命令按钮中删除进程和更新。他们刷新页面/部分。而你不希望这样。 如果您在表单标记内创建了另一个表单,则应确保它在外部,因为不知情的更新操作可能会中断该过程。
我在 JSF 中有一个搜索表单,它是使用 RichFaces 4 自动完成组件以及以下 JSF 2 页面和 Java bean 实现的。我使用 Tomcat 6 和 7 来运行该应用程序。 ... 我在 JSF 中有一个搜索表单,它是使用 RichFaces 4 自动完成组件以及以下 JSF 2 页面和 Java bean 实现的。我使用 Tomcat 6 和 7 来运行该应用程序。 ... <h:commandButton value="#{msg.search}" styleClass="search-btn" action="#{autoCompletBean.doSearch}" /> ... 在 AutoCompleteBean 中 public String doSearch() { //some logic here return "/path/to/page/with/multiple_results?query=" + searchQuery + "&faces-redirect=true"; } 只要“searchQuery”字符串中的所有内容都在 Latin-1 中,此方法就可以正常工作,如果在 Latin-1 之外,则此方法不起作用。 例如,搜索“bodø”将自动编码为“bod%F8”。然而,搜索“Kra Ðong”将不起作用,因为它无法编码“Д。 我现在尝试了几种不同的方法来解决这个问题,但都不起作用。 我尝试使用 URLEncode 对我自己的 searchQuery 进行编码,但这只会导致双重编码,因为 % 被编码为 %25。 我尝试使用 java.net.URI 来获取编码,但给出与 URLEncode 相同的结果。 我尝试在连接器中使用 URIEncoding="UTF-8" 在 Tomcat 中打开 UTF-8,但这只会使问题变得更糟,因为非 ASCII 字符根本不起作用。 所以我的问题是: 我可以更改 JSF 2 编码 GET 参数的方式吗? 如果我无法更改 JSF 2 编码 GET 参数的方式,我可以关闭编码并手动执行吗? 我在这里做了什么奇怪的事吗?这似乎应该是开箱即用的支持,但我找不到任何其他人有同样的问题。 我认为您遇到了 JSF 中的一个极端情况错误。查询字符串由 ExternalContext#encodeRedirectURL() 进行 URL 编码,它使用由 ExternalContext#getResponseCharacterEncoding() 获得的响应字符编码。然而,虽然 JSF 默认使用 UTF-8 作为响应字符编码,但这仅在实际渲染视图时设置,而不是在重定向响应时设置,因此响应字符编码仍然返回平台默认值 ISO-8859-1 这会导致您的字符使用这种错误的编码进行 URL 编码。 我已将其报告为问题 2440。同时,您最好的选择是事先自己明确设置响应字符编码。 FacesContext.getCurrentInstance().getExternalContext().setResponseCharacterEncoding("UTF-8"); 注意,这仍然要求容器本身使用相同的字符编码来解码请求URL,所以你当然需要在Tomcat的配置中设置URIEncoding="UTF-8"。这不会再弄乱字符,因为它们现在将是真正的 UTF-8。 HTTP URL 和标头接受的唯一字符编码是 US-ASCII,您需要对这些字符进行 URL 编码才能将它们发送回应用程序。在 Java 中执行此操作的最简单方法是: public String doSearch() { //some logic here String encodedSearchQuery = java.net.URLEncoder.encode( searchQuery, "UTF-8" ); return "/path/to/page/with/multiple_results?query=" + encodedSearchQuery + "&faces-redirect=true"; } 然后它应该适用于您使用的任何角色。
我正在使用 primefaces 开发一个网络应用程序。我试图在网页上显示条形码。除了二维码之外,所有编码器都会显示。我已经读到此需要两个 jar 文件 条形码4j:...
错误解析/page.xhtml:错误跟踪[行:42]实体“nbsp”被引用,但未声明
我想在 JSF 页面中使用不间断空格。我知道,在纯 HTML 中,我可以使用 来实现此目的,并且效果很好。但是,当我将这些放入 Facelets 页面时,就会出错...
我一直在这里搜索,但还没有找到答案。 在我的应用程序中,我的控制器有一个抽象主类,其中包含一些方法和属性。我想注入 DAO
通过idlemonitor(primefaces)超时不起作用
我想使用primefaces的空闲监视器来监控会话超时。 正确地它可以工作。但是重定向到我的登录页面(login.xhtml 不起作用。 我在
我无法将自定义字体导入我的 JSF 页面。项目结构如下所示: 我尝试在 styles.css 中编写以下内容: @font-face { 字体系列:“Gotham Pro Bold”; ...
我有一个 id 为 X 的 ,我想从其内容 X_content 中删除填充,为面板内容生成的 HTML 是: 我有一个 <p:panel>,id 为 X,我想从其内容中删除填充 X_content 为面板内容生成的 HTML 是: <div id="X_content" class="ui-panel-content ui-widget-content"> 并且该元素出现在 chrome 开发者工具中以具有填充: padding:0.5em 1em; 我制作了一个嵌入式样式表来覆盖 primefaces 中的样式表,如下所示: <h:head> <style> .ui-panel-content, .ui-widget-content{ padding:0px; } </style> </h:head> 但是我没有工作,填充仍然存在,有人可以帮助我吗? 您的 CSS 选择器 .ui-panel-content, .ui-widget-content { ... } 基本上意味着:“选择具有 ui-panel-content 或 ui-widget-content 类的所有元素”。 但是,填充是通过此 CSS 选择器在 PrimeFaces 默认 CSS 中定义的 .ui-panel .ui-panel-content { ... } 基本上意味着 “选择具有 ui-panel-content 类的所有元素,该类是具有 ui-panel 类的元素的子元素”,这是根据 CSS 级联规则 更强的选择器。因此,它的优先级高于 CSS 选择器。这与样式类的声明顺序无关(仅当选择器具有相同强度时声明顺序才重要)。 当覆盖 PrimeFaces 默认 CSS 时,您应该提供一个“至少”相同强度或更强的选择器。在您的特定情况下,如果您打算全局应用样式,只需使用相同的选择器: .ui-panel .ui-panel-content { padding: 0; } 请注意,当在 <style> 中使用 <h:head> 时,它仍然会被 PrimeFaces 默认 CSS 覆盖,因为它会自动包含在头部末尾。而是将 <style> 移至 <h:body>,或者更好的是,将其放入自己的 CSS 文件中,通过 <h:houtputStylesheet> 将其包含在 <h:body> 内。 另请参阅: 如何使用自定义样式覆盖默认的 PrimeFaces CSS? CSS 选择器语法 我无法真正理解这里的答案,它对我不起作用。 但这有效。 :host { &::ng-deep { .p-panel-content { padding: 0; } } }
我正在尝试在 Primeface 数据表上实现多重排序。我们使用的是 Primefaces v3.5。我在 LazyLoadClass 中创建了一个新的加载方法,该方法采用 List of SortMeta> 参数。 但我是...
@PreDestroy 从未调用过@ViewScoped [重复]
我有一个 @ViewScoped bean,它有一个带有 @PreDestroy 注释的方法,该方法应确保关闭一些远程连接。但是,当用户离开时,不会调用该方法。 ...
找不到工厂:javax.faces.context.FacesContextFactory
我注意到,当尝试设置在jetty上运行的JSF 2 web应用程序时,出现以下错误: java.lang.IllegalStateException:应用程序不正确 启动时初始化,找不到Fa...
p:messages 和 p:message 可以同时使用吗?
我在 primefaces 文档中找不到这样的示例。 我有一个很长的表格。对于我所拥有的表格中的每个组件 但是...