jsf-2 相关问题

JavaServer Faces(JSF)是一个模型 - 视图 - 展示器框架,通常用于创建Web应用程序。与JSF 1.x相比,版本2.x是领先一步,显着扩展了标准的组件和组件库集。

包含包含来自流的 JSF 标签/组件的动态内容

我正在开发一个应用程序,我想在其中包含来自流的动态 XHTML 内容。为了处理这个问题,我编写了一个标记处理程序扩展,它将动态 XHTML 内容转储到输出组合...

回答 2 投票 0

为什么 <ui:fragment rendered> 没有对 <h:outputStylesheet> 和 <h:outputScript>

我有一个 JSF 2 主模板,如下所示: 我有一个 JSF 2 主模板,如下: <!DOCTYPE html> <html lang="#{localeManager.language}" 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"> <f:view locale="#{localeManager.locale}"> <h:head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title><ui:insert name="title">Default Title.</ui:insert></title> <!-- Development Stylesheets --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Development'}"> <h:outputStylesheet name="css/bootstrap.css" library="bootstrap" /> <h:outputStylesheet name="css/font-awesome.css" library="fontawesome" /> </ui:fragment> <h:outputStylesheet name="css/main.css" library="core" /> <ui:insert name="header-stylesheet" /> <!-- Production Stylesheets --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Production'}"> <h:outputStylesheet name="css/bootstrap.min.css" library="bootstrap" /> <h:outputStylesheet name="css/font-awesome.min.css" library="fontawesome" /> </ui:fragment> <ui:insert name="header-script" /> </h:head> <h:body> <div id="wrapper"> <div id="header"> <ui:insert name="header">Default content</ui:insert> </div> <div id="body"> <ui:insert name="body">Default body</ui:insert> </div> <div id="footer"> <ui:insert name="footer">Default footer</ui:insert> </div> </div> <!-- Development Scripts --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Development'}"> <h:outputScript name="jquery-2.1.4.js" library="jquery" /> <h:outputScript name="js/bootstrap.js" library="bootstrap" /> </ui:fragment> <!-- Production Scripts --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Production'}"> <h:outputScript name="jquery-2.1.4.min.js" library="jquery" /> <h:outputScript name="js/bootstrap.min.js" library="bootstrap" /> </ui:fragment> <ui:insert name="body-script" /> </h:body> </f:view> </html> 在 Wildfly 9.0.1 Final 中部署它时,我看到我的所有 <ui:fragment> 属性都被渲染了。这是为什么?我正在使用 JSF 2.2 框架进行开发。 My Faces 项目阶段是 Development。 注意: 在SO中关于这个问题的所有答案中,没有一个是这个问题的解决方案(所以我做了我的作业)。 <h:outputStylesheet>和<h:outputScript>是特殊组件。他们将在视图构建期间通过 UIViewRoot#addComponentResource() 将声明的样式表或脚本资源添加到视图中(请参阅此处的 Mojarra 源代码)。 这与组件或其父组件的 rendered 条件无关。实际上,它们基本上被重新定位到 <h:head> 或 <h:body> 的最末端,具体取决于 target 属性的值,导致它们不再位于 <ui:fragment> 内部。 然后,在渲染过程中,仅考虑它们自己的 rendered 属性(实际上也考虑 <h:head> 的属性,但这毫无意义)。 您有 2 个选择: 使用视图构建时间标签有条件地将它们添加到视图中。项目阶段条件无论如何都是应用范围内的。 <!-- Development Stylesheets --> <c:if test="#{facesContext.application.projectStage eq 'Development'}"> <h:outputStylesheet ... /> <h:outputStylesheet ... /> </c:if> <!-- Production Stylesheets --> <c:if test="#{facesContext.application.projectStage eq 'Production'}"> <h:outputStylesheet ... /> <h:outputStylesheet ... /> </c:if> 检查组件资源自身的rendered属性中的条件。如有必要,请使用 <c:set> 创建一个短 EL 变量。 <c:set var="dev" value="#{facesContext.application.projectStage eq 'Development'}" scope="application" /> <!-- Development Stylesheets --> <h:outputStylesheet ... rendered="#{dev}" /> <h:outputStylesheet ... rendered="#{dev}" /> <!-- Production Stylesheets --> <h:outputStylesheet ... rendered="#{not dev}" /> <h:outputStylesheet ... rendered="#{not dev}" /> 另请参阅: JSF2 Facelets 中的 JSTL...有意义吗?

