使用 Servlet 作为控制器,标准MVC模式



使用 Servlet 作为控制器,标准MVC模式

JSP 仅能作为表现层(View)技术,作用有两点:

1. 负责收集用户请求参数。

2. 将应用的处理结果、状态数据呈现给用户。

Servlet 则仅充当控制器(Controller)角色,用户类似于调度员:(所以用户的请求发送给 Servlet , Servlet 调用 Model 来处理用户请求,并调用 JSP 来呈现处理结果;)

Model 通常由 JavaBean 来充当,所以业务逻辑、数据访问逻辑都在 Model 中实现。

 

login.jsp

 

[html] view plain copy

  1. <%@ page contentType=”text/html; charset=GBK” language=”java” errorPage=”" %>
  2. <!DOCTYPE html PUBLIC ”-//W3C//DTD XHTML 1.0 Transitional//EN”
  3.     ”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
  4. <html xmlns=”http://www.w3.org/1999/xhtml”>
  5. <head>
  6.     <title> 用户登录 </title>
  7. </head>
  8. <body>
  9. <!– 输出出错提示 –>
  10. <span style=”color:red;font-weight:bold”>
  11. <%<span style=”white-space:pre”> // 错误提示
  12. if (request.getAttribute(“err”) != null)
  13. {
  14.     out.println(request.getAttribute(“err”) + ”<br/>”);
  15. }
  16. %>
  17. </span>
  18. 请输入用户名和密码:
  19. <!– 登录表单,该表单提交到一个Servlet –>
  20. <form id=”login” method=”post” action=”login”>
  21. 用户名:<input type=”text” name=”username”/><br/>
  22. 密  码:<input type=”password” name=”pass”/><br/>
  23. <input type=”submit” value=”登录”/><br/>
  24. </form>
  25. </body>
  26. </html></span>


简单的表单页面,收集用户名和密码,并将请求提交到指定的 Servlet ,如下 Servlet 充当控制器角色

LoginServlet.Java

 

