具有数据库设计的Servlet

use*_*340 5 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和数据库最直接的方式.但我不确定这是否是正确的做法.例如,如何在行业中实施.

Mau*_*res 5

人们并不真正使用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();
   }

}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这个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);
}

}
Run Code Online (Sandbox Code Playgroud)

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