Java 使用MVC和DAO模式在JSP页面中以HTML显示JDBC结果集
我正在使用JSP和JDBC实现MVC。我已经将一个数据库类文件导入到我的JSP文件中,我想显示一个DB表的数据。我不知道如何将Java类中的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/过滤器通常根据
ResultSet
返回到JSP页面并将其嵌入HTML中
如何实现这一点?您可以使用
标记
您可以在下面的链接中找到一个详细的示例,MVC在web应用程序上下文中不包括使用JSP中的类。它包括使用以下模型:
您不应该自己实现MVC框架。使用现有的代码(Stripes、Struts等)在设计良好的MVC方法中,JSP文件不应包含任何一行Java代码,servlet类不应包含任何一行JDBC代码 假设您希望在webshop中显示产品列表,则需要创建以下代码
- 一个
类代表一个产品的真实实体,它应该只是一个Product
- 一个完成所有讨厌的JDBC工作并返回一个漂亮的
列表的类
@WebServlet(“/products”)
,或者在web.xml
中映射为/products
,那么您可以通过http://example.com/contextname/products
另见:
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>