【问题标题】:Should I create a Model & DAO for this in my Java web application?我应该在我的 Java Web 应用程序中为此创建一个模型和 DAO 吗?
【发布时间】:2011-04-10 07:48:38
【问题描述】:

我有以下操作 servlet,想知道是否应该像我为程序所做的那样创建一个名为 supervisor 的模型和相应的 supervisorDAO? programDAO 将多个程序模型 bean 放入返回的数组列表中。对于主管,我使用通用输入/输出数据库实用程序来获取任何传入的 SQL 字符串的哈希图 (retALM) 的数组列表。主管列表用于在 html 表单上创建下拉选择。

我关心的是将 sql 字符串存储在操作 servlet 中。如果我有一个 User 模型和 UserDAO 类,我不确定是否有必要创建一个主管模型和 DAO。实际上,在键入此帖子后,我进一步相信这不是正确的方法。因此,要么按照我在下面的方式保留它,要么添加supervisor SQL 调用以获取 UserDAO 类中的主管列表,因为用户可以成为主管。我也欢迎对下面我的 action servlet 方法提出其他批评。

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
    IOException {
    ProgramDAO prgDAO = new ProgramDAO();
    STKUser authenticatedUser = (STKUser) request.getSession().getAttribute("STKUserSession");
    List programs = null;
    List supervisors = null;

    try {
        programs = prgDAO.getProgramList(authenticatedUser);
    } catch (DAOException e) {
        request.setAttribute("message", e);
    }

    String strSQL = "SELECT DISTINCT phonebook.badge, phonebook.lname, phonebook.fname FROM phonebook 
        WHERE phonebook.badge IN (SELECT DISTINCT phonebook.ata_badge FROM phonebook WHERE 
        phonebook.dept='" + authenticatedUser.getDepartment() + "') ORDER BY lname";
    supervisors = General_IO.retALM(strSQL);

    request.setAttribute("supervisors", supervisors);
    request.setAttribute("programs", programs);
    RequestDispatcher view = request.getRequestDispatcher("views/commitment_template.jsp");
    view.forward(request, response);
}   

【问题讨论】:

  • 与您的问题没有直接关系,但我建议不要直接使用 servlet API。使用 servlet,您必须编写大量代码来进行简单的参数处理。 Servlet 也很难用单元测试来测试。有许多 Web 操作框架可供选择,包括 WebWork、Stripes 和 Spring MVC。
  • 我很欣赏框架的建议。相信我,我很想使用其中之一。但我为一家拥有控制网络服务器的 IT 团队的大公司工作。我们在使用任何新技术方面落后了 8 年,我不允许自己在服务器上安装任何软件/框架。他们用发展束缚了我们。 :( 我确实在类路径中有一个文件夹,并且可能能够回避一些 IT 规则并将一些 jar 放在那里,前提是它可以在我们过时的服务器上运行(jsp 1.2、java 1.4、web 模块 2.3)
  • 你不需要在服务器上安装一些东西来使用这些框架;您只需在类路径中包含罐子。如果他们通过 WAR 文件部署您的应用程序,那么它只是一个要打包的 jar。如果 IT 部门拒绝,我建议您讨论一下自己滚动此操作的所有安全性和性能影响。祝你好运!
  • 那是另一个问题。我们没有准备好部署 WAR 文件。 atlealet IT 表示他们没有为单个开发人员进行 WAR 部署的流程。当我将类文件放到类路径中的文件夹中时,我有点受制于每晚服务器重启。有没有办法让服务器重新加载我的课程?

标签: java jsp web-applications servlets


【解决方案1】:

我建议阅读DAO pattern 的动机。简而言之,它用于抽象出访问数据的方式。如果使用得当,您的 servlet 不必包含 SQL。

我还建议使用 JPA 或 JDO 之类的持久性 API 来访问您的对象。为每种类型的数据访问构建自己的 SQL 既繁琐又容易出错,而且通常效率低下。

与如何检索数据不同的是如何为数据建模的问题。由于主管是用户,因此可能具有用户的所有属性(姓名、员工 ID、主管),将这些属性存储在存储用户数据的同一个表中可能是有意义的。

【讨论】:

  • 谢谢。无法使用 JPA 或 JDO 之类的持久性 API,因为我受制于 IT 部门为开发人员提供的东西。
  • IT 部门不会让你包含自己的 jar?是时候向他们传达 Java 开发的要求了。顺便说一句,如果他们允许,休眠是另一种选择。
  • @Peter 我在类路径中有一个文件夹。所以我也许可以回避一些 IT 规则并删除一些 jar,前提是它们将在我们过时的服务器上运行(jsp 1.2、java 1.4、web 模块 2.3)
  • 所有这些框架都是罐子!您可能必须使用旧版本才能与您的目标平台一起使用,并且如果它需要您公司不允许的服务器配置更改,则可能无法使用完整套件,但当然可以通过这种方式处理持久层。
【解决方案2】:

如果你的主管是用户并且你有一个 UserDAO,那么也许你的 UserDAO 应该有一个 getSupervisors() 方法,或者可能是一个 getSupervisors(String dept) 方法。

从来没有通过字符串连接构造 SQL,它只是要求http://en.wikipedia.org/wiki/SQL_injection

【讨论】:

  • 谢谢,这是我决定采用的方法 - 将 getSupervisorByDept(authenticatedUser user) 方法添加到我的 UserDAO。在我所有的 DAO 中,我使用准备好的语句来防止 sql 注入。上面的 sql 没有连接请求参数,所以我觉得在那种情况下没问题。
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2020-05-08
  • 2018-03-08
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多