本应用需要底层数据库的支持,读者可以在MySQL中创建一个login的数据库,在login库中创建user_inf表,里面包含name,pass!

以下是应用的登录页面。

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>登录</title>
 8 </head>
 9 
10 <body>
11 
12 
13 <!-- request.getAttribute("err")可得到JSP页面一表单中控件的Value。使用JSP脚本输出错误提示 -->
14 <span class="tip" style="color:red;font-weight: bolder;">
15 <%if(request.getAttribute("err") != null){
16     out.println(request.getAttribute("err")+"<br/>");
17 }
18 %>
19 </span>
20 
21 请输入用户名和密码:
22 <!-- 登录表单,将表单提交到一个Servlet中 -->
23 <form action="login" id="login" method="post">
24 用户名:<input type="text" name="username"><br/><br/>
25&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br/><br/>
26 <input type="submit" value="登录"><br/>
27 </form>
28 
29 </body>
30 </html>

以上除了一个jsp脚本输出错误提示外,余下的是一个简单的表单页面。根据严格的MVC规范,以上的login.jsp页面不应该被客户直接访问,客户的请求应该先发送到指定Servlet,然后由Servlet将请求发送到jsp页面。

控制器Servlet:   LoginServlet如下:

 

 1 package test;
 2 
 3 import test.Dbdao;
 4 
 5 import java.io.IOException;
 6 import java.sql.ResultSet;
 7 
 8 import javax.servlet.RequestDispatcher;
 9 import javax.servlet.ServletException;
10 import javax.servlet.annotation.WebServlet;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import javax.servlet.http.HttpSession;
15 
16 /**
17  * Servlet implementation class loginServlet
18  */
19 /*使用@WebServlet注解为该Servlet配置了URl为/jsp/login,因此想/login发送的请求将会交给该Servlet处理*/
20 @WebServlet(name="login",urlPatterns={"/jsp/login"})
21 public class LoginServlet extends HttpServlet {
22     private static final long serialVersionUID = 1L;
23     //响应客户端请求的方法
24     public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
25         String errMSG = "";//错误信息
26         RequestDispatcher rd;//在Servlet中使用RequestDispatcher对象的forward进行页面的跳转
27         
28         String username = request.getParameter("username");//获取请求的参数,从jsp中的表单中获取,以表单的名字获取客户端输入的信息
29         String password = request.getParameter("password");//获取请求的参数,从jsp中的表单中获取,以表单的名字获取客户端输入的信息
30         try{
31             /*连接数据库,Servlet本身不执行任何的业务逻辑处理,它调用javabean处理用户请求*/
32             Dbdao dd = new Dbdao("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/login","root","123456");
33             /*查询结果集*/
34             ResultSet rs = dd.query("select pass from user_inf" + " where name = ?", username);
35             if(rs.next()){
36                 /*判断login页面输入的用户名和密码是否匹配*/
37                 if(rs.getString("pass").equals(password)){
38                     HttpSession session = request.getSession();//获取session对象
39                     session.setAttribute("name", username);//设置session属性,跟踪用户会话状态
40                     rd = request.getRequestDispatcher("/jsp/welcome.jsp");//在Servlet中使用RequestDispatcher对象的forward进行页面的跳转,获取转发对象
41                     rd.forward(request, response);//转发请求
42                     
43                 }else{
44                     /*用户名和密码不匹配时*/
45                     errMSG += "您的用户名密码不符合,请重新输入";
46                 }
47             }else{
48                 /*用户名不存在时*/
49                 errMSG += "您的用户名不存在,请注册";
50             }
51         }catch (Exception e){
52             e.printStackTrace();
53         }
54         /*设置出错,转发到login.jsp重新登录*/
55         if(errMSG != null && !errMSG.equals("")){
56             rd = request.getRequestDispatcher("/jsp/login.jsp");
57             request.setAttribute("err", errMSG);
58             rd.forward(request, response);
59         }
60     }
61 
62 }


控制器负责接收客户端的请求,它既不直接对客户端输出响应,也不处理用户请求,只调用JavaBean来处理用户请求;javaBean处理结束后,Servlet根据处理结果,调用不用的jsp页面向浏览器呈现处理结果。最后是应用的DbDao的编写:

 

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;




public class Dbdao {
    private Connection conn;//数据库连接
    private String driver;//数据库的驱动
    private String url;//数据库地址
    private String username;//数据库用户名
    private String password;//数据库的密码
    public Dbdao(){}//无参构造
    
    /*带参构造*/
    public Dbdao(String driver,String url,String username,String password){
        this.driver = driver;
        this.url = url;
        this.username = username;
        this.password = password;
    }
    /*各个成员属性的setter和getter方法*/
    public String getDriver() {
        return driver;
    }
    public void setDriver(String driver) {
        this.driver = driver;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    /*获取数据库连接的方法*/
    public  Connection getConnection() throws Exception{
        if(conn == null){
            Class.forName(this.driver);
            conn = DriverManager.getConnection(url,username,this.password);
        }
        return conn;
        
    }
    
    /*插入记录*/
    public boolean insert(String sql,Object...args) throws Exception{
        PreparedStatement pstmt = getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            pstmt.setObject(i+1, args[i]);
        }
        if(pstmt.executeUpdate() != 1){
            return false;
        }
        return true;
        
    }
    
    /*执行查询*/
    public ResultSet query (String sql,Object...args) throws Exception{
        PreparedStatement pstmt = getConnection().prepareStatement(sql);
        for(int i = 0;i<args.length;i++){
            pstmt.setObject(i+1, args[i]);
        }
        return pstmt.executeQuery();    
    }
    
    /*执行修改*/
    public void modify(String sql,Object...args)throws Exception{
        PreparedStatement pstmt = getConnection().prepareStatement(sql);
        for(int i = 0;i<args.length;i++){
            pstmt.setObject(i+1, args[i]);
        }
        pstmt.executeUpdate();
        pstmt.close();
    }
    /*关闭数据库连接释放资源的方法*/
    public void closeConn() throws Exception{
        if(conn != null && !conn.isClosed()){
            conn.close();
        }
    }
}

DbDao负责完成查询、插入、修改等操作。整个应用的流程是非常清晰的,使用的是MVC构架

MVC中各个角色对应的组件为:

M:Model,即模型,对应JavaBean

V:View,即视图,对应JSP页面

C:Controller,即控制器,对应Servlet。

 

本文参考自 轻量级JavaEE企业应用实战(第4版)——Struts 2+ Spring 4+Hibernate 整合开发    李刚 编著

posted on 2016-08-08 14:47  jelly_t  阅读(2266)  评论(0编辑  收藏  举报