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


DbDao.java

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值