Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MVC和DAO模式在JSP页面中以HTML显示JDBC结果集_Java_Jsp_Servlets_Model View Controller_Jdbc - Fatal编程技术网

Java 使用MVC和DAO模式在JSP页面中以HTML显示JDBC结果集

Java 使用MVC和DAO模式在JSP页面中以HTML显示JDBC结果集,java,jsp,servlets,model-view-controller,jdbc,Java,Jsp,Servlets,Model View Controller,Jdbc,我正在使用JSP和JDBC实现MVC。我已经将一个数据库类文件导入到我的JSP文件中,我想显示一个DB表的数据。我不知道如何将Java类中的ResultSet返回到JSP页面并将其嵌入HTML中 如何实现这一点?您可以使用标记 您可以在下面的链接中找到一个详细的示例,MVC在web应用程序上下文中不包括使用JSP中的类。它包括使用以下模型: 浏览器向web服务器发送请求 web服务器的配置使请求由servlet或过滤器(控制器:Java代码,而不是JSP代码)处理 servlet/过滤器通常根据

我正在使用JSP和JDBC实现MVC。我已经将一个数据库类文件导入到我的JSP文件中,我想显示一个DB表的数据。我不知道如何将Java类中的
ResultSet
返回到JSP页面并将其嵌入HTML中


如何实现这一点?

您可以使用
标记


您可以在下面的链接中找到一个详细的示例,MVC在web应用程序上下文中不包括使用JSP中的类。它包括使用以下模型:

  • 浏览器向web服务器发送请求
  • web服务器的配置使请求由servlet或过滤器(控制器:Java代码,而不是JSP代码)处理
  • servlet/过滤器通常根据配置/注释将请求分派给特定类(称为操作,控制器的特定部分)
  • 该操作执行业务逻辑(即从示例中的数据库获取数据:模型)
  • 该操作将请求转发给JSP。JSP的作用只是生成HTML代码(即显示数据:视图)
  • 由于JSP通常使用JSP标记(例如JSTL)和JSP表达式语言,并且由于JSP标记和EL设计用于从JavaBeans获取信息,因此最好以JavaBeans或JavaBeans集合的形式提供数据

    因此,控制器(action类)的角色是获取数据,创建包含数据的JavaBean实例,采用适合JSP的格式,将它们放入请求属性中,然后分派给JSP。然后JSP将遍历JavaBean实例并显示它们包含的内容


    您不应该自己实现MVC框架。使用现有的代码(Stripes、Struts等)

    在设计良好的MVC方法中,JSP文件不应包含任何一行Java代码,servlet类不应包含任何一行JDBC代码

    假设您希望在webshop中显示产品列表,则需要创建以下代码

    • 一个
      Product
      类代表一个产品的真实实体,它应该只是一个

    • 一个完成所有讨厌的JDBC工作并返回一个漂亮的
      列表的类

    要让它工作,只需通过其URL调用servlet。如果servlet被注释为
    @WebServlet(“/products”)
    ,或者在
    web.xml
    中映射为
    /products
    ,那么您可以通过
    http://example.com/contextname/products

    另见:
    我不知道如何将结果集从类文件返回到JSP页面

    嗯,你没有

    MVC的目的是将您的模型(在本例中是MDB信息)与您的视图(Vjsp,在本例中)分离开来,这样您就可以在不停止应用程序的情况下更改视图

    为此,您可以使用一个中间对象来表示您的数据(通常称为DTO—在数据传输对象之后—不知道他们现在如何调用它),并使用另一个对象来获取数据(通常是DAO)

    因此,基本上您拥有JSP文件,获取请求参数,然后从DAO调用一个方法。dao在内部可以连接到db并获取数据,并构建DTO的集合,这些集合返回给JSP进行呈现

    类似于这种极其简化(且不安全)的代码:

    Employee.java

    class Employee {
       String name;
       int emplid;
    }
    
    EmployeeDAO.java

    class EmployeeDAO { 
       ... method to connect 
       etc. 
       List<Employee> getAllNamed( String name ) { 
           String query = "SELECT name, emplid FROM employee where name like ?";
           ResultSet rs = preparedStatement.executeQuery etc etc.
           List<Employee> results = ....
           while( rs.hasNext() ) { 
              results.add( new Employee( rs.getString("name"), rs.getInt("emplid")));
           }
           // close resources etc 
           return results;
        }
    }
    
    class EmployeeDAO{
    …连接的方法
    等
    列表getAllNamed(字符串名称){
    String query=“从名称类似的员工中选择姓名、员工ID?”;
    结果集rs=preparedStatement.executeQuery等。
    列出结果=。。。。
    而(rs.hasNext()){
    结果.添加(新员工(rs.getString(“姓名”)、rs.getInt(“员工ID”));
    }
    //密切的资源等
    返回结果;
    }
    }
    
    employee.jsp

    <%
       request.setAttribute("employees", dao.getAllNamed( request.getParameter("name") );
    %>
    <table>
    <c:forEach items="${employees}" var="employee">
    <tr><td>${employee.emplid}</td><td>${employee.name}</td></tr>
    </c:forEach>
    </table>
    
    
    ${employee.employid}${employee.name}
    

    我希望这能给您一个更好的想法。

    我认为最好将表的数据包含到一个集合中,如list,然后从Java类返回列表,并在JSP中重用此集合。

    非常有信息的教程。我想知道这对于POST请求是如何工作的。我试着通过一个请求维护一个bean。但是在JSP上,我得到一个错误,说我不知道如何迭代bean。是的,当在同一个页面上收到响应时,如果我再次尝试发送请求,servlet处理的请求就不存在了found@Coretek:在正确设计的Java EE应用程序中,这是一个注入的
    @无状态
    EJB,类似于
    @EJB私有产品dao-ProductDAO,以便完全透明地管理事务。但在这个特定的基本JDBC示例中,如果您的环境不支持EJB(例如Tomcat),您当然也可以在servlet的
    init()
    方法中以任何方式实例化它。@itsraja:servlet的
    init()
    ServletContextListener
    contextInitialized()
    @Tiny:如果它是无状态的(即方法不依赖于任何实例变量,如答案中的代码所示),这应该不会有什么坏处。如果它是有状态的,那么故事当然会改变。如果您手头有EJB,只需注释它就更容易了
    @Stateless
    (或
    @Stateful
    )。。。毕竟,要用JPA oneliner来取代JDBC的混乱(除非你只是为了纯粹的学习目的而玩弄已有十年历史的技术/方法;)将
    结果集
    (和
    语句
    连接
    )传递到meth的范围之外
    class Employee {
       String name;
       int emplid;
    }
    
    class EmployeeDAO { 
       ... method to connect 
       etc. 
       List<Employee> getAllNamed( String name ) { 
           String query = "SELECT name, emplid FROM employee where name like ?";
           ResultSet rs = preparedStatement.executeQuery etc etc.
           List<Employee> results = ....
           while( rs.hasNext() ) { 
              results.add( new Employee( rs.getString("name"), rs.getInt("emplid")));
           }
           // close resources etc 
           return results;
        }
    }
    
    <%
       request.setAttribute("employees", dao.getAllNamed( request.getParameter("name") );
    %>
    <table>
    <c:forEach items="${employees}" var="employee">
    <tr><td>${employee.emplid}</td><td>${employee.name}</td></tr>
    </c:forEach>
    </table>