回答 1 投票 0

托管bean中View和Request范围之间的区别

视图范围是什么意思?谁能解释一下,以便我可以理解它与请求范围有何不同?

回答 1 投票 0

重新排序 p: p:dataTable 包含输入的行

有一列中有 p:dataTable 和 p:inputText: 一栏中有 p:dataTable 和 p:inputText: <h:form id="form"> <p:dataTable id="dataTable" value="#{rowReorder.dataList}" var="row" draggableRows="true" rowKey="#{row.id}"> <p:ajax event="rowReorder" listener="#{rowReorder.reorder}" update="dataTable"/> <p:column> <f:facet name="header"> <p:commandButton value="Add" actionListener="#{rowReorder.addData}" update="dataTable" process="dataTable"/> </f:facet> <p:outputLabel value="#{row.id}"/> </p:column> <p:column> <p:inputText value="#{row.name}"/> </p:column> </p:dataTable> </h:form> 支撑豆: import org.omnifaces.cdi.ViewScoped; import org.primefaces.event.ReorderEvent; import javax.inject.Named; import java.io.Serializable; import java.util.LinkedList; import java.util.List; @Named("rowReorder") @ViewScoped public class RowReorder implements Serializable { private List<Data> dataList = new LinkedList<>(); public void addData() { Data data = new Data(); data.setId(dataList.size() + 1); data.setName("Data " + data.getId()); dataList.add(data); } public void reorder(ReorderEvent event) { } /** * Getters, Setters */ public List<Data> getDataList() { return dataList; } } 数据类: public class Data implements Serializable { private Integer id; private String name; /** * Getters, Setters */ } 重新排序前的示例数据表: -------------- |id | name | -------------- | 1 | Data 1 | | 2 | Data 2 | | 3 | Data 3 | | 4 | Data 4 | -------------- 重新排序后(将第一行移动到第三行): -------------- |id | name | -------------- | 2 | Data 1 | | 3 | Data 2 | | 1 | Data 3 | | 4 | Data 4 | -------------- 我知道发生这种情况是因为在 p:inputText 阶段设置来自 UPDATE_MODEL 的数据。我尝试通过在 process="@none" 组件中指定 p:ajax 来阻止处理输入字段,但它不起作用。您知道如何与 draggableRows 和 p:inputText 交朋友吗? 第一个解决方案 我找到了解决办法! 它不处理具有属性的输入(实际上根本不提交)process="@none" partialSubmit="true" 完整的 p:ajax 组件看起来像 <p:ajax event="rowReorder" listener="#{rowReorder.reorder}" update="dataTable" process="@none" partialSubmit="true"/> 第二种方案(如果需要提交数据) 理论: 让我们看看拖动行时发生了什么? 我们有ajax请求强制process="form:dataTable"。在 APPLY_REQUEST_VALUES 阶段,DataTableRenderer 尝试调用 DraggableRowsFeature 的解码,进而旋转列表元素(指定为 dataTable 的 value 属性的列表)。因此,在 UPDATE_MODEL_VALUES 阶段,我们有一个旋转列表和输入组件,它们想要将它们的值提交到 name 对象的 Data 字段。但请求参数在输入 id 中仍然包含旧的行索引:它们是 form:dataTable:1:name = Data 2、form:dataTable:2:name = Data 3、form:dataTable:0:name = Data 1(我添加了 3 行,并将第一行移至最后一行)。所以在这里我们得到了我们得到的。这样,如果我们需要在正确的位置提交数据,我们必须在 UPDATE_MODEL_VALUES 完成之前防止列表旋转, 并稍后在 INVOKE_APPLICATION 阶段执行此轮换,并在该 ajax 请求上呈现 dataTable: 在 DraggableRowsFeature.decode() 中我们可以看到 Collections.rotate() 仅当 value 是 List 的实例时才会被调用。 if (value instanceof List) { List list = (List) value; if(toIndex >= fromIndex) { Collections.rotate(list.subList(fromIndex, toIndex + 1), -1); } else { Collections.rotate(list.subList(toIndex, fromIndex + 1), 1); } } else { LOGGER.info("Row reordering is only available for list backed datatables, use rowReorder ajax behavior with listener for manual handling of model update."); } 还有DraggableRowsFeature.shouldDecode()方法。 public boolean shouldDecode(FacesContext context, DataTable table) { return context.getExternalContext().getRequestParameterMap().containsKey(table.getClientId(context) + "_rowreorder"); } 所以这里我们有两种可能性来防止数据源旋转: 不要使用 List 作为数据表值 创建自己的 org.primefaces.component.datatable.feature.DraggableRowsFeature 在 shouldDecode() 方法中返回 false。 练习: 我像这样修改了bean文件: @Named("rowReorder") @ViewScoped public class RowReorder implements Serializable { private static final Logger log = LoggerFactory.getLogger(RowReorder.class); private Set<Data> dataList = new LinkedHashSet<>(); public void addData() { Data data = new Data(); data.setId(dataList.size() + 1); data.setName("Data " + data.getId()); dataList.add(data); log.warn("{} {}", Integer.toHexString(data.hashCode()), data.getId()); } public void removeData(Data data) { dataList.remove(data); } public void reorder(ReorderEvent event) { List<Data> list = new LinkedList<>(dataList); int fromIndex = event.getFromIndex(); int toIndex = event.getToIndex(); if(toIndex >= fromIndex) { Collections.rotate(list.subList(fromIndex, toIndex + 1), -1); } else { Collections.rotate(list.subList(toIndex, fromIndex + 1), 1); } dataList.clear(); dataList.addAll(list); } /** * Getters, Setters */ public Set<Data> getDataList() { return dataList; } } 现在它首先将值提交到模型并在 INVOKE_APPLICATION 阶段旋转列表。 秘密是你的数据表的属性rowStatePreserved,添加它: rowStatePreserved =“true” <p:dataTable id="dataTable" value="#{rowReorder.dataList}" var="row" draggableRows="true" rowKey="#{row.id}" rowStatePreserved="true"> 并将此代码保留为: <p:ajax event="rowReorder" listener="#{rowReorder.reorder}" update="dataTable" process="@this"/> 在我的例子中,我在数据表列中使用了一个组合框,并且在添加此属性后,当我使用draggableRows函数时,该值不会将超过一行更改为另一行。 我等着帮你。 其他简单的解决方案是在 rowReorder 开始时禁用输入: <p:ajax event="rowReorder" onstart="$(':input', PrimeFaces.escapeClientId('#{component.clientId}')).prop('disabled',true)" update="@this"/> 注意#{component.clientId}将返回数据表的客户端ID。 为了避免丢失数据,您可以 Ajaxify 输入: <p:column headerText="#{msg.value}"> <p:inputText value="#{item.value}"> <p:ajax/> </p:inputText> </p:column> 我在使用 Primefaces 12 时遇到了同样的问题。 可悲的是,上面的解决方案对我不起作用,所以我必须寻找另一个选择: Primefaces 12 在 p:datatable 元素上提供了属性draggableRowsFunction。 如果设置,antonu17 在他的第二个解决方案中描述的默认行为将被禁用。 (参见 org.primefaces.component.datatable.feature.DraggableRowsFeature.decode(...)) 这意味着提交正常处理,包括 UPDATE_MODEL_VALUES-Phase 中的正确模型更新。之后,您可以使用 ajax 事件“rowReorder”和侦听器方法来获取带有 from/to 索引的 ReorderEvent-Object 并自行移动列表中的顺序。 这对我有用。 (Primefaces 7 与 antonu17 的第一个解决方案配合良好)

