java - 带有数据库设计的 Servlet

标签 java servlets jdbc

我有一个关于使用 Servlet 和 JDBC 的一般性问题。

比如我有一个名为MyDatabaseManager的类,它提供了函数

public boolean updateUser(User user) {...}
public boolean deleteUser(User user) {...}
public boolean inserUser(User user){...}

,这些函数将访问和操作数据库。

我的问题是关于 Servlet 实现的。我现在正在使用三个 Servlet(UpdateUserServlet、InsertUserServlet 和 DeleteUserServlet),每个 Servlet 调用 MyDatabaseManager 实例(这里只有一个实例,使用 Singleton 模式)函数。 (例如,UpdateUserServlet 调用 MyDatabaseManager.updateUser ...)。

我认为这是使用 Servlet 和数据库的最直接的方式。但我不确定这是否是正确的做法。例如,这在工业界是如何实现的。

最佳答案

现在人们并没有真正直接使用 servlet,他们使用的框架可以简化您的工作,但是如果您真的想使用 servlet,您可以使用其他方法将所有操作集中在一个单一的方法中,doPut, doDelete 甚至创建您自己的方法。以下是您将如何操作的示例:

public abstract class BaseServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        String method = request.getParameter("_method");
        if ("form".equals(method)) {
            this.doForm(request, response);
        } else {
            if ("delete".equals(method)) {
                this.doDelete(request, response);
            } else {
        super.service(request, response);
            }
        }
   }

   protected void doForm(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        throw new UnsupportedOperationException();
   }

}

如您所见,此 Servlet 在表单上使用特殊字段 _method 来决定调用什么特殊方法,如果 _method 不可用,它将使用通常的服务方法,将调用 doGetdoPost

下面是这个 servlet 的实现方式:

public class UsersServlet extends BaseServlet {

private UsersRepository cadastro = new UsersRepository();

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    req.setAttribute("usuarios", cadastro.list());
    req.getRequestDispatcher("/usuarios/listar.jsp").forward(req, resp);

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    User usuario = this.getUser(req);

    usuario.setNome(req.getParameter("nome"));
    usuario.setEmail(req.getParameter("email"));
    usuario.setSenha(req.getParameter("senha"));

    this.cadastro.persist(usuario);

    resp.sendRedirect(req.getContextPath() + "/usuarios");

}

protected User getUser(HttpServletRequest req) {
    User usuario;

    if (req.getParameter("id") == null) {
        usuario = new Usuario();
    } else {
        Long id = new Long(req.getParameter("id"));
        usuario = this.cadastro.search(id);
    }

    return usuario;
}

@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    User usuario = this.getUser(req);
    this.cadastro.remover(usuario);
    resp.sendRedirect(req.getContextPath() + "/usuarios");
}

@Override
protected void doForm(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    User usuario = this.getUser(request);

    request.setAttribute("usuario", usuario);
    request.getRequestDispatcher("/usuarios/form.jsp").forward(request,
            response);
}

}

这样您就可以在一个 servlet 中完成所有操作。

关于java - 带有数据库设计的 Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040292/

相关文章:

java - Spring 安全 SAML OpenAM

java - Android:从两个字符串计算事件的持续时间

java - 为什么要添加不平衡的二叉搜索树 O(n)?

java - 是否可以创建一个具有自动应用于客户端项目中的类的方面的 JAR?

java - JDBC - SQL 语句执行时间记录

java - GWT 按钮中的图像

java - Servlet 发送重定向到欢迎页面?

java - 从 servlet 返回文件和 JSON

java - 使用 JDBC 插入 Microsoft SQL

java - 无法使用 Java 即时使用 setNull 将空值插入到 MySql 数据库中?