1. 程式人生 > >Servlet筆記1

Servlet筆記1

title tco rac equals urn utf https let forname

1.Servlet的介紹:

  jsp的本質就是一個Servet,當jsp頁面部署在web容器中,web容器會將jsp編譯成Servlet。並且jsp頁面中的內容都在Servlet中的service()中進行執行,故我們也可以撇開jsp頁面,直接操作Servlet,當把Servlet當做表現層來使用,即直接在Servlet中進行頁面的開發,對於靜態的html標簽的內容,我們要使用輸出流來輸出,雖然這樣可以達到效果,但是開發效率會很低,因為所有的html標簽,都是用Servlet的輸出流來輸出的,極其繁瑣。並且撇開了jsp頁面,美工人員也無法參與到Servlet的開發中來。故自MVC規範出現後,Servlet僅僅作為控制器(Controller)使用,不再需要生成html標簽內容。


2.jsp與Servlet的區別:
  1.Servlet中沒有內置對象,原來jsp中的內置對象都要由程序顯示的創建

  2.對於靜態的HTML標簽,Servlet都必須要用輸出流來逐行輸出

3.jsp/Servlet的生命周期
  jsp的本質就是Servlet,jsp頁面將被Web容器編譯成對應的Servlet,當Servlet在容器中運行的時候,其實例的創建和銷毀都不是程序員控制的,而是由Web容器控制


  創建Servlet實例有兩個時機
    1.客戶端第一次請求某個Servlet時,系統創建該Servlet的實例,大部分的Servelt都是這種Servlet

    2.Web應用啟動時立即創建Servlet實例,即load-on-startup Servlet

  每個Servlet的生命周期


    (1)創建Servlet實例

    (2)Web容器調用Servlet的init()方法,對Servlet進行初始化

    (3)Servlet初始化後,將一直存在與容器中,用於響應客戶端的請求。如果客戶端發送get請求,容器調用Servlet的doGet方法處理並響應請求;如果客戶端發送post請求,容器調用Servlet的goPost方法處理並響應請求。或者統一用service()方法來處理響應用戶請求。

    (4)Web容器決定銷毀Servlet時,先調用Servlet的destroy()方法,通常在關閉Web應用之時銷毀Servlet


  Servlet的生命周期圖:


技術分享圖片

4.使用Servlet作為控制器
  在標準的MVC模式中,Servlet是僅作為控制器(Controller)使用的,下面通過一個登錄驗證的例子來進行熟悉
  登錄頁面:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/1/4
  Time: 16:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登錄頁面</title>
</head>
<body>
    <%
        if(request.getAttribute("errMsg") != null){
            out.println("<span style=‘color:red‘>"+request.getAttribute("errMsg")+"</span><br/>");
        }
    %>
   <form method="post" action="login">
       用戶名:<input type="text" name="username"><br>&nbsp;&nbsp;碼:<input type="password" name="psw"/><br>
       <input type="submit" value="登錄"/>

   </form>
</body>
</html>

  控制器Controller代碼:

/**
 * Description:servlet
 * Author: Eleven
 * Date: 2018/1/6 9:16
 */

@WebServlet(name = "login",urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet{
    //響應客戶端請求的方法
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String errMsg = "";
        //Servlet本身不能輸出響應到客戶端,必須請求轉發到視圖jsp頁面
        RequestDispatcher rd;

        //獲取請求參數
        String username = request.getParameter("username");
        String psw = request.getParameter("psw");

        //Servlet本身不處理任何業務邏輯,調用JavaBean處理用戶請求
        try{
            DbDao dd = new DbDao("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/test","root","123456");
            String sql = "select password from user where username = ?";
            ResultSet rs = dd.query(sql,username);
            if(rs.next()){
                //用戶名和密碼匹配
                if(rs.getString("password").equals(psw)){
                    //將用戶信息存在session中
                    HttpSession session = request.getSession();
                    session.setAttribute("username",username);
                    //請求轉發
                    rd = request.getRequestDispatcher("/jsp/welcome.jsp");
                    rd.forward(request,response);
                }else {
                    //用戶名和密碼不匹配
                    errMsg = "用戶名和密碼不匹配,請重新輸入!";
                }
            }else{
                //用戶不存在
                errMsg = "用戶名不存在,請重新輸入!";
            }

        }catch (Exception e){
            e.printStackTrace();
        }

        if(errMsg != null && !errMsg.equals("")){
            request.setAttribute("errMsg",errMsg);
            rd = request.getRequestDispatcher("/jsp/login.jsp");
            rd.forward(request,response);
        }

    }
}

  DbDao的代碼:

/**
 * Description:servlet
 * Author: Eleven
 * Date: 2018/1/6 9:27
 */
public class DbDao {
    private Connection conn;
    private String driver;
    private String url;
    private String name;
    private String psw;

    public DbDao() {
    }

    public DbDao( String driver, String url, String name, String psw) {
        this.driver = driver;
        this.url = url;
        this.name = name;
        this.psw = psw;
    }

    //獲取數據庫連接
    public Connection getConnection() throws Exception{

        if(conn == null){
            //註冊驅動
            Class.forName(driver);
            //獲取連接
            conn = DriverManager.getConnection(url,name,psw);
        }
        return conn;
    }

    //查詢
    public ResultSet query(String sql,Object... args) throws Exception{

        //創建Statement
        PreparedStatement pstmt = getConnection().prepareStatement(sql);
        //設置參數
        for(int i=0;i<args.length;i++){
             pstmt.setObject(i+1,args[i]);
        }
        return pstmt.executeQuery();
    }

    //插入
    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 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();
        }
    }

    public Connection getConn() {
        return conn;
    }

    public void setConn(Connection conn) {
        this.conn = conn;
    }

    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 getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPsw() {
        return psw;
    }

    public void setPsw(String psw) {
        this.psw = psw;
    }
}

Servlet筆記1