gpt4 book ai didi

JavaEE WebProject 请求属性或 JPA 实体似乎已缓存

转载 作者:行者123 更新时间:2023-11-30 07:52:53 24 4
gpt4 key购买 nike

我对 JavaEE 很陌生。我经历了一种我无法向自己解释的奇怪行为。

说明:

我有一个index.jsp,其中包含一个带有搜索词和提交按钮的表单。

在 POST 上,我调用一个处理 doPost 方法的 Servlet。在该方法中,我获取了一个 JPA EntityManager 并通过 id 获取了存储在数据库中的 Item 实体的实例。

然后将结果项存储为请求属性。 (如果我正确阅读我的书,它仅在我当前提出的请求中有效)

最后,我使用请求调度程序转发回index.jsp。

在index.jsp 中有一个表达式,如果未设置请求属性,则输出项目的标题或空字符串。

效果:

当我的数据库中有一个项目具有通过 EM 找到的确切 ID 时,一切正常。在index.jsp 上,在POST 请求之后,将显示项目的标题。

然后我删除了数据库项目。

但是,在后续请求中,将显示项目的标题(已删除),而不是显示空字符串。

这是我没有预料到且无法解释的行为。是否有任何类型的缓存?如果我重建并重新部署我的应用程序,则会再次显示空字符串。

所以我的问题:

  • 如果我存储请求属性,它是否会缓存到下一个请求? (好吧,如果我理解请求范围,就不应该)
  • JPA框架中有缓存吗?或者实体本身是否被缓存/重用?

源代码:

index.jsp

<%@page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lagerverwaltung</title>
</head>
<body>
<h1>Lagerverwaltung</h1>
<p>
<strong>Suche:</strong>
</p>
<p>
<c:out value="${title}" default="" />
</p>
<form method="POST" action="search" name="search_form">
<table>
<tr>
<td>nach Titel:</td><td><input type="text" name="search_title" placeholder="Titel ..." value="" /></td>
</tr>
<tr>
<td>nach Artikelnummer:</td><td><input type="text" name="search_article_nr" placeholder="Artikelnummer ..." /></td>
</tr>
<tr>
<td>nach Beschreibung</td><td><input type="text" name="search_description" placeholder="Beschreibung ..." /></td>
</tr>
<tr>
<td><input type="submit" name="search_submit" value="Suchen" /></td><td></td>
</tr>
</table>
</form>
</body>

SearchServlet.java

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
try {
EntityManager em = emf.createEntityManager();

ut.begin();
Item it = em.find(Item.class, 1);
ut.commit();

request.setAttribute("title", it.getTitle());
rd.forward(request, response);
} catch (Exception ex) {
Logger.getLogger(SearchServlet.class.getName()).log(Level.SEVERE, null, ex);
rd.forward(request, response);
}
}

最佳答案

在我的persistence.xml中,我将以下内容添加到我的持久性单元中:

<shared-cache-mode>NONE</shared-cache-mode>

这会禁用缓存,并且现在它的工作方式与预期相同。

关于JavaEE WebProject 请求属性或 JPA 实体似乎已缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33119337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com