回答 4 投票 0

<meta http-equiv="X-UA-Compatible" content="IE=8" /> 在 RichFaces Web 应用程序中被忽略

我在 Glassfish 2.1 上使用 JSF 2.0 和 RichFaces 3.3.3。我创建了一个带有模式面板的 Web 应用程序,该应用程序在我的计算机(本地服务器)中运行良好。由于IE9不兼容该规范...

回答 1 投票 0

如何在浏览器上永久保存某些值?

我有一些登录信息;假设用户名、登录电子邮件和位置。 即使用户注销并关闭窗口后,我也希望将此信息保留在浏览器中。 当用户回来时

回答 2 投票 0

java.lang.IllegalStateException:调用 JasperReport 时已为此响应调用 getOutputStream()

我正在 JSF 2 中尝试 iReport/JasperReport 但是当我生成 PDF 时,我遇到了这个错误。 我搜索并找到了一些类似的问题和解决方案,但没有任何效果。抱歉发布了相同的内容

回答 4 投票 0

java.lang.ClassNotFoundException:org.apache.myfaces.webapp.StartupServletContextListener

我在启动 JSF Web 应用程序时遇到以下异常: 严重:配置 org.apache.myfaces.webapp.StartupServletContextListener 类的应用程序侦听器时出错 java.lang.

