摘要:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
Web容器几大常用组件之间的关系,Servlet、JSP、JavaBean、DB
这几个组件之间的关系是MVC模式的基础。
经典MVC使用方法
请求到达Servlet,Servlet将它写到Bean里面(如果需要的话)
Servlet跳转到JSP
JSP来得到Bean里面的数据
下面就以MVC的方法完成一个模糊查询的界面,输入员工的模糊资料,能够查询出他的详细资料(编号、开始姓名、结束姓名、邮箱)。
首先建立一个模糊查询的页面queryForm.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>查询页面</title> </head> <body> 查找表单<br/> <form action="/MyMVC/servlet/QueryServlet" method="post">请输入员工姓名 <input name="ename"> <input type="submit" value="模糊查询"> </form> </body> </html>
编写Servlet,QueryServlet.java
package wang.servlet; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import wang.dao.EmployeeDao; import wang.po.Employee; public class QueryServlet extends HttpServlet { public QueryServlet() { super(); } public void destroy() { super.destroy(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("ename"); name = new String(name.getBytes("ISO-8859-1")); EmployeeDao employeeDao = new EmployeeDao(); List<Employee> employees = employeeDao.queryEmployeeByName(name); request.setAttribute("employees", employees); ServletContext application = this.getServletContext(); RequestDispatcher rd = application.getRequestDispatcher("/queryResult.jsp"); rd.forward(request,response); } public void init() throws ServletException {} }
在该Servlet中首先接受界面输入的姓名参数,然后调用Dao(Data access object),到数据库里面查找。
编写Dao,EmployeeDao.java,实现访问数据库以及业务逻辑
package wang.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import wang.po.Employee; public class EmployeeDao { private Connection conn = null; public void initialConnection() { try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:xe"; conn = DriverManager.getConnection(url, "hr", "hr"); } catch (Exception e) { e.printStackTrace(); } } public List<Employee> queryEmployeeByName(String name) { List<Employee> employees = new ArrayList<Employee>(); String sql = "select * from employees where FIRST_NAME like '%" + name + "%'"; try { this.initialConnection(); ResultSet rs = conn.createStatement().executeQuery(sql); while(rs.next()) { Employee employee = new Employee(); employee.setEmployeeId(rs.getString("EMPLOYEE_ID")); employee.setFirstName(rs.getString("FIRST_NAME")); employee.setLastName(rs.getString("LAST_NAME")); employee.setEmail(rs.getString("EMAIL")); employees.add(employee); } } catch (SQLException e) { e.printStackTrace(); } finally { this.closeConnection(); } return employees; } public void closeConnection() { try { if(conn!=null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } }
在Dao中使用了POJO类,在一定程度上起到映射数据表的作用
package wang.po; public class Employee { private String employeeId; private String firstName; private String lastName; private String email; public String getEmployeeId() { return employeeId; } public void setEmployeeId(String employeeId) { this.employeeId = employeeId; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
在Servlet中得到查找的数据后,下面这几句代码
ServletContext application = this.getServletContext(); RequestDispatcher rd = application.getRequestDispatcher("/queryResult.jsp"); rd.forward(request,response);
表示跳转到queryResult.jsp页面中去。
注意:由于上面是把数据保存在request中(减少消耗),所以必须使用上面方法的跳转
编写queryResult.jsp页面
<%@ page language="java" import="java.util.*,wang.po.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>查询结果页面</title> </head> <body> 查询结果<br/> <table> <tr> <td>编号</td> <td>开始姓名</td> <td>结束姓名</td> <td>邮箱</td> </tr> <% List employees = (ArrayList)request.getAttribute("employees"); for (int i=0; i<employees.size(); i++) { Employee employee = (Employee)employees.get(i); %> <tr> <td><%=employee.getEmployeeId() %></td> <td><%=employee.getFirstName() %></td> <td><%=employee.getLastName() %></td> <td><%=employee.getEmail() %></td> </tr> <% } %> </table> </body> </html>
启动Tomcat,访问查询页面,输入查询条件
得到查询结果