[java] view plain copy

  1. package lee;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.annotation.*;
  5. import java.io.PrintWriter;
  6. import java.io.IOException;
  7. import java.sql.*;
  8. @WebServlet(name=”login”
  9.     , urlPatterns={“/login”})
  10. public class LoginServlet extends HttpServlet
  11. {
  12.     //响应客户端请求的方法
  13.     public void service(HttpServletRequest request,
  14.         HttpServletResponse response)
  15.         throws ServletException,java.io.IOException
  16.     {
  17.         String errMsg = ”";
  18.         //Servlet本身并不输出响应到客户端,因此必须将请求转发
  19.         RequestDispatcher rd;
  20.         //获取请求参数
  21.         String username = request.getParameter(“username”);
  22.         String pass = request.getParameter(“pass”);
  23.         try
  24.         {
  25.             //Servlet本身,并不执行任何的业务逻辑处理,它调用JavaBean处理用户请求
  26.             DbDao dd = new DbDao(“com.mysql.jdbc.Driver”,
  27.                 ”jdbc:mysql://localhost:3306/liuyan”,”root”,”");
  28.             //查询结果集
  29.             ResultSet rs = dd.query(“select pass from user_table ”
  30.                 + ”where name = ?”, username);
  31.             if (rs.next())
  32.             {
  33.                 //用户名和密码匹配
  34.                 if (rs.getString(“pass”).equals(pass))
  35.                 {
  36.                     //获取session对象
  37.                     HttpSession session = request.getSession(true);
  38.                     //设置session属性,跟踪用户会话状态
  39.                     session.setAttribute(“name” , username);
  40.                     //获取转发对象
  41.                     rd = request.getRequestDispatcher(“/welcome.jsp”);
  42.                     //转发请求
  43.                     rd.forward(request,response);
  44.                 }
  45.                 else
  46.                 {
  47.                     //用户名和密码不匹配时
  48.                     errMsg += ”您的用户名密码不符合,请重新输入”;
  49.                 }
  50.             }
  51.             else
  52.             {
  53.                 //用户名不存在时
  54.                 errMsg += ”您的用户名不存在,请先注册”;
  55.             }
  56.         }
  57.         catch (Exception e)
  58.         {
  59.             e.printStackTrace();
  60.         }
  61.         //如果出错,转发到重新登录
  62.         if (errMsg != null && !errMsg.equals(“”))
  63.         {
  64.             rd = request.getRequestDispatcher(“/login.jsp”);
  65.             request.setAttribute(“err” , errMsg);
  66.             rd.forward(request,response);
  67.         }
  68.     }
  69. }

控制器负责接收客户端的请求,然后调用 JavaBean 来处理用户请求。 上面 Servlet 使用 @WebServlet Annoation 为该Servlet 配置了 URL 为 /login ,因此向 /login 发送的请求将交给该 Servlet 处理。

 

 

DbDao.java

 

[java] view plain copy

  1. package lee;
  2. import java.sql.*;
  3. public class DbDao
  4. {
  5.     private Connection conn;
  6.     private String driver;
  7.     private String url;
  8.     private String username;
  9.     private String pass;
  10.     public DbDao()
  11.     {
  12.     }
  13.     public DbDao(String driver , String url
  14.         , String username , String pass)
  15.     {
  16.         this.driver = driver;
  17.         this.url = url;
  18.         this.username = username;
  19.         this.pass = pass;
  20.     }
  21.     //下面是各个成员属性的setter和getter方法
  22.     public void setDriver(String driver) {
  23.         this.driver = driver;
  24.     }
  25.     public void setUrl(String url) {
  26.         this.url = url;
  27.     }
  28.     public void setUsername(String username) {
  29.         this.username = username;
  30.     }
  31.     public void setPass(String pass) {
  32.         this.pass = pass;
  33.     }
  34.     public String getDriver() {
  35.         return (this.driver);
  36.     }
  37.     public String getUrl() {
  38.         return (this.url);
  39.     }
  40.     public String getUsername() {
  41.         return (this.username);
  42.     }
  43.     public String getPass() {
  44.         return (this.pass);
  45.     }
  46.     //获取数据库连接
  47.     public Connection getConnection() throws Exception
  48.     {
  49.         if (conn == null)
  50.         {
  51.             Class.forName(this.driver);
  52.             conn = DriverManager.getConnection(url,username,
  53.                 this. pass);
  54.         }
  55.         return conn;
  56.     }
  57.     //插入记录
  58.     public boolean insert(String sql , Object… args)
  59.         throws Exception
  60.     {
  61.         PreparedStatement pstmt = getConnection().prepareStatement(sql);
  62.         for (int i = 0; i < args.length ; i++ )
  63.         {
  64.             pstmt.setObject( i + 1 , args[i]);
  65.         }
  66.         if (pstmt.executeUpdate() != 1)
  67.         {
  68.             return false;
  69.         }
  70.         pstmt.close();
  71.         return true;
  72.     }
  73.     //执行查询
  74.     public ResultSet query(String sql , Object… args)
  75.         throws Exception
  76.     {
  77.         PreparedStatement pstmt = getConnection().prepareStatement(sql);
  78.         for (int i = 0; i < args.length ; i++ )
  79.         {
  80.             pstmt.setObject( i + 1 , args[i]);
  81.         }
  82.         return pstmt.executeQuery();
  83.     }
  84.     //执行修改
  85.     public void modify(String sql , Object… args)
  86.         throws Exception
  87.     {
  88.         PreparedStatement pstmt = getConnection().prepareStatement(sql);
  89.         for (int i = 0; i < args.length ; i++ )
  90.         {
  91.             pstmt.setObject( i + 1 , args[i]);
  92.         }
  93.         pstmt.executeUpdate();
  94.         pstmt.close();
  95.     }
  96.     //关闭数据库连接的方法
  97.     public void closeConn()
  98.         throws Exception
  99.     {
  100.         if (conn != null && !conn.isClosed())
  101.         {
  102.             conn.close();
  103.         }
  104.     }
  105. }

DbDao 负责完成查询、插入、修改等操作。