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

时间:2015-10-14 07:36:34

标签: java java-ee

我是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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

这会禁用缓存,它现在可以正常工作。