Servlet-JSP-EL-JSTL-BeanUtils-Cookie-Session

1. Servlet 生命週期的方法

以下方法都是由 Serlvet 容器負責調用. 
1). 構造器: 只被調用一次. 只有第一次請求 Servlet 時, 創建 Servlet 的實例. 調用構造器. 
這說明 Serlvet 的單實例的!
2). init 方法: 只被調用一次. 在創建好實例後立即被調用. 用於初始化當前 Servlet. 
3). service: 被多次調用. 每次請求都會調用 service 方法. 實際用於響應請求的. 
4). destroy: 只被調用一次. 在當前 Servlet 所在的 WEB 應用被卸載前調用. 用於釋放當前 Servlet 所佔用的資源. 

2. Servlet的註冊與運行

  • Servlet程序必須通過Servlet容器來啓動運行,並且儲存目錄有特殊要求,通需要存儲在<WEB應用程序目錄>\WEB-INF\classes\目錄中。
  • Servlet程序必須在WEB應用程序的web.xml文件中進行註冊和映射其訪問路徑,纔可以被Servlet引擎加載和被外界訪問。
  • 一個<servlet>元素用於註冊一個Servlet,它包含有兩個主要的子元素:<servlet-name><servlet-class>,分別用於設置Servlet的註冊名稱和Servlet的完整類名。
  • 一個<servlet-mapping>元素用於映射一個已註冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name><url-pattern>,分別用於指定Servlet的註冊名稱和Servlet的對外訪問路徑。
  • 同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的註冊名。
  • 在Servlet映射到的URL中也可以使用*通配符,但是隻能有兩種固定的格式:一種格式是“*.擴展名”,另一種格式是以正斜槓(/)開頭並以“/*”結尾。(  *.do     /action/*)
  • load-on-startup: 可以指定 Serlvet 被創建的時機. 若爲負數, 則在第一次請求時被創建.若爲 0 或正數, 則在當前 WEB 應用被
    Serlvet 容器加載時創建實例, 且數組越小越早被創建. 

3. HttpServlet

  • HtppServlet是一個Servlet,繼承自GenericServlet。針對於Http協議所定製;
  • 在service()方法中直接把ServletRequest和ServletResponse轉爲了HtttpServletRequest和HttpServletResponse;

4. JSP的九大內置對象

request   請求對象                                      response  響應對象

pageContext    jsp的上下文對象                 session    會話對象

application     ServletContext對象               config       ServletConfig對象

out             jsp輸出流對象                            page     指向當前的jsp的對象

exception    異常對象

5. JSP的四大域對象

pageContext    當前jsp頁面範圍內有效                       request             一次請求內有效

session             一次會話範圍內有效                           application       整個web工程範圍內有效

6. EL表達式

  • EL表達式主要是在jsp頁面中輸出數據,主要是輸出域對象中的數據
  • 當四個作用域中都有相同的key的數據時,按照從小到大順序依次查找,pageContext<request<session<application

6.1 EL表達式的11個隱含對象

6.2 jsp的絕對路徑  ${pageContext.request.contextPath}

比如:<script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"></script>

<a href="${pageContext.request.contextPath}/product-list.jsp">

6.3 一般使用

7. JSTL標籤庫

7.1 核心庫

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
    <c:if />
    if 標籤用來做 if 判斷。
    test 屬性表示判斷的條件(使用 EL 表達式輸出)
--%>
    <c:if test="${ 12 == 12 }">
        <h1>12 等於 12</h1>
    </c:if>
<%--
    <c:choose> <c:when> <c:otherwise> 標籤
    作用:多路判斷。跟 switch ... case .... default 非常接近
    choose 標籤開始選擇判斷
    when 標籤表示每一種判斷情況
    test 屬性表示當前這種判斷情況的值
    otherwise 標籤表示剩下的情況
    <c:choose> <c:when> <c:otherwise> 標籤使用時需要注意的點:
    1 、標籤裏不能使用 html 註釋,要使用 jsp 註釋
    2 、 when 標籤的父標籤一定要是 choose 標籤
--%>

    <c:choose>
        <c:when test="${ requestScope.height > 190 }">
            <h2>小巨人</h2>
        </c:when>
        <c:when test="${ requestScope.height > 180 }">
            <h2>很高</h2>
        </c:when>
        <c:when test="${ requestScope.height > 170 }">
            <h2>還可以</h2>
        </c:when>
        <c:otherwise>
            <c:choose>
                <c:when test="${requestScope.height > 160}">
                    <h3>大於 160</h3>
                </c:when>
                <c:when test="${requestScope.height > 150}">
                    <h3>大於 150</h3>
                </c:when>
                <c:when test="${requestScope.height > 140}">
                    <h3>大於 140</h3>
                </c:when>
                <c:otherwise>
                    其他小於 140
                </c:otherwise>
            </c:choose>
        </c:otherwise>
    </c:choose>
<%--
    遍歷 1 到 10 ,輸出
    begin 屬性設置開始的索引
    end   屬性設置結束的索引
    var   屬性表示循環的變量 ( 也是當前正在遍歷到的數據 )
    for (int i = 1; i < 10; i++)
--%>
<table border="1">
    <c:forEach begin="1" end="10" var="i">
        <tr>
            <td>第${i}行</td>
        </tr>
    </c:forEach>
</table>
<%-- 
    遍歷 Object 數組或集合
    for (Object item: arr)
    items 表示遍歷的數據源(遍歷的集合或數組)
    var   表示當前遍歷到的數據
--%>
<c:forEach items="${ requestScope.arr }" var="item">
    ${ item } <br>
</c:forEach>
<c:forEach items="${ requestScope.map }" var="entry">
    <h1>${entry.key} = ${entry.value}</h1>
</c:forEach>
<table>
    <tr>
        <th>編號</th>
        <th>用戶名</th>
        <th>密碼</th>
        <th>年齡</th>
        <th>電話</th>
        <th>操作</th>
    </tr>
<%--
    items     表示遍歷的集合
    var       表示遍歷到的數據
    begin     表示遍歷的開始索引值
    end       表示結束的索引值
    step      屬性表示遍歷的步長值
    varStatus 屬性表示當前遍歷到的數據的狀態
        .current 當前數據
        .index   當前數據的索引
        .count   當前數據是第幾個
        .step    獲取遍歷設置的步長
        .first   是否是第一個
        .last    是否是最後一個
        .begin   獲取遍歷設置的起始值
        .end     獲取遍歷設置的結束值
    for ( int i = 1; i < 10; i+=2 )
--%>
    <c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stuList}" var="stuItem">
        <tr>
            <td>${stuItem.id}</td>
            <td>${stuItem.username}</td>
            <td>${stuItem.password}</td>
            <td>${stuItem.age}</td>
            <td>${stuItem.phone}</td>
            <td>${status.index}</td>
        </tr>
    </c:forEach>
</table>

8. Servlet使用反射替代if-else

public class BaseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");
        try {
            //反射拿到方法,比如從頁面傳過來的action=login,則對應的方法就是login();如果是regist,則方法是regist()
            Method method = this.getClass()
                    .getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            method.invoke(this,request,response);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

9. BeanUtils工具

public class WebUtils {
    public static <T> T copyParam2Bean(Map values, T bean) {
        System.out.println("before bean=" + bean);
        try {
            BeanUtils.populate(bean,values);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println("after bean=" + bean);
        return bean;
    }
}

10. Cookie

  • Cookie是服務器通知客戶端保存鍵值對的一種技術
  • Servlet發送到Web瀏覽器少量信息,這些信息由瀏覽器保存到Cookie,然後每次請求都會發送回服務器
  • 每個Cookie的大小不能超過4KB

11. Session

  • Session就是一個接口(HttpSession)
  • Session就是會話,用來維護一個客戶端和服務器之間關聯的一種技術
  • 每個客戶端都有自己的一個Session會話
  • Session會話中,我們經常用來保存用戶登錄後的信息

11.1 Session設置超時時長的方法

//1. Session默認超時時長是1800秒,也就是30分鐘。這是在tomcat的web.xml配置的

//2. 在工程的web.xml裏面配置全局的session超時時長
<session-config>
    <session-timeout>60</session-timeout>
</session-config>

//3. 如果想單獨給某個session設置超時時長,則調用session對應的api方法
    // 先獲取Session對象
    HttpSession session = req.getSession();
    // 設置當前Session3秒後超時
    session.setMaxInactiveInterval(3);
    // 讓Session會話馬上超時,一般在銷燬時調用,比如重新登錄用戶時
    session.invalidate();

11.2 Session在客戶端與服務器之間的傳遞過程

  1. 瀏覽器在沒有對應的Cookie發送請求時,服務器通過request.getSession()創建Session對象保存到服務器內存中,同時創建一個Cookie對象,Cookie對象的key永遠是JSESSIONID,值是剛剛創建的session對象的ID值。然後服務器通過響應返回給客戶端,瀏覽器解析數據創建一個Cookie對象;
  2. 瀏覽器有了這個Cookie對象後的每次請求,都會把session的id以Cookie的形式發送給服務器。此時服務器通過request.getSession()獲取的是之前創建好的session並返回;
  3. 假如把瀏覽器的這個session對應的cookie刪除掉,則再次請求時,服務器通過request.getSession()創建一個新的Session對象保存到服務器內存中,之前的那個session就沒有了對應關聯;

12. 驗證碼的使用

  • 表單提交完畢後,按F5刷新,表單會重複提交。解決方法:使用重定向來進行跳轉
  • 用戶提交到服務器,由於網絡卡頓,用戶遲遲未收到響應,用戶多次點擊提交造成重複提交,可以使用驗證碼解決
  • 用戶提交到服務器,用戶回退瀏覽器,然後再次提交造成重複,可以使用驗證碼解決

12.1 谷歌驗證碼Kaptcha的使用

  1. 導入kaptcha-2.3.2.jar
  2. 在web.xml配置映射
        <servlet>
                <servlet-name>KaptchaServlet</servlet-name>
            <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>KaptchaServlet</servlet-name>
            <url-pattern>/kaptchaServlet.jpg</url-pattern>
        </servlet-mapping>
  3. 在表單中使用img標籤顯示驗證碼圖片
    <label>驗證碼:</label>
    <input class="itxt" name = "code" type="text" style="width: 90px;" id="code"/>
    <img id="code_img" src="kaptchaServlet.jpg" style="float: right; margin-right: 40px; width: 100px; height: 30px">
    
    
    
    $("#code_img").click(function () {
        this.src = "${basePath}/kaptchaServlet.jpg?d=" + new Date();
    })
  4. servlet中獲取並比較
    String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
    request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
    String code = request.getParameter("code");
    if (token != null && token.equalsIgnoreCase(code)) {
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章