无法在doPost方法中获取请求属性

时间:2018-01-23 10:30:10

标签: java servlets undertow

我正在尝试通过简单的java servlet更新我的数据库实体。在我的UpdateFooServlet的doGet方法中,我使用的查询参数是我的Foo的id,我从我的数据库中通过id获取该Foo对象,并在我的请求中将其设置为'foo'属性。稍后,在我的doPost方法中,我试图获取我的请求属性foo(为了写出差异,但它是应用程序的另一部分,不需要在这里)并且一旦我尝试这样做,我得到NullPointerExeption。我试图将它设置为会话属性,就像我使用的那样,y用户也没有用。我在哪里弄错了?

-modules
---/login
-----/controllers
---------/Login.php
-----/models
---------/Login_model.php
-----/views
---------/login.php

我使用System.out来检查是否从db或request属性中提取了相同的Foo。

日志:

@WebServlet("/UpdateFooServlet")
public class UpdateFooServlet extends HttpServlet {

    FooDAO fooDao = new FooDAO();

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        Foo foo = fooDao.getFooById(id);
        System.out.println(foo.toString());
        request.setAttribute("foo", foo);
        RequestDispatcher dispatcher = request.getRequestDispatcher("updatefoo.jsp");
        dispatcher.include(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Foo notUpdatedFoo = (Foo) request.getAttribute("foo");
        System.out.println(notUpdatedFoo.toString());

3 个答案:

答案 0 :(得分:0)

请求对象的生命周期正好在处理请求时。因此,您在doGet()中的请求中存储的内容将不适用于doPost()方法。

使用会话属性而不是请求属性。那是在doGet()中:

request.getSession().setAttribute("foo", foo);

在doPost()中执行:

Foo notUpdatedFoo = (Foo) request.getSession().getAttribute("foo");
顺便说一句,这会有效,但它不是线程安全的。

答案 1 :(得分:0)

我100%确定我明白你的意思,但是:

如果首先由GET请求(请求1)调用该servlet,那么您将转到JSP。 从那个JSP你再次调用servlet?如果是这样是一个新请求(请求2) ,您的属性不会出现在新请求中。

为此,您必须调整JSP以查看该属性是否存在并将其传递给新请求。

或者您必须使用sesion变量。

我希望这是您的方案,并且您不会尝试访问doGet()&在同一请求之后的doPost()。

答案 2 :(得分:-1)

我认为您应该将method属性添加到<form>标记:

<form ..... method="POST">

然后提交表单将调用servlet的doPost()方法。