回答 3 投票 0

p:数据表选择为空

我正在尝试使用primefaces 4.0的可选数据表,但所选对象始终为空。 我已经厌倦了像这里和这里所说的那样添加 rowKey,但仍然为空...... 这是我的页面: 我正在尝试使用 primefaces 4.0 的可选数据表,但所选对象始终为空。 我已经厌倦了像here和here所说的那样添加rowKey,但仍然为空... 这是我的页面: <p:dataTable id="appDetailTable" var="appDetail" value="#{newAppraiseBean.appDetailDataModel}" paginator="true" rows="5" paginatorPosition="bottom" selection="#{newAppraiseBean.selectedAppDetail}" rowKey="#{appDetail.appraiseDetailID}" selectionMode="single"> <p:ajax event="rowSelect" listener="#{newAppraiseBean.modifyAppDetail()}" oncomplete="newAppDlg.show();" update=":newAppraiseForm:newAppDetail"/> </p:dataTable> 在我的支持豆中: newAppraiseBean.modifyAppDetail():(只需打印所选项目) public void modifyAppDetail(){ System.out.println("modify, selectedAppDetail:"+selectedAppDetail); } 数据模型: private class AppraiseDetailDataModel extends ListDataModel<Appraisedetail> implements SelectableDataModel<Appraisedetail> { public AppraiseDetailDataModel(List<Appraisedetail> list) { super(list); } @Override public Object getRowKey(Appraisedetail t) { return t.getAppraiseDetailID(); } @Override public Appraisedetail getRowData(String string) { List<Appraisedetail> appList=(List<Appraisedetail>) getWrappedData(); for(Appraisedetail app:appList){ System.out.println(app.getAppraiseDetailID()); if(app.getAppraiseDetailID()==Integer.parseInt(string)){ return app; } } return null; } } 它总是打印 null,我不知道我错过了什么。 更新 我简化了我的代码并将其放在google Drive上。 这是netbean项目的压缩包,解压后可以直接用netbean打开。 当然,在我简化代码后问题仍然存在。 我仔细检查代码后解决了问题。 我发现我没有指定appraiseDetailID,也就是rowKey。 我没有指定它,因为我希望数据库在数据插入数据库时生成id。 而 getRowKey 方法总是获取 null,因为数据还没有插入到 DB,当然 id 还没有生成。 随后,primefaces 在想要 getObject 且 rowKey 为“null”时什么也得不到。 所以,在我自己指定 id 后,一切正常! 对于遇到同样问题的人,记得指定rowKey,以便你可以使用可选择的数据表。 试试这个: if(app.getAppraiseDetailID().toString().equals(rowkey)) { ... 而不是你拥有的。 AppraiseDetailDataModel 还必须实现可序列化。同时删除“()”: listener="#{newAppraiseBean.modifyAppDetail()}" 最后,确保监听器的方法签名为: public void modifyAppDetail(SelectEvent event) 您可以在该方法中设置断点并检查 event.getObject(),它应该引用所选行。 尽管我已经正确识别了对象列表,但我正在处理同样的问题。就我而言,我忘记将 dataTable 包裹在 form 中。 <h:form> <p:dataTable> ... </p:dataTable> </h:form>

回答 3 投票 0

单击列表项时加载不同的 jsf 页面

我是 JSF 新手。我有一个无序列表和一个 div。 测试页 我是 JSF 新手。我有一个无序列表和一个 div。 <ul class="nav navbar-nav"> <li><a href="#TestPage">Test Page</a></li> <li><a href="#">Item1</a></li> <li><a href="#">Item2</a></li> <li><a href="#">item3</a></li> </ul> <div id="content"></div> 现在单击列表项,我想使用 JSF 加载不同的 xhtml 页面。是否有可能实现这个用例?我正在使用 JSF 2.0 和 primefaces。 只需将纯 HTML 链接替换为 JSF h:link。根据文档: 渲染 HTML“a”锚元素。组件的值呈现为锚文本,组件的结果用于确定“href”属性中呈现的目标 URL。 <li><h:link outcome="TestPage" value="Test Page" /></li> 其中 outcome 属性指定目标导航情况。 另请参阅: JSF 2 中的隐式导航 请注意,这对于使用 JSF 导航案例很有用。如果您只想对外部非 JSF url 执行 GET 请求,只需使用纯 HTML 方式即可。 在 click 元素的 <li> 事件上,您可以调用 $('#content').load(Url, successEventHandler)

回答 2 投票 0

在 PrimeFaces 中的 inputTextArea 上执行completeMethod 时会触发哪个事件?

我需要使用InputTextarea PrimeFaces组件,它允许在文本之间使用自动完成机制。一切都很好,除了 p:statusAjax,当我打字时,我的加载 var 动画会阻止 scr...

回答 1 投票 0

如何使用 primefaces 和 java 清除数据表中的数据

我正在尝试实现一个在 parent.xhtml 中调用的数据表,并且对该数据表进行了一些操作,如更新、删除和取消。 所以当我尝试...

回答 0 投票 0

宣布企业 JSF

我正在寻找有关我的企业 JSF 项目的一些反馈。 这个项目提供了一个 JSF 标签库,我们已经将它集成到我们的几个产品中,以及一个关于如何开发 cu ...

回答 0 投票 0

在 Web 应用程序中集成文件上传/下载窗口

我想要实现的目标:当用户访问我的 Web 应用程序的某个页面时,会打开一个文件管理器窗口。用户可以从该文件夹上传和下载文件,该文件夹实际上在网络上

回答 0 投票 0

p:datascroller只懒得加载一次。

我们从primefaces中实现了数据滚动器,并以lazy=true扩展它,这在第一次懒惰加载时工作正常。但是当我向下滚动时,前端没有任何事件被触发。后台的工作原理是...

回答 1 投票 0

如何在每个浏览器标签页上设置一个Backing Bean实例?

我的环境。Java 7JSF 2.1PrimeFaces 6.1. 我的目标:让我的应用程序的某个页面被实例化很多次,每个浏览器标签页都有一个,每个标签页都有不同的上下文。我的问题是:...

回答 1 投票 0

什么是Mojarra?

Mojarra与Sun的JSF参考实施方案有什么不同?它只是一个后来的版本吗?是简单的重名吗?

回答 3 投票 63

从服务器端创建SelectOneMenu UIComponent。

我已经创建了一个SelectOneMenu uicomponent SelectOneMenu value = new SelectOneMenu(); 我想在SelectOneMenu中插入一些选择项。我试过这样 String[] options = question.getOptions()...。

回答 1 投票 0

JSF没有将LinkedHashMap转换为正确的对象(javax.el.MethodNotFoundException)。

我有一个JSF应用程序,除了调用ManagedBean中以对象为参数的方法外,一切都很正常。

回答 1 投票 1

在头面中,p:datable的var属性为空。

我有这样的datatable。

回答 1 投票 1

© www.soinside.com 2019 - 2024. All rights reserved.