【问题标题】:Servlet is not Updating DB with new dataServlet 未使用新数据更新数据库
【发布时间】:2013-07-10 19:47:54
【问题描述】:

我在使用 UPDATE servlet 时遇到了一些小问题。

我正在尝试更新我的数据库,但它只是没有发生。我是 Java EE 本章的新手。

**NB:我只是在使用 UpdateServlet 时遇到了问题,因为我不知道如何从 JSP 获取修改后的数据,以便将其发送到 DAO,然后更新数据库。其余的都可以

目的:当用户点击“更新”按钮时(截图如下)...

... JSP 将请求转发到“更新用户”页面(如下),他将能够修改附加到电子邮件的名字和姓氏(这是主键)(下面的屏幕截图)。 ..

我的问题是:我如何实现 UpdateUserServlet(参见下面的代码)代码从会话中获取用户对象并使用新的名字和姓氏更新数据库。

显示用户列表的 JSP

<body>

<h1>Users List</h1>

<table cellpadding="5" border=1>

  <tr valign="bottom">
    <th>First Name</th>
    <th>Last Name</th>
    <th>Email Address</th>
  </tr>

  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <c:forEach var="user" items="${users}">
  <tr valign="top">
    <td><p>${user.firstName}</td>
    <td><p>${user.lastName}</td>
    <td><p>${user.emailAddress}</td>
    <td><a href="displayUser?emailAddress=${user.emailAddress}">Update</a></td>
    <td><a href="deleteUser?emailAddress=${user.emailAddress}">Delete</a></td>
  </tr>
  </c:forEach>

</table>

</body>

点击“更新按钮”后,下面的这个 JSP 将接管。

....

<body>

<h1>Update User</h1>

<form action="updateUser" method="post">
<table cellspacing="5" border="0">
    <tr>
        <td align="right">First name:</td>
        <td><input type="text" name="firstName" 
                value="${user.firstName}">
        </td>
    </tr>
    <tr>
        <td align="right">Last name:</td>
        <td><input type="text" name="lastName" 
                value="${user.lastName}">
        </td>
    </tr>
    <tr>
        <td align="right">Email address:</td>

        <td>${user.emailAddress}</td>
    </tr>
    <tr>
        <td></td>
        <td><input type="button" value="Submit"></td>
    </tr>
</table>
</form>

</body> ....

更新 servlet。在这方面需要帮助。

package user;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import business.User;
import data.UserDB;

public class UpdateUserServlet extends HttpServlet
{

    protected void doPost(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException
    {
        String firstName = request.getParameter("firstName");
        String lastName = request.getParameter("lastName");
        String emailAddress = request.getParameter("emailAddress");

        User user = new User();



        HttpSession session = request.getSession();
        session.setAttribute("user", user);

        user.setFirstName(firstName);
        user.setLastName(lastName);
        user.setEmailAddress(emailAddress);

        UserDB.update(user);


        // TODO: add code that gets the User object from the session and updates the database

        String url = "/displayUsers";
        RequestDispatcher dispatcher =
              getServletContext().getRequestDispatcher(url);
        dispatcher.forward(request, response);
    }
}

DAO

package data;

import java.sql.*;
import java.util.ArrayList;

import business.User;

public class UserDB

{

    public static int update(User user) {
        ConnectionPool pool = ConnectionPool.getInstance();
        Connection connection = pool.getConnection();
        PreparedStatement ps = null;

        String query = "UPDATE User SET " + "FirstName = ?, " + "LastName = ? "
                + "WHERE EmailAddress = ?";
        try {
            ps = connection.prepareStatement(query);
            ps.setString(1, user.getFirstName());
            ps.setString(2, user.getLastName());
            ps.setString(3, user.getEmailAddress());

            return ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        } finally {
            DBUtil.closePreparedStatement(ps);
            pool.freeConnection(connection);
        }
    }

}

【问题讨论】:

  • 如果用户点击提交按钮会发生什么? servlet 命中了吗?点击提交后servlet中各个参数的取值是多少?
  • 当用户点击提交时,UpdateUserServlet 被调用并且数据库中的表行获取用户输入的新名字和名字。之后,UpdateUserServlet 将请求转发回主 Servlet (DisplayUserServlet),以便在用户更新后显示 usersList
  • 现在,当我在输入新名称和名字后单击提交时,转发到 UserList 工作正常,除了名称和名字没有在 DB 中更新。
  • 您是否发现任何异常? (您确定您的 serlvet 在请求参数中获得了新输入的名字和姓氏)。更新表格的逻辑看起来并不错误。
  • 没有例外。如果我确定 serlvet 在请求参数中获得了新输入的名字和姓氏?什么都没发生。似乎我的 servlet 没有从 JSP 中得到任何东西,这实际上是我问题的核心。为什么我的 servlet 没有得到新数据。我知道这是一个非常基本的东西,但我无法弄清楚

标签: java mysql jsp session servlets


【解决方案1】:

尝试将日志添加到update(User user) 方法。看看是否有控制权来到这个地方。

【讨论】:

    【解决方案2】:

    我在第二个 JSP 中找到了根本原因,请参阅下面的代码。

    <tr>
            <td align="right">Email address:</td>
    
            <td>${user.emailAddress}</td>
        </tr>    
    

    servlet 的 getParameter("emailAddress") 方法实际上得到了一个空值,因为上面的代码中没有参数名称..

    所以,应该是这样的:

    <tr>
            <td align="right">Email address:</td>
            <td><input type="text" name="emailaddress" 
                    value="${user.emailaddress}">
            </td>
        </tr>
    

    请注意 -input type="text"- 不是必需的,因为电子邮件地址不必像姓名和名字一样进行修改。所以我应该找到一种方法在输入文本框以外的其他地方显示电子邮件地址。但是现在可以了

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2020-04-03
      • 1970-01-01
      相关资源
      最近更新 更多