我正在尝试通过简单的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());
答案 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()
方法。