- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 <p:graphicImage>
上显示以 BLOB 形式存储在 MySQL 中的图像如下。
<p:dataTable var="row" value="#{testManagedBean}" lazy="true" editable="true" rows="10">
<p:column headerText="id">
<h:outputText value="#{row.brandId}"/>
</p:column>
<p:column headerText="Image">
<p:cellEditor>
<f:facet name="output">
<p:graphicImage value="#{brandBean.image}" height="100" width="100">
<f:param name="id" value="#{row.brandId}"/>
</p:graphicImage>
</f:facet>
<f:facet name="input">
<p:graphicImage id="image" value="#{brandBean.image}" height="100" width="100">
<f:param name="id" value="#{row.brandId}"/>
</p:graphicImage>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit" width="50">
<p:rowEditor/>
</p:column>
</p:dataTable>
编辑一行时,<p:fileUpload>
显示在 <p:overlayPanel>
上.为了简单起见,本示例中省略了这一点和许多其他内容,因为它们与具体问题无关。
关联的 JSF 托管 bean:
@ManagedBean
@ViewScoped
public final class TestManagedBean extends LazyDataModel<Brand> implements Serializable
{
@EJB
private final TestBeanLocal service=null;
private static final long serialVersionUID = 1L;
@Override
public List<Brand> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
setRowCount(3);
return service.getList();
}
}
根据唯一行标识符从数据库中检索图像的 bean - BrandBean
.
@ManagedBean
@ApplicationScoped
public final class BrandBean
{
@EJB
private final BrandBeanLocal service=null;
public BrandBean() {}
public StreamedContent getImage() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
return new DefaultStreamedContent();
}
else {
String id = context.getExternalContext().getRequestParameterMap().get("id");
System.out.println("id = "+id);
byte[] bytes = service.findImageById(Long.parseLong(id));
return bytes==null? new DefaultStreamedContent(new ByteArrayInputStream(new byte[0])):new DefaultStreamedContent(new ByteArrayInputStream(bytes));
}
}
}
当通过单击数据表最后一列中位于(由 <p:rowEditor>
表示)的勾号更新(编辑后)行时,getImage()
BrandBean
中的方法应该被调用。
这在使用 PrimeFaces 5.0 和 JSF 2.2.6 的 GlassFish server 4.0 上运行的应用程序中正确发生。
在数据表(以及数据库)中更新一行后,数据表中将立即显示一个新图像。
还有另一个应用程序在使用 Spring 4.0.0 GA 的 Tomcat 服务器 8.0.5 上运行,其中 getImage()
更新数据表保存的行后未调用方法,导致数据表中仍显示旧图像(不是新更新的图像)(即使更改正确传播到数据库)。
仅当按 F5(在大多数浏览器上)刷新页面时,才会显示新更新的图像。它甚至不会在页面加载时显示(在地址栏中输入 URL,然后按 enter 键)。
换句话说,当数据表中的一行通过点击 <p:rowEditor>
指示的勾号更新时, getImage()
方法未被调用(因此,新图像未从数据库中获取以显示在 <p:graphicImage>
上)。仅当通过按 F5 快捷键刷新/重新加载页面时才会调用此方法。
为什么会这样?如何在更新一行后立即显示新更新的图像?
从表面上看,这应该既不与 Spring 也不与 JPA 相关(更新操作在单击勾号后正确传播到数据库)。这应该与 Tomcat 服务器有关。
最佳答案
The newly updated image is displayed only when the page refreshed by pressing F5 (on most browsers). It is even not displayed on page load (entering a URL into the address bar and then pressing the enter key).
图像正在被网络浏览器缓存。资源通过响应 header 中设置的与缓存相关的指令在每个 URL 的基础上进行缓存。您的具体问题是因为资源 URL 仍然相同并且网络浏览器不知道服务器端的资源已更改。 OmniFaces CacheControlFilter
showcase page详细解释了缓存(注意:过滤器不是解决这个问题的方法)。
您基本上需要通过更改 URL 强制浏览器重新请求资源。在这种情况下,可缓存资源突然更改并且其更改需要立即反射(reflect)到所有客户端,最常见的方法之一是将图像的“最后修改”时间戳附加到 URL 的查询字符串。鉴于您使用的是 JPA,所以应该这样做:
将 lastModified
列添加到 brand
表:
ALTER TABLE brand ADD COLUMN lastModified TIMESTAMP DEFAULT now();
使用适当的属性和 @PreUpdate
扩展 Brand
实体设置它:
@Column @Temporal(TemporalType.TIMESTAMP)
private Date lastModified;
@PreUpdate
public void onUpdate() {
lastModified = new Date();
}
// +getter+setter
(JPA 在每个 UPDATE
查询之前调用一个 @PreUpdate
注释方法)
将其附加到图像 URL(参数名称 v
是对“version”的提示):
<p:graphicImage value="#{brandBean.image}" ...>
<f:param name="id" value="#{row.brandId}" />
<f:param name="v" value="#{row.lastModified.time}" />
</p:graphicImage>
(为了清晰起见,我在这里将 row
重命名为 brand
并将 brandId
重命名为 id
以进行重复数据删除)
最后,如果您使用的是 PrimeFaces 5.0 或更新版本,那么您还需要禁用服务器端缓存:
<p:graphicImage value="#{brandBean.image}" cache="false" ...>
设计注意事项:如果图像不一定在 Brand
的每次更新时更新,则将其拆分到另一个表 Image
并让 Brand
对 Image
有 FK(@ManyToOne
或 @OneToOne
)。这也使得属性“图像”可在 web 应用程序的各种实体之间重复使用。
关于jsf - BLOB 图像仅在通过 p :dataTable is made in PrimeFaces 更新后刷新页面时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946803/
我们知道,当使用 hibernate 对数据库进行批量更新时(即使在 HQL 中),所做的更改不会复制到存储在当前 session 中的实体。 所以我可以调用 session.refresh 来加载对
我正在做一个项目,所有的东西都保存在事件中,所以服务器需要一些时间来响应新数据。我正在使用 Fluent 等待使用 ajax 的页面,但是这个不使用任何 ajax。所以我想刷新页面检查是否有新项目,如
我有一个从 Vector 创建的 JTable。 如何刷新 JTable 以显示添加到 Vector 的新数据? 最佳答案 当 TableModel 发生更改时,您的 JTable 应该会自动更新。我
有没有办法使用下面的代码来刷新已经存在的 div id,而不是刷新时间? window.onload = startInterval; function startInterval() {
我更新了在 Shiny Server 上运行的 Shiny 应用程序使用的 DataSet.RData。但是, Shiny 的应用程序仍在旧数据上运行。我已通过浏览器历史记录清除并重新启动浏览器几次,
我的应用程序中有一个无限滚动的网格面板(ExtJs 4.2.1),类似于 this example .用户可以单击刷新按钮,然后必须使用数据库中的数据更新网格的行。我在刷新按钮处理程序中调用 stor
我不知道这三种方法中哪一种最适合我。他们都为我工作。有谁知道刷新、更新和重画之间的区别吗? 最佳答案 根据在线文档: Refresh - 重新绘制屏幕上的控件。 Call Refresh method
有什么办法吗 ICollectionView.Refresh() 或者 CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); 在
这个问题已经有答案了: Updating address bar with new URL without hash or reloading the page [duplicate] (4 个回答)
我有一个 javascript 设置超时以在 10 秒后关闭 div,并且我想在 div 关闭时添加页面刷新。我正在使用的代码如下。 var container_close_sec = "1
我有一组具有以下名称的页面.... update1.php update2.php update3.php update4.php update5.php update6.php update7.ph
如果是则触发js函数。我可以使一个复选框保持选中状态,并在页面刷新时检查值并选中“checked”,并提交以下内容... checked="checked" /> 你都不记得触发js函数。 这是我的
我正在尝试刷新 php 脚本以在数据库更新时显示更新的内容。我首先构建了我的 php,然后刷新代码,然后合并它们。但是,脚本不会更新。有谁知道为什么吗? $(document).ready
当我要删除的节点扩展集合类型时,Grails中有一个错误阻止我使用removeFrom *。直接从关联中删除节点不会更新二级缓存。 A hasMany B 有什么方法可以使关联缓存手动无效或强制重新加
我正在使用 hibernate 和 mysql 来抽象一个数据库,以便在 java 驱动的网站中使用。我使用 hibernate 很好地解决了所有查询,但似乎无法弄清楚如何使用它进行更新、插入和删除,
如何通过调用 oncreateview 方法重新创建 fragment ?我有一个 fragment ,用于通过表单插入新数据,单击按钮后,我想通过删除在 EditText 中输入的数据来重新创建 f
当我从一个到另一个时,我试图刷新我的观点。我知道我应该将刷新代码放在 viewWillAppear 中,但我不知道该放什么代码。 你们能帮帮我吗? 谢谢! 最佳答案 在您看来,请调用 setNeeds
我正在开发 iPhone 应用程序并希望使用: CFStreamCreatePairWithSocketToHost(NULL, url, port, &serverReadStream, &serv
看到我已经创建了一个用于登录用户的脚本。而且我还添加了设置选项卡,以便用户可以编辑他们的设置!但是当我尝试它时,mysql 表中的数据发生了变化,但配置文件中显示的用户名和用户电子邮件保持不变!当我注
好的。这就是它的样子。 当我启动应用程序时,我从服务器收到的第一件事是数据: {name: "test", type: "checkbox" checked: true, } 这使得其中一个复选框
我是一名优秀的程序员,十分优秀!