1. 程式人生 > >對於servlet初步理解

對於servlet初步理解

Servlet在MVC框架中經常擔當控制器(Controller)的角色,其作用類似於排程員,下面我們就根據一個簡單JavaEE的示例來理解Servlet的機制和原理.

程式的目錄樹結構
樹結構如上,其中
login.jsp作為測試使用者登入頁面.
welcome.jsp作為登入成功頁面
DaDao.java作為資料庫操作類
LoginServlet.java就是我們所說的Servlet類

我們來看具體內容:
login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; UTF-8"> <title>連線資料庫範例</title> </head> <body> <span style="color: blue; font-weight: bold;"
>
<% if (request.getAttribute("err") != null) { out.println(request.getAttribute("err") + "<br/>"); } %> </span> 請輸入使用者名稱密碼: <form id="login" method="post" action="login"> 使用者名稱: <input type="text" name="username"><br /> 密碼:<input
type="password" name="password">
<br /> <input type="submit" value="登入"><br /> </form> </body> </html>

以上頁面只負責傳遞兩個引數,一個是使用者名稱,另一個是使用者密碼,將引數傳遞給LoginServlet的例項中,再通過驗證資料庫進行結果判斷,然後Servlet將結果檢視反饋給使用者.
welcome.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title> 歡迎頁面 </title>
    <meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<h3>歡迎登入</h3>
<%=session.getAttribute("name")%>,歡迎登入!
</body>
</html>

此頁面是使用者密碼驗證成功後返回的檢視.

                  DbDao.java
package glq;

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;
    }
    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, password);
        }
        return conn;
    }

    public boolean insert(String sql,Object... args) throws Exception, Throwable{
        PreparedStatement ps=getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        if(ps.executeUpdate()!=1){
            return false;
        }
        return true;
    }

    public ResultSet query(String sql,Object... args) throws Exception{
        PreparedStatement ps=getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        return ps.executeQuery();
    }

    public void modify(String sql,Object... args) throws Exception{
        PreparedStatement ps=getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        ps.executeUpdate();
        ps.close();
    }
    public void closeConn() throws Exception{
        if(conn!=null &&!conn.isClosed()){
            conn.close();
        }
    }
}

DaDao類對資料庫操作進行了簡單的封裝,插入了連線資料庫,查詢記錄,修改記錄,插曲記錄等方法.
                  LoginServlet.java
package glq;

import java.io.IOException;
import java.sql.ResultSet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name="login" ,urlPatterns={"/login"})
public class LoginServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        String errMsg = "";
        RequestDispatcher rd;
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        try {
            //建立資料庫建構函式
            //注意,連線時要在資料庫中建立名為servlet的資料庫
            DbDao dd = new DbDao("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/servlet", "root", "123456");
            //執行查詢方法
            //注意,要在servlet資料庫中新增user_inf表,並在表中新增兩個屬//性:name,pass
            ResultSet rs = dd.query("select pass from user_inf where name=?", username);
            //如果存在該使用者
            if (rs.next()) {
            //判定使用者密碼是否相同
                if (rs.getString("pass").equals(password)) {
                    //獲得session
                    HttpSession session = req.getSession();
                    //註冊name值為username
                    session.setAttribute("name", username);
                    //將引數和頁面轉向welcome.jsp
                    rd = req.getRequestDispatcher("/welcome.jsp");
                    rd.forward(req, res);
                } else {
                //如果密碼匹配失敗
                    errMsg += "密碼不對,請重新輸入";
                }
            } else {
                //如果沒找到使用者
                errMsg += "使用者不存在";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //當錯誤資訊存在時,將錯誤資訊errMsg作為引數傳遞給request中的err變//量,使其在登入頁面顯示,並因為登入失敗跳轉至登入頁面
        if (errMsg != null && !errMsg.equals("")) {
            rd = req.getRequestDispatcher("/login.jsp");
            req.setAttribute("err", errMsg);
            rd.forward(req, res);
        }

    }
}

在測試時,需要在WEB-INF的lib檔案中加入mysql-connector-java-5.1.38-bin.jar包,此包為資料庫工具包.

至於tomcat的構建,以及web專案的建立,需要自行檢索.