JAVA EE-JSP

JAVA EE-JSP

當一個人在深思的時候,他並不是在閒着。有看得見的勞動,也有看不見的勞動。 —— 雨果

什麼是JSP?

java server page  運行在服務器端的頁面.  ==> 本質就是servlet.
運行流程:
    jsp =(第一次訪問時)=> .java ==> .class ==> 運行
JSP中的腳本:
    <% java內容 %>  該腳本包裹的代碼會出現在 service方法中
    <%=表達式 %>  該腳本用於輸出內容.out.print();方法包裹輸出內容.
    <%! 內容 %>(瞭解): 該腳本包裹的內容會出現在類定義中.

關於EL表達式

   代替 腳本 => 輸出腳本 <%= %>
   格式: ${表達式}
   EL表達式可以在4個域中取數據 => 4個內置對象 applicationScope/requestScope/sessionScope/pageScope
  從指定域取值: ${requestScope.name}<br>
            ${applicationScope.name}<br>
 不指定域取值: ${name}<br>  => 從小域到大域中查找.顯示最先找到的. 

JSP的翻譯過程

這裏寫圖片描述

JSP的腳本元素

這裏寫圖片描述

JSP的頁面註釋

  • JSP註釋:<%– … –%>,轉化階段消失,只能被開發人員看到
  • JAVA註釋://、//、/*/,編譯階段消失
  • HTML註釋:, 不會消失,在頁面中也能看到

JSP的指令元素

  • 功能
    • 用於指示JSP執行某些步驟
    • 用於指示JSP表現特定行爲
  • 語法格式
    <%@ directive [ attribute =“value” ] * %>
  • 分類

    • page指令標記
    • include指令標記
    • taglib指令標記
  • page屬性包含在“<%@ page ”和“%>”之間。

  • 這些屬性可以單獨使用,也可以幾個或多個同時使用
  • page指令用來定義JSP文件的全局屬性
  • 在JSP頁面中,只有import可以出現多次,其它屬性都只能出現一次
    這裏寫圖片描述
    這裏寫圖片描述
    page   指令
    include指令
    taglib 指令

    功能:
        page   : 描述頁面的一些屬性.
        include: 靜態包含指令
        taglib : 導入標籤指令

page :  <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    page指令用於指定頁面一些基本屬性.
    language="java" 頁面中使用的語言爲java.
    *import="java.util.*"  就是導包. 是所有屬性中唯一一個可以在頁面中出現多次的屬性.
    *pageEncoding="UTF-8"   頁面保存到硬盤編碼.
    *contentType="text/html; charset=UTF-8" 發送給瀏覽器的編碼 . 
        以上兩個碼錶最好一致. 但是一般設置一個屬性即可.另外一個屬性自動設置.
    autoFlush="true" 如果緩衝區裝滿是否自動刷新到瀏覽器. 如果裝滿並沒有選擇自動刷新,那麼會拋出異常.
    buffer="8kb"    決定jsp輸出緩衝區大小爲8kb
    errorPage=""    配置當前頁面的錯誤頁面
    isErrorPage="false" 指定當前頁面是否是一個錯誤頁面
            開發中,我們可以使用如下配置統一配置錯誤頁面 比上面的方式要省事:
                      <error-page>
                        <error-code>500</error-code>
                        <location>/page/B.jsp</location>
                      </error-page>

    extends="" 決定當前jsp的父類是誰.父類必須是servlet的子類.
     info="" getServletInfo 剛方法的返回值.
     isELIgnored="false"  決定當前頁面能否使用 EL表達式. 默認值就是支持el.
     session="true" 當前jsp頁面是否可以直接使用session對象.默認值就是true.

JSP中的靜態包含

  • include指令的語法格式如下
<%@ include file=“filename” %>
  • include指令的作用是在JSP頁面中靜態包含一個文件,同時由JSP解析包含的文件內容
  • 靜態包含的含義
  • file不能爲一變量
<% String url="index.html" ; %>
<%@ include file = "<%= url %>" %>
  • 不可以在file 所指定的文件後接任何參數
<%@ include file = "jw.jsp?nm=browser" %>

比如
包含的是目標文件的源碼;包含過來,一起翻譯

main.jsp
<%
          String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp
<%=s %> 沒有定義變量s
儘管part.jsp本身會有錯誤
但是運行main.jsp就可以正確引入part.jsp

