我是JavaEE的新手。我经历了一种我无法向自己解释的奇怪行为。
我有一个index.jsp,其中包含一个带有搜索词和提交按钮的表单。
在POST上我调用一个处理doPost方法的Servlet。在该方法中,我获取了一个JPA EntityManager,并通过id获取存储在数据库中的Item实体的实例。
然后将结果项存储为请求属性。 (如果我正确阅读了我的书,那只有在我目前所处的请求中才有效)
最后,我使用请求调度程序转发回index.jsp。
在index.jsp中有一个表达式,如果未设置请求属性,则输出项目的标题或空字符串。
当我的数据库中有一个项目具有我通过EM找到的确切ID时,一切正常。在index.jsp上,在POST请求之后,将显示项目的标题。
然后我删除了数据库项目。
但是,在后续请求中,将显示项目的标题(已删除),而不是显示空字符串。
这是一种我没想到也无法解释的行为。有没有任何缓存?如果我重新构建并重新部署我的应用程序,则会再次显示一个空字符串。
的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);
}
}
答案 0 :(得分:1)
在我的 persistence.xml 中我将以下内容添加到我的持久性单元中:
<shared-cache-mode>NONE</shared-cache-mode>
这会禁用缓存,它现在可以正常工作。