1. 程式人生 > 實用技巧 >SQLZOO:SELECT from WORLD Tutorial

SQLZOO:SELECT from WORLD Tutorial

------------恢復內容開始------------

JSP

  • 什麼是JSP
    • 瀏覽器向伺服器傳送請求,不管訪問什麼資源,其實都是在訪問Servlet,servlet最終會轉換成為一個java類,JSP本質上就是一個Servlet
    • 在JSP頁面中,java程式碼就會原封不動的輸出,如果是HTML程式碼則會被轉義成out.write("<html>\r\n")這樣的格式輸出到前端  
  • jSP基礎語法和指令
    •   <%-- 註釋命令 --%>
    • <%-- JSP 表示式 用來將程式輸出到客戶端
      <%= 變數或者表示式 %>
      --%>
      <%= new java.util.Date() %>
    • <hr>
      <%-- 分割線 --%>
    • <%-- JSP宣告:使生成的元素在java的類中,提高了元素的作用域!,其他的會生成到_javaService方法中 --%>
      <%!
      static {
      System.out.println("Loading Servlet!");
      }

      private int globVar = 0;
      public void method(){
      System.out.println("進入了method方法");
      }
      %>
  • JSP指令
    • page指令
      • <%@ page import="java.util.Date" %>導包
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>設定網頁引數
      • <%-- 定製錯誤頁面 --%>
        <%@page errorPage="error/500.jsp" %>
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>Title</title>
        </head>
        <body>
            <img src="../img/500.png" alt = 500>
        </body>
        </html>
      • 在web.xml中配置錯誤頁面
        <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                 version="4.0"
                 metadata-complete="true">
        
        <error-page>
            <error-code>404</error-code>
            <location>/error/404.jsp</location>
        </error-page>
        
        </web-app>
      • <%@page isErrorPage="true" %>
        <%@page pageEncoding="UTF-8" %> 都是一些頁面設定

    • include指令
      • <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>Title</title>
        </head>
        <body>
            <%@include file="common/header.jsp"%>
            <h1>
                我是主體
            </h1>
            <%@include file="common/footer.jsp"%>
        
            <hr>
            <%-- jsp 標籤 --%>
            <jsp:include page="/common/header.jsp"/>
            <h1>
                我是主體
            </h1>
            <jsp:include page="common/footer.jsp"/>
        
        </body>
        </html>

        <%-- 兩種方式的不同點是,@include會將兩個頁面合二為一,jsp標籤的include是拼接頁面,本質還是三個頁面 --%>

  • JSP內建物件和作用域
    • jsp9大內建物件
      • PageContext 存東西
      • Requset存東西
      • Respones
      • Session存東西
      • Application[ServletContext]存東西
      • config[ServletConfig]
      • out
      • exception
    • <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
      <title>Title</title>
      </head>
      <body>
      <%-- 內建物件 何其不同的作用域--%>
      <%
      pageContext.setAttribute("name1","duf1");//儲存的資料只在一個頁面中有效
      request.setAttribute("name2","duf2");//儲存的資料只在一次資料請求中有效,如果有頁面的轉發,該資料繼續生效,否則該資料死亡
      session.setAttribute("name3","duf3");//儲存的資料只在一車會話中有效,,從開啟瀏覽器到關閉瀏覽器
      application.setAttribute("name4","duf4");//儲存的資料在伺服器中有效,從開啟伺服器到關閉伺服器
      %>

      <%
      String name1 = (String) pageContext.findAttribute("name1");
      String name2 = (String) pageContext.findAttribute("name2");
      String name3 = (String) pageContext.findAttribute("name3");
      String name4 = (String) pageContext.findAttribute("name4");
      String name5 = (String) pageContext.findAttribute("name5");
      %>

      <%-- 使用EL表示式輸出值 name5沒有值就不會輸出--%>
      <h1>取出的值為</h1>
      <h3>${name1}</h3>
      <h3>${name2}</h3>
      <h3>${name3}</h3>
      <h3>${name4}</h3>
      <h3>${name5}</h3>
      <hr>

      <%-- 使用jsp語法取值 name5會輸出null --%>
      <h3><%= name5%></h3>
      </body>
      </html>
      • 各個作用域使用的場景
        • request:客戶端向伺服器傳送請求,產生資料,使用者看完就沒用了,比如:新聞等
        • session:客戶端向伺服器傳送請求,產生資料,使用者用完一段時間還有用,比如:購物車
        • application:客戶端向伺服器傳送請求,產生資料,一個使用者用完了,其他使用者可能還有用,比如:聊天資料
  • JSP標籤&JSTL標籤&EL表示式
    <!-- JSTL 表示式的依賴 -->
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- standard 標籤庫依賴 -->
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
    • EL表示式:${}
      • 獲取資料
      • 執行運算
      • 獲取web開發常用的物件

    • JSTL標籤
  • javabean
    • 必須要有一個無參構造
    • 屬性必須私有化
    • 必須有對應的set、get方法
    • 一般用來和資料庫的欄位做對映ORM
      • 表-->類
      • 欄位-->屬性
      • 行記錄-->物件
  • MVC三層構架
    • model 模型
      • 業務處理:業務邏輯(service)
      • 資料持久層:CRUD(Dao)
    • view 檢視 (JSP):專注於顯示資料
      • 展示資料
      • 提供連線發起Servlet請求(a、form、img...) 
    • controller 控制器(servlet):專注於處理請求,以及控制檢視跳轉
      • 接收使用者的請求(req:請求引數,Session資訊)
      • 相應使用者的請求(交給業務層去做)
      • 重定向或轉發 (檢視的跳轉)
    •   登入-->接收使用者的登入請求-->處理使用者的請求(獲取使用者登入的引數,username,password)---->提交給業務層處理登入業務(判斷使用者名稱密碼是否正確:事務)---->Dao層查詢使用者名稱和密碼是否正確---->資料庫(資料持久化)
  • Filter 過濾器
    • 用來過濾網站的資料
      • 處理中文亂碼
      • 登入驗證
    • Filter開發步驟
      • 導包 javax.servlet
      • 編寫過濾器
        • 實現Filter介面,重寫對應的方法即可
          public class CharacterEncodingFilter implements Filter {
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  //初始化,伺服器啟動就會初始化,隨時等待過濾物件出現
                  System.out.println("CharacterEncodingFilter初始化");
              }
          
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  servletRequest.setCharacterEncoding("UTF-8");
                  servletResponse.setCharacterEncoding("UTF-8");
                  servletResponse.setContentType("text/html;character=UTF-8");
          
                  /**
                   * filterChain:鏈
                   * 1、過濾中的所有程式碼在過濾特定請求的時候都會執行
                   * 2、必須要讓過濾器繼續通行
                   * filterChain.doFilter(servletRequest,servletResponse)
                   */
                  System.out.println("CharacterEncodingFilter執行前....");
                  filterChain.doFilter(servletRequest,servletResponse);//讓我們的請求繼續走,如果不寫,程式到這裡就被攔截停止
                  System.out.println("CharacterEncodingFilter執行後.....");
              }
          
              @Override
              public void destroy() {
                  //銷燬,關閉伺服器時,過濾會銷燬
                  System.out.println("CharacterEncodingFilter銷燬");
              }
          }
        • filter檔案亦需要在web.xml中進行註冊和對映
          <filter>
                  <filter-name>CharacterEncodingFilter</filter-name>
                  <filter-class>com.twilight.filter.CharacterEncodingFilter</filter-class>
              </filter>
              <filter-mapping>
                  <filter-name>CharacterEncodingFilter</filter-name>
                  <url-pattern>/servlet/*</url-pattern>
              </filter-mapping>

          此處可以為/servlet下的所有包都可以進行過濾,所以,對映Servlet路徑時最好加上該路徑

          <servlet>
                  <servlet-name>showServlet</servlet-name>
                  <servlet-class>com.twilight.servlet.ShowServlet</servlet-class>
              </servlet>
              <servlet-mapping>
                  <servlet-name>showServlet</servlet-name>
                  <url-pattern>/show</url-pattern>
                  <url-pattern>/servlet/show</url-pattern>
              </servlet-mapping>

  • 監聽器