JSP的內置對象

  • 指的在jsp中不加以聲明就可以直接使用的9個對象.

  • 原理: 因爲我們的代碼是寫在jsp對應java的service方法中的.所以在service方法中聲明的變量,我們可以直接使用.
    這裏寫圖片描述

JSP中內置對象的類型

  • request HttpServletRequest
  • response HttpServletResponse
  • session HttpSession
  • application ServletContext
  • config ServletConfig
  • page this (HttpServlet)
  • pageContext PageContext
  • exception Throwable (所有異常父類)
  • out JspWriter
public void _jspService(HttpServletRequest 1>request, HttpServletResponse 2>response)
        throws java.io.IOException, ServletException {

    PageContext 3>pageContext = null;
    HttpSession 4>session = null;
    Throwable 5>exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
    if (exception != null) {
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
    ServletContext 6>application = null;
    ServletConfig 7>config = null;
    JspWriter 8>out = null;
    Object 9>page = this;

JSP中的四種數據範圍

  • page Page_Scope 頁面的不同部分間共享數據
  • request
  • session
  • application
  • setAttribute getAttribute
  • removeAttribute

關於pageContext對象

  • pageContext對象可以直譯爲“頁面上下文”對象,代表的是當前頁面運行的一些屬性
  • 它是javax.servlet.jsp.PageContext類的實例對象,可以使用PageContext類的方法。pageContext對象提供了對JSP頁面所有的對象及命名空間的訪問
*本身是一個域對象. 在pageContext對象上有一個map. 這個Map就是Page域.
        操作: 4個操作.
        範圍: 就只在當前頁面中有用.
        作用: 在jsp中應避免在頁面上書寫任何java代碼.
                //pageContext.setAttribute(name, value);
                //  pageContext.getAttribute(name);
                //pageContext.removeAttribute(name);
                //pageContext.getAttributeNamesInScope(scope);
    *pageContext對象還可以操作其他3個域
        目的就是爲了方便.
            pageContext.setAttribute("name", "applicationTom",PageContext.APPLICATION_SCOPE );
            pageContext.setAttribute("name", "sessionTom",PageContext.SESSION_SCOPE );
            pageContext.setAttribute("name", "requestTom",PageContext.REQUEST_SCOPE );

        //pageContext.getAttribute(name, scope);
        //pageContext.removeAttribute(name, scope);
        //pageContext.getAttributeNamesInScope(scope);
        //pageContext.findAttribute("name") 會從所有域中查找鍵. 從小到大
    *持有其他8個內置對象的引用.根據這個對象可以獲得其他8個內置對象
        pageContext.getRequest();
        pageContext.getResponse();
        pageContext.getSession();
        pageContext.getServletContext();
        pageContext.getException();
        pageContext.getServletConfig();
        pageContext.getOut();
        pageContext.getPage();

out對象

這裏寫圖片描述

  • 向客戶端輸出數據
  • 管理服務器輸出緩衝區
  • 內部使用PrintWriter對象來輸出文本級數據
  • 通過page指令的buffer屬性來調整緩衝區的大小,默認的緩衝區是8kb
out 對象是jsp當中的輸出對象.
        代碼:
            out.print("a");
            response.getWriter().print("b");
            out.print("c");
            response.getWriter().print("d");
        輸出: bd ac 
    原理:
        在輸出到瀏覽器時,會先把兩個流合併,再輸出.
        合併時response的字符流在前.
        JSPWriter在後. 所以不管代碼書寫順序如何.最終
        response流的內容總會在JSPwriter流的內容之前
    結論: 在jsp中輸出使用out(JSPWriter)輸出,不要使用response.getWriter輸出.

JSP標籤

  • JSP標籤也稱之爲Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。

  • 語法

<jsp:include page={"relativeURL" | "<%= expression %>"} />

<jsp:include page={"relativeURL" | "<%= expression %>"} >
    <jsp:param name="PN" 
            value="{PV | <%= expression %>}" /> *
</jsp:include> 
  • JSP的常用動作標籤
<jsp:useBean> 
使用一個ID和一個給定作用範圍和同一ID的JavaBean相關聯
<jsp:setProperty> 
設置JavaBean的屬性值
<jsp:getProperty> 
取得JavaBean的屬性值
<jsp:include>  
請求時文件包含
<jsp:forward> 
接受用戶輸入並將請求分派給另一頁面
<jsp:param>

forward標籤詳解

  </head>

  <body>
   <%-- JSP動作標籤
            分擔jsp頁面的java代碼
    --%>

    <jsp:forward page="/index.jsp"></jsp:forward>
    <%-- //下面的代碼相當於上面的標籤
        request.getRequestDispatcher("/index.jsp").forward(request, response);
     --%>
  </body>
</html>

include標籤詳解

  <body>
   <%-- JSP動作標籤
            分擔jsp頁面的java代碼
    --%>

    <jsp:include page="/index.jsp"></jsp:include>
    <%--
        // jsp 動態包含
        request.getRequestDispatcher("/index.jsp").include(request, response);
    --%>
  </body>

<jsp:include>與include指令的比較

  • <jsp:include>標籤是動態引入, <jsp:include>標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合併。
  • 而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合併。
  • 不管是<jsp:include>標籤,還是include指令,它們都會把兩個JSP頁面內容合併輸出,所以這兩個頁面不要出現重複的HTML全局架構標籤,否則輸出給客戶端的內容將會是一個格式混亂的HTML文檔。

這裏寫圖片描述

JavaBean

  • 功能: 將表單參數封裝到User對象
    //參數1: 填寫User對象
    //參數2: 填寫需要封裝到User對象的參數Map
    BeanUtils.populate(u,request.getParameterMap());
    注意: 表單的參數的鍵必須與Bean中屬性名稱對應
    // BeanUtils 可以自動幫你轉換8個基本數據類型. 如果遇到自定義類型需要轉換.我們要自己寫一個轉換器並註冊
    1.自定義轉換器
            public class MyDateConverter implements Converter {
                //參數2 : 待轉換的類型傳遞進來. => 2012-12-12
                // 轉換好之後,使用返回值返回  =>  Date對象
                //參數1:  告訴你要轉換成什麼類型的
                public Object convert(Class arg0, Object arg1) {
                    //創建格式化器
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    //使用格式化器將參數格式化成日期類型
                    try {
                        Date date = format.parse(arg1.toString());
                        //沒出異常.就返回日期對象.
                        return date;

                    } catch (ParseException e) {
                        e.printStackTrace();
                        //出現異常返回null
                        return null;
                    }
                }
            }
    2. 轉換器註冊
                //註冊我們自定義的轉換器
                //參數1 自定的轉換器
                //參數2 註冊轉換的類型
                ConvertUtils.register(new MyDateConverter(), Date.class);
完成如上兩步即可.

首先創建一個學生類

//javaBean
//1.要求爲屬性提供get/set方法任意之一
//2.需要有空參構造
//3.實現串行化接口(可選)
public class User {
    private String name;
    private String password;
    private int age;
    private Date hiredate;



    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", password=" + password + ", age=" + age
                + ", hiredate=" + hiredate + "]";
    }



}

一個小Demo

public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 創建User對象
        User u = new User();
        // 將表單參數封裝到User對象
        //參數1: 填寫User對象
        //參數2: 填寫需要封裝到User對象的參數Map
        try {
            //如果我們需要BeanUtils支持非8大基本數據類型.我們只要給BeanUtils添加類型轉換器即可
            //注意:註冊類型轉換器,必須寫在populate方法之前.
            ConvertUtils.register(new MyDateConverter(), Date.class);


            //BeanUtils在封裝時可以完成類型轉換. 自動轉換的範圍 只限於 8個基本數據類型
            BeanUtils.populate(u,request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        System.out.println(u);

    /*  //1 獲得參數
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        //2 封裝參數  User
        User u = new User();
        u.setName(name);
        u.setPassword(password);*/
        //-------------------------------------------------------
        //3 將User對象交給業務類處理
        //4 根據處理結果
            //成功=>在session加入成功標識,並重定向到成功頁面
            //失敗=>回到登錄頁面.提示錯誤信息



    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

JSTL標籤

    用於代替,簡化頁面中的java代碼.
    Java standard Tag Library   => java標準標籤庫
    apache組織提供一套已經開發好的標籤庫.
    這套標籤庫在javaee 5.0版本後已經納入標準.(使用不需要導包)
    該套標籤庫一共分爲4個庫:
    core:核心庫(用的最多的)****
    fmt:格式化庫(2個)
    xml:xml的操作相關(廢棄)
    sql: 與數據庫操作相關(廢棄)
  • core庫(重點:if choose foreach url):
    • 在頁面引入標籤庫
    • 2.使用.
      if標籤
<%-- <c:if>(常用) 判斷
                test="${num1 > num2 }"  填寫返回值爲boolean的表達式
                var="if"                鍵
                scope="page"            域  將判斷結果以var屬性值爲鍵放入該屬性指定的域中.

             --%>
            <%
                request.setAttribute("num1", 1000);
                request.setAttribute("num2", 10000);
             %>
             <c:if test="${num1 > num2 }" var="if" scope="page" >
                num1 厲害!
             </c:if>
             ${pageScope.if}
                <hr>

if else

<%--  判斷標籤.支持if else形式
                    <c:choose>
                    <c:when>
                        test: 填寫返回值爲boolean的表達式
                    <c:otherwise>
             --%>
             <c:choose>
                <c:when test="${num1 > num2 }">
                    num1 厲害!
                </c:when>
                <c:otherwise>
                    num2 厲害!
                </c:otherwise>
             </c:choose>
                 <hr>

遍歷標籤

            <%--  <c:forEach>(常用) 遍歷標籤 
                items="${requestScope.list}" 要便利的集合設置給該屬性
                 var="abc"      每次遍歷集合中元素 該屬性值作爲鍵放入page域
                  varStatus="st"    每次遍歷的狀態,會封裝成一個對象 以該屬性值爲鍵 放入page域
            數數的功能
                     begin="1"  從幾開始數  
                     end="100"  數到幾
                     step="1"   每次數幾個數
                     var="num"  將當前數的數以該屬性值作爲鍵放入page域
             --%>
             <%
                List list  = new ArrayList();
                list.add("tom");
                list.add("jerry");
                list.add("jack");
                list.add("rose");

                request.setAttribute("list", list);
              %>

              <table border="1">
                <tr>
                    <th>名稱</th>
                    <th>是否是集合中第一個元素</th>
                    <th>是否是集合中最後一個元素</th>
                    <th>顯示當前遍歷的索引</th>
                    <th>顯示當前遍歷的計數</th>
                </tr>
                <c:forEach items="${requestScope.list}" var="abc" varStatus="st" >
                    <tr id="${st.index%2==0?"even":"odd"}" >
                        <td>${pageScope.abc}</td>
                        <td>${pageScope.st.first}</td>
                        <td>${pageScope.st.last}</td>
                        <td>${pageScope.st.index}</td>
                        <td>${pageScope.st.count}</td>
                    </tr>       
                </c:forEach>
              </table>
             <hr>
             <!-- ----------------------------------------------------------------------- -->
            <c:forEach begin="1" end="100" step="1" var="num" >
                ${num}
            </c:forEach>  
fmt庫  格式化庫
    格式化日期
        <!--  
            格式化日期
            fmt:formatDate
         -->
        <fmt:formatDate value="<%=new Date() %>"  
            pattern="yyyy/MM/dd hh:mm:ss" var="date" scope="request" />

        ${requestScope.date}
    格式化數字
        <!--  
            格式化數字
            fmt:formatNumber
         -->
        <fmt:formatNumber  value="3.1415926" pattern="0000.00000000000" var="num1" scope="request" ></fmt:formatNumber>
        <fmt:formatNumber  value="3.1415926" pattern="####.###########" var="num2" scope="request" ></fmt:formatNumber>
        ${requestScope.num1}<br>
        ${requestScope.num2}<br>

JSP中的路徑總結問題

路徑總結
前提: 所有路徑都應以”/”開頭.

項目名:day10-jsp
資源名:AServlet

客戶端路徑 => 給瀏覽器用的路徑 => 填寫項目名稱
    <form action="/day10-jsp/AServlet" >
    <img src="/day10-jsp/AServlet" >
    <a href="/day10-jsp/AServlet" >
    response.sendRedirect("/day10-jsp/AServlet")
服務器端路徑 => 給服務器端使用的路徑 => 填寫項目下的路徑
     request.getRequestDispatcher("/AServlet")
     errorPage="/AServlet"
     <location>/AServlet</location>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章