jsp

jsp介紹

概述
    JSP全名為Java Server Pages,Java服務頁面(提供Java服務的頁面)
    jsp頁面可以寫html代碼嗽冒,也可以寫Java代碼梳侨。
    其根本是一個簡化的Servlet設計。
    后綴名為(*.jsp)
    用JSP開發(fā)的Web應用是跨平臺的仿荆,既能在Linux下運行,也能在其他操作系統(tǒng)上運行坏平。
    JSP與Servlet一樣拢操,是在服務器端執(zhí)行的。
    通常返回給客戶端的就是一個HTML文本舶替,因此客戶端只要有瀏覽器就能瀏覽.
    JSP技術(shù)使用Java編程語言編寫類XML的tags和scriptlets令境,來封裝產(chǎn)生動態(tài)網(wǎng)頁的處理邏輯。
    網(wǎng)頁還能通過tags和scriptlets訪問存在于服務端的資源的應用邏輯顾瞪。
作用
    jsp用于開發(fā)動態(tài)資源的技術(shù)舔庶。
    servlet中向瀏覽器輸出html數(shù)據(jù)是非常不方便的返劲,所以就要使用jsp替代。
    jsp就是servlet+html
原理
    jsp就是一個servlet栖茉。
    JSP會被最終編譯成一個Servlet
    把項目運行到tomcat中后篮绿,訪問某個jsp。然后到tomcat的work/catalina/local/項目名稱/org/apache/jsp目錄下有對應的jsp生成的文件吕漂。
        _01_showtime_jsp.class 
        _01_showtime_jsp.java
運行過程
    1)瀏覽器發(fā)出請求訪問的jsp
    2)tomcat服務器會把jsp文件翻譯成一個Java文件亲配。
    3)tomcat服務器會把Java文件編譯成class文件。
    4)tomcat服務器創(chuàng)建jsp類對象
    5)調(diào)用jsp類的方法
注意:
    1)翻譯和編譯操作在第一次訪問的時候執(zhí)行和修改jsp后執(zhí)行惶凝。
問題
    1)jsp中的HTML代碼是如何輸出的吼虎?
        在_jspService()中執(zhí)行
        把jsp代碼中的所有內(nèi)容通過out.write()輸出到界面。
    2)Java代碼如何執(zhí)行的苍鲜?
        直接把jsp中的Java代碼拷貝到Java文件中思灰,也是在_jspService()中執(zhí)行
特點:
    簡單易用
    完全的面向?qū)ο?    具有平臺無關(guān)性且安全可靠
    主要面向因特網(wǎng)
一個JSP頁面可以被分為以下幾部份:
    靜態(tài)數(shù)據(jù),如HTML
    JSP指令混滔,如include指令
    JSP腳本元素和變量
    JSP動作
    用戶自定義標簽

jsp語法

jsp模板
    作用:就是jsp頁面寫的HTML代碼
jsp表達式
    作用:向瀏覽器輸出變量或表達式計算的結(jié)果
    語法:<%=變量或者表達式%>
    注意:
        1)原理使用out.print();輸出內(nèi)容
        2)不要以分號結(jié)尾
jsp腳本
    作用:執(zhí)行Java代碼
    語法:<%%>
    注意:
        原理是原封不動的拷貝到_jspService()方法中執(zhí)行
    使用:
        <%
        for(Student stu:students){
        %>
        <tr>
            <td><%=stu.getId()%></td>
            <td><%=stu.getName()%></td>
            <td><%=stu.getAge()%></td>
        </tr>
        <%}%>
    不足
        代碼結(jié)構(gòu)混亂
        腳本與HTML混合洒疚,容易出錯
        代碼不易于維護
jsp聲明
    作用:聲明成員變量和成員方法.可以在腳本和表達式中使用。
    語法:<%!  %>
    使用:
        <%! 
            String name="shuaige";
            public String getName(){return name;}
        %>
    注意:
        1)不能定義和翻譯同名類或者同名方法
        2)方法只能定義在聲明中坯屿,腳本不能定義方法的
        3)聲明定義的是全局變量油湖,腳本定義的是局部變量。
jsp注釋
    作用:注釋jsp頁面
    語法:<%-- jsp注釋 --%>
    注意:
        1)jsp注釋與HTML注釋要區(qū)分開來领跛。 html注釋會被翻譯和被執(zhí)行乏德。而jsp注釋不會被翻譯。
        2)jsp頁面盡量使用jsp注釋吠昭。

jsp指令

作用
    1)指令的作用就是告訴web服務器如何翻譯這個jsp頁面的內(nèi)容喊括。
    2)翻譯的過程起作用
語法
    <%@ 指令名稱 屬性1 屬性2 ... %>
三大指令
    page
        作用:通知web服務器如何翻譯一些常用的屬性
    include指令
        作用:包含其它頁面
        原理:被包含的jsp頁面不會被翻譯和被編譯
        注意:
            1)包含和被包含的頁面內(nèi)容先合并在一起,然后翻譯一個Java文件(先合并再翻譯)
            2)這種包含叫做靜態(tài)包含
    taglib
        作用:用于導入標簽庫指令矢棚。

EL表達式

作用:向瀏覽器輸出域?qū)ο笾械淖兞炕蛘弑磉_式結(jié)果郑什。用于替代jsp表達式
    可以用于獲取JavaBean的屬性
    能夠讀取集合類型對象中的元素
    運用運算符進行數(shù)據(jù)處理
    屏蔽常見的異常
    自動實現(xiàn)類型轉(zhuǎn)換
    
    頁面結(jié)構(gòu)清晰
    代碼可讀性高,易于維護
不足
    EL表達式無法實現(xiàn)邏輯控制
語法:${變量名|表達式}
EL表達式獲取不同類型數(shù)據(jù)
    取普通的字符串 ${username} 其實是替代 <%=pageContext.findAttribute("name")%>
    取對象的屬性數(shù)據(jù)${student.name}
    List集合或數(shù)組數(shù)據(jù)${list[0].name}/${arr[0]} 
    取Map集合數(shù)據(jù)${map['username']}
EL執(zhí)行表達式計算
    數(shù)學運算 +,-,*,/,%   ${a+b}
    邏輯運算 &&,||,!    ${true && false}
    比較運算 >,<,>=,<=,== ${a>b}
    三目運算 ?:  ${a>b?"是":"不是"} <input type="radio" name="gender" value="男" ${gender=="男"?"checked='checked'":""}/>
    為空判斷 ${name==null || name==""} 或者 ${empty name}
    改變優(yōu)先級 () 例如${3*(4+5)}
EL的內(nèi)置對象(11個)
    ${pageContext}  ==  <%=pageContext%> 
    ${pageScope.name}  ==  <%=pageContext.getAttribute("name",PAGE_SCOPE)%>
    ${requestScope.name}  ==  <%=pageContext.getAttribute("name",REQUEST_SCOPE)%>
    ${sessionScope.name}  ==  <%=pageContext.getAttribute("name",SESSION_SCOPE)%>
    ${applicationScope.name}  ==  <%=pageContext.getAttribute("name",APPLICATION_SCOPE)%>
    ${param['name']}  ==  <%=request.getParameter("name")%>
    ${paramValues['name']}  ==  <%=request.getParameterValues("name")%>
    ${header['user-agent']}  ==  <%=request.getHeader("user-agent")%>
    ${headerValues['user-agent']}  ==  <%=request.getHeaders("user-agent")%>
    ${cookie}  ==  <%=request.getCookies()%>
    ${initParam['aaa']}  ==  <%=application.getInitParameter("aaa")%>
作用域訪問對象
    pageScope   
        與頁面作用域(page)中的屬性相關(guān)聯(lián)的Map類幻妓,主要用于獲取頁面范圍內(nèi)的屬性值
    requestScope    
        與請求作用域(request)中的屬性相關(guān)聯(lián)的Map類蹦误,主要用于獲取請求范圍內(nèi)的屬性值
    sessionScope    
        與會話作用域(session)中的屬性相關(guān)聯(lián)的Map類劫拢,主要用于獲取會話范圍內(nèi)的屬性值
    applicationScope    
        與應用程序作用域(application)中的屬性相關(guān)聯(lián)的Map類肉津,主要用于獲取應用程序范圍內(nèi)的屬性值

自定義標簽

1)作用:用于執(zhí)行Java代碼,替代jsp腳本
2)需求:向瀏覽器輸出當前客戶端的ip地址
    jsp頁面腳本:Java代碼
        String ip = request.getRemoteHost();
        out.write(ip);
    自定義標簽
        1.創(chuàng)建一個類繼承SimpleTagSupport
        2.實現(xiàn)doTag方法
        3.在doTag方法中獲取到pageContext對象舱沧,就可以做任何事情了妹沙。
        4.在WEB-INF目錄下創(chuàng)建一個xxx.tld文件,到tomcat的webapps/examples目錄下搜索*tld
        5.說明
            tlib-version 標簽庫的版本
            jsp-version  jsp的版本
            short-name  引用時的簡單名稱:引用標簽庫的名稱熟吏,我這改為shuai距糖。在jsp頁面中的taglib的prefix中寫這個玄窝。
            uri  引用這個標簽庫的路徑名稱,隨便寫悍引。在jsp頁面中的taglib的uri中寫這個恩脂。
            tag 就是一個標簽
                name 標簽的名字,這里我使用hello趣斤。在jsp頁面上使用俩块。
                tag-class 標簽的全路徑
                body-content 標簽內(nèi)容格式
                    scriptless: 不能寫java代碼  (推薦)
                    empty:      當前標簽為空標簽  
                    tagdependent :  可以寫java代碼,但是不執(zhí)行(當前普通字符串執(zhí)行)
                attribute 屬性名稱 <shuai:hello num="值">
                    name 在標簽類中有一個此名稱的屬性浓领,注意:要有g(shù)et/set方法
                    required 是否必填
                    rtexprvalue 是否支持el表達式
        6.jsp頁面引用 <%@ taglib uri="http://it.shuai.com" prefix="shuai" %>
        7.使用標簽 <shuai:hello></shuai:hello>
    自定義標簽作用
        1.控制是否輸出標簽體內(nèi)容
            doTag中:
                JspFragment body = this.getJspBody();
                PageContext context = (PageContext)this.getJspContext();
                JspWriter out = context.getOut();
                body.invoke(out);//寫就可以顯示hello玉凯,如果不寫就不顯示。
                //默認代碼
                this.getJspBody().invoke(null);
            jsp頁面中
                <shuai:hello>
                    hello
                </shuai:hello>
        2.控制是否輸出標簽后面的內(nèi)容
            輸出:doTag中什么都不做
            不輸出:doTag中拋出一個異常联贩,那么jsp中這個標簽后的所有HTML內(nèi)容都不顯示
        3.控制重復輸出標簽體內(nèi)容
        4.修改標簽體內(nèi)容
            //1)獲取原來的標簽體內(nèi)容
            JspFragment jspBody = this.getJspBody();
            //2)創(chuàng)建一個臨時容器用于存放標簽體內(nèi)容
            StringWriter sw = new StringWriter();
            //3)暫時把標簽體內(nèi)容寫到一個臨時容器中
            jspBody.invoke(sw);
            //4)從臨時容器中取出內(nèi)容
            String content = sw.toString();
            //5)修改內(nèi)容
            content = content.toUpperCase();
            //6)手動寫出給瀏覽器
            this.getJspContext().getOut().write(content);
3)自定義標簽執(zhí)行過程
    1.tomcat服務器檢查指令
        <%@ taglib uri="http://it.shuai.com" prefix="shuai" %>
        查詢是否存在uri值為http://it.shuai.com的tld文件
        檢查prefix
    2.tomcat服務器查找hello這個標簽漫仆。到這個tld文件中找這個標簽。
    3.得到tag-class的內(nèi)容
    4.構(gòu)造com.shuai.tags.OneTag對象
    5.調(diào)用com.shuai.tags.OneTag對象的方法
4)SimpleTag接口:所有標簽處理類都必須實現(xiàn)此接口(這個是標準)
    生命周期方法
        setJspContext() 設置pageContext對象
        setParent() 設置父的標簽對象泪幌,如果沒有父標簽盲厌,則不會調(diào)用。
        setJspbody() 設置標簽體內(nèi)容祸泪,沒有標簽體內(nèi)容狸眼,則不調(diào)用此方法
        doTag() 執(zhí)行標簽方法
5)自定義foreach遍歷標簽
6)自定義if寫法
7)自定義choose:when+otherwise寫法
8)打jar包
    1.導出jar包,只留src下的tag標簽
    2.jar包中只留標簽目錄和META-INF目錄即可浴滴。其它的刪掉(META-INF就相當于WEB-INF目錄)
    3.把tld文件拷貝到jar包中的META-INF目錄下即可拓萌。
9)其它
    獲得標簽體的內(nèi)容
        <shuai:choose name="test">
            shuaige
        </shuai:choose>
        //獲取標簽內(nèi)容并且輸出
        JspFragment body = getJspBody();
        StringWriter sw = new StringWriter();
        body.invoke(sw);
        System.out.println(sw.toString());
        JspWriter out = this.getJspContext().getOut();
        out.write(sw.toString());
    輸出標簽內(nèi)容
        <shuai:choose name="test">
            shuaige
        </shuai:choose>
        JspFragment body = getJspBody();
        body.invoke(null);
        或者
        JspFragment body = getJspBody();
        JspWriter out = this.getJspContext().getOut();
        body.invoke(out);
    添加標簽屬性
        <shuai:choose name="test">
            shuaige
        </shuai:choose>
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        <tag>
            <name>choose</name>
            <tag-class>com.shuai.tag.OneTag</tag-class>
            <body-content>scriptless</body-content>
            <attribute>
                <name>name</name>
                <required>true</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>
        </tag>
獲取上下文
    JspContext context = this.getJspContext();

jsp指令 - page

通過屬性定義了JSP的特性,實現(xiàn)與JSP容器的通信
語法:
    <%@ page 屬性="值"%>
詳細介紹:
    language="java" 
        語言是Java語言
    contentType="text/html; charset=UTF-8"  
        指定當前JSP頁面的MIME類型和字符編碼
        翻譯成response.setContentType(""); 通知瀏覽器的內(nèi)容和編碼
        注意:contentType的默認值和pageEncoding的值保存一致升略。
    pageEncoding="UTF-8" 
        指定當前頁面的編碼格式,服務器用什么編碼翻譯成Java文件
    buffer="8kb" 
        指定out對象使用緩沖區(qū)的大小微王,默認8kb
        有了緩存區(qū)之后,內(nèi)容滿足以下條件才會寫到瀏覽器:
            1)緩存區(qū)滿了品嚣。
            2)jsp執(zhí)行完畢
            3)手動刷新緩存區(qū)
            4)設置緩存區(qū)為0(也就是沒有緩存區(qū))
            注意:只有out才有緩存區(qū)炕倘,response.getWriter().write()沒有緩存
    autoFlush="true" 
        控制out對象的 緩存區(qū)
    errorPage="error.jsp" 
        指定當JSP頁面發(fā)生異常時需要轉(zhuǎn)向的錯誤處理頁面
    isErrorPage="true" 
        指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面
        當前jsp頁面就是錯誤頁面,
        只有設置了此屬性翰撑,才能使用exception罩旋。否則無法使用。
        錯誤頁面顯示錯誤信息<%=exception.getMessage()%>
    extends="javax.servlet.http.HttpServlet" 
        指定當前jsp頁面的servlet從哪一個類繼承
    import="java.util.ArrayList" 
        導入要使用的Java類眶诈。
        在jsp導入包涨醋。
        默認導入java.lang.* 。
        多個包用逗號,隔開
    info="onejsp" 
        定義JSP頁面的描述信息
    isThreadSafe="true" 
        指定對JSP頁面的訪問是否為線程安全逝撬,默認是true
    session="true" 
        指定JSP頁面是否使用session浴骂,默認是true
        是否打開httpSession功能。
    isELIgnored="false" 
        指定是否執(zhí)行EL表達式,默認是false
        是否忽略EL表達式宪潮,false不忽略(默認)溯警,true忽略
具體使用:
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page buffer="8kb" autoFlush="true"%>
    <%@ page errorPage="error.jsp" isErrorPage="true"%>
    <%@ page extends="javax.servlet.http.HttpServlet"%>
    <%@ page import="java.util.ArrayList"%>
    <%@ page info="onejsp"%>
    <%@ page isThreadSafe="true"%>
    <%@ page session="true"%>
    <%@ page isELIgnored="false"%>

jsp指令 - include

語法:
    <%@ include file="界面" %>
詳細介紹:
    file="common.jsp" 指定包含其他文件,相對路徑或者絕對路徑
具體使用:
    <%@ include file="common.jsp" %>
注意:
    file="/common.jsp" 路徑是WebContent下 
    file="common.jsp" 路徑是WebContent下

jsp指令 - taglib

概述
    引入標簽庫的定義
    指令引入一個自定義標簽集合的定義趣苏,包括庫路徑、自定義標簽
語法:
    <%@ taglib 屬性="值" %>
詳細介紹:
    uri="http://java.sun.com/jsp/jstl/core"  標簽庫的描述URI
    prefix="c" 指定一個前綴prefix
    tagdir="/WEB-INF/tags" 其中的tags是個目錄梯轻,里面有若干tag文件
具體使用:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib prefix="sys" tagdir="/WEB-INF/tags" %>
注意:
    一般我們只是使用 uri + prefix
    tagdir 是自定義標簽庫

jsp中內(nèi)置的Java對象

jsp頁面在執(zhí)行過程中食磕,為開發(fā)者提前創(chuàng)建好了一些開發(fā)中常用的對象。
    config
        ServletConfig類的實例喳挑。
        這個對象允許開發(fā)者訪問Servlet或者JSP引擎的初始化參數(shù)芬为,比如文件路徑等。
    out 
        JSPWriter用來寫入響應流的數(shù)據(jù)蟀悦,JspWriter類的實例媚朦,用于把結(jié)果輸出至網(wǎng)頁上
        包含了大部分java.io.PrintWriter類中的方法
    page
        servlet自身,類似于Java類中的this關(guān)鍵字
    pageContext
        一個PageContext實例包括和整個頁面相聯(lián)系的數(shù)據(jù)日戈,一個給定的HTML頁面可以在多個JSP之間傳遞询张。
        PageContext類的實例,提供對JSP頁面所有對象以及命名空間的訪問浙炼。
        主要用來訪問頁面信息份氧,同時過濾掉大部分實現(xiàn)細節(jié)。
        存儲了request對象和response對象的引用弯屈。
        application對象蜗帜,config對象,session對象资厉,out對象可以通過訪問這個對象的屬性來導出厅缺。
        包含了傳給JSP頁面的指令信息,包括緩存信息宴偿,ErrorPage URL,頁面scope等湘捎。
        定義了一些字段,包括PAGE_SCOPE窄刘,REQUEST_SCOPE窥妇,SESSION_SCOPE, APPLICATION_SCOPE娩践。
        它也提供了40余種方法活翩,有一半繼承自javax.servlet.jsp.JspContext 類。
        其中一個重要的方法就是removeArribute()翻伺,它可接受一個或兩個參數(shù)材泄。
        作用:
            1)可以獲取其它8個內(nèi)置對象
                自定義標簽時經(jīng)常用到這個。
            2)是一個域?qū)ο?作用范圍是當前的jsp范圍
                可以把數(shù)據(jù)保存在jsp頁面范圍內(nèi)
                可以把數(shù)據(jù)保存在其它三個域?qū)ο?setAttribute(key,value,域常量);getAttribute(key,域常量);
                    域常量:PAGE_SCOPE,REQUEST_SCOPTE,SESSION_SCOPE,APPLICATION_SCOPTE
            3)可以從4個域自動搜索數(shù)據(jù)findAttribute(key);
                搜索屬性:從小到大:page-->request-->session-->application 找不到就是空
    request
        HTTP request對象穆趴,HttpServletRequest類的實例脸爱。
        是javax.servlet.http.HttpServletRequest 類的實例遇汞。
        每當客戶端請求一個JSP頁面時未妹,JSP引擎就會制造一個新的request對象來代表這個請求簿废。
        提供了一系列方法來獲取HTTP頭信息,cookies络它,HTTP方法等等族檬。
    response
        HTTP response對象,HttpServletResponse類的實例化戳。
        是javax.servlet.http.HttpServletResponse類的實例单料。
        當服務器創(chuàng)建request對象時會同時創(chuàng)建用于響應這個客戶端的response對象。
        定義了處理HTTP頭模塊的接口点楼。通過這個對象扫尖,開發(fā)者們可以添加新的cookies,時間戳掠廓,HTTP狀態(tài)碼等等换怖。
    session 
        HttpSession類的實例,用于保持客戶端與服務器連接的對象
        用來跟蹤在各個客戶端請求間的會話蟀瞧。
    application 
        ServletContext類的實例沉颂,與應用上下文有關(guān)。
        這個對象在JSP頁面的整個生命周期中都代表著這個JSP頁面悦污。
        這個對象在JSP頁面初始化時被創(chuàng)建铸屉,隨著jspDestroy()方法的調(diào)用而被移除。
        通過向application中添加屬性切端,則所有組成您web應用的JSP文件都能訪問到這些屬性彻坛。
    exception    
        Throwable  異常對象

內(nèi)置對象 - out對象

說明:
    混合寫Java代碼
語法:
    <% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
    
具體使用:
    <%
        out.println("輸出到界面<br/>");
        out.print("aaa<br/>");
        out.print("bbb<br/>");
        out.print("ccc<br/>");
    %>
注意:
    1.輸出亂碼問題:
        1.1頁面必須要引入
            <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        1.2jsp的文件編碼要是UTF-8
    2.println與print方法
        均不能使頁面換行,必須添加<br/>

內(nèi)置對象 - request對象

說明:
    混合寫Java代碼
語法:
    <% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
    
具體使用:
    <%
        //獲取用戶提交的數(shù)據(jù)
        //返回指定參數(shù)名稱數(shù)值,返回類型為String類型踏枣,若無對應名稱的參數(shù)小压,返回NULL
        String name = request.getParameter("name");
        //返回具有相同參數(shù)名稱的數(shù)值集合,返回類型為String類型的數(shù)組
        String[] names = request.getParameterValues("name");
        //設置請求時的編碼
        request.setCharacterEncoding("UTF-8");
        //通過屬性存儲/獲取值
        //使用屬性存取數(shù)據(jù)時椰于,要確保數(shù)據(jù)在保存時必須是Object類型怠益,而在取出時還要轉(zhuǎn)換成原先自己的類型
        //通過屬性存儲值
        request.setAttribute("desc", "zhangsan");
        //通過屬性獲取值
        String desc = (String)request.getAttribute("desc");
        //轉(zhuǎn)發(fā)
        request.getRequestDispatcher("info.jsp").forward(request, response);
    %>

內(nèi)置對象 - response對象

說明:
    混合寫Java代碼
語法:
    <% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
    對請求作出響應并返回結(jié)果
具體使用:
    <%
        //設置響應時的編碼
        response.setCharacterEncoding("UTF-8");
        //重定向
        response.sendRedirect("info.jsp");
    %>
注意:
    重定向是對請求的重新定位,所以重定向后瘾婿,原請求中的數(shù)據(jù)將會丟失

內(nèi)置對象 - session對象

說明:
    混合寫Java代碼
語法:
    <% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
    用于存儲與用戶相關(guān)的會話信息
    setAttribute(String key,Object obj) 以key/value形式保存數(shù)據(jù)
    getAttribute(String key)    通過key獲取數(shù)據(jù)
    getId() 獲取sessionid
    invalidate()    設置session對象失效
    setMaxInactiveInterval(int interval)    設置session對象有效期
    removeAttribute(String key) 移除session中的屬性
具體使用:
    <%
        //存儲/獲取數(shù)據(jù)
        //存儲數(shù)據(jù)
        session.setAttribute("name", "zhangsan");
        //獲取數(shù)據(jù)
        String name = (String)session.getAttribute("name");
    %>

cookie

說明:
    由服務器端生成蜻牢,發(fā)送到客戶端保存的一段文本信息
語法:
    <% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
    使用Cookie記錄上網(wǎng)瀏覽的信息
    在頁面請求時,可以帶著cookie到后臺偏陪。
    可以在響應頁面時抢呆,返回設置cookie九妈。
    Cookie的常用方法
        setMaxAge(int expiry)   設置Cookie的有效期榜田,以秒為單位
        setValue(String value)  創(chuàng)建Cookie后益涧,為Cookie賦值
        getName()   獲得Cookie的名稱
        getValue()  獲得Cookie的值
        getMaxAge() 獲取Cookie的有效期尚粘,以秒為單位
具體使用:
    <%
        //創(chuàng)建Cookie
        Cookie cookie = new Cookie("name","zhangsan");
        //寫入Cookie
        response.addCookie(cookie);
        //讀取 Cookie
        Cookie[] cookies = request.getCookies();
        for(int i = 0;i<cookies.length;i++){
            //獲取指定的cookie
            Cookie cookie1 = cookies[i];
            //獲取cookie的值
            String value = cookie1.getValue();
        }
    %>

jsp內(nèi)置標簽

特點
    是jsp語法內(nèi)設計的一些標簽锭吨,使用這些內(nèi)置標簽不需要導入tld或者jar包
jsp標簽優(yōu)點
    封裝頁面顯示功能
    頁面代碼簡介
    提高可讀性,易于維護
標簽
    jsp:useBean
        會默認創(chuàng)建對象
        id 對象名
        class 引用類的地址,要全路徑
        scope 作用域
        beanName
        type
    jsp:setProperty 
        設置對象屬性的值
        name 對象名
        property 對象的屬性名
        value 屬性值
    jsp:getProperty
        獲取對象屬性的值
        name 對象名
        property 對象的屬性名
    jsp:include
        動態(tài)頁面包含
        使用頁面包含技術(shù)實現(xiàn)最大限度的頁面復用
        分類
            靜態(tài)頁面包含
                先將頁面包含雳锋,后執(zhí)行頁面代碼颂砸,即將一個頁面的代碼復制到另一個頁面中
                被包含的頁面內(nèi)容發(fā)生變化時,包含頁面將會被重新編譯
            動態(tài)頁面包含
                先執(zhí)行頁面代碼谣沸,后將頁面包含刷钢,即將一個頁面的運行結(jié)果包含到另一個頁面中
                被包含頁面內(nèi)容發(fā)生變化時,包含頁面不會重新編譯
        靜態(tài)包含
            <%@include file="URL "%>
    jsp:forward 
        轉(zhuǎn)發(fā)
        代碼
            <%-- 服務器路徑 --%>
            <jsp:forward page="info.jsp">
                <%-- 轉(zhuǎn)發(fā)時帶路徑 --%>
                <jsp:param value="zhangsan" name="name"/>
            </jsp:forward>
    jsp:param 
        參數(shù)標簽
    jsp:include 
        被包含的頁面將會被翻譯
        代碼
            <%-- 服務器路徑 乳附, 會把兩個頁面合并在一起 --%>
            <jsp:include page="header.jsp"></jsp:include>
        <%@ include %> 包含頁面内地,被包含的標簽不會被翻譯
            <%@ include %>指令包含是先合并再翻譯,叫靜態(tài)包含赋除。
            jsp:include標簽包含是先翻譯后合并阱缓,叫動態(tài)包含。
            <%@ include %>指令包含可以使用被包含頁面的變量(數(shù)據(jù))举农。
            jsp:include標簽包含不可以使用被包含頁面的變量(數(shù)據(jù))茬祷,建議使用靜態(tài)包含。

jstl標簽庫

說明
    java standard tag library
    JSP標準標簽庫
    實現(xiàn)JSP頁面中的邏輯控制
特點:
    需要導入標簽庫
分類:
    1.核心標簽庫:core c
    2.國際化/格式標簽庫 format fmt
    3.EL函數(shù)庫 fn并蝗,在jsp頁面上簡化String的操作
    4.SQL標簽庫 sql - 不用
    5.XML標簽庫 xml x - 不用
核心標簽庫:core c
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    c:set
        保存數(shù)據(jù)到域?qū)ο笾?        <c:set var="變量名" value="變量值" scope="域"></c:set>
        <c:set value= "變量值" target="對象名稱" property="對象的屬性名稱" />
        <c:set var="name" value="shuaige" scope="request" property="user"></c:set>
    c:out
        從域?qū)ο笾腥〕鰯?shù)據(jù)
        <c:out value="${el表達式 }" default="默認值" escapeXml="默認值是html標簽時是否轉(zhuǎn)義"></c:out>
        <c:out value="name" default="shuaige1" escapeXml="true"></c:out>
    c:if
        單條件判斷
        <c:if test="條件" scope="判斷結(jié)果存放的作用域">條件為true時顯示</c:if>
        <c:if test="${1==1}">
            <p>如果條件成立顯示內(nèi)容</p>
        </c:if>
    c:choose/c:when/c:otherwise
        多條件判斷
        <c:choose>
            <c:when test="條件">條件為true時顯示</c:when>
            <c:when test="條件">條件為true時顯示</c:when>
            <c:otherwise>上邊的條件都不成立時顯示</c:otherwise>
        </c:choose>
        <%
            request.setAttribute("score", 90);
        %>
        <c:choose>
            <c:when test="${score >=90 }">條件成立大于90</c:when>
            <c:when test="${score >=80 }">條件成立大于80</c:when>
            <c:otherwise>以上條件不成立小于80</c:otherwise>
        </c:choose>
    c:forEach
        遍歷集合或數(shù)組
        <c:forEach items="需要遍歷的數(shù)據(jù)" var="遍歷時祭犯,每個對象的名稱" begin="從哪個元素開始,從0開始" end="到哪個元素結(jié)束" step="步長滚停,就是條件增加多少" varStatus="把當前元素的狀態(tài)信息封裝到次元素vs中沃粗,第幾個元素count ${vs.count }"></c:forEach>
        <c:forEach items="${list }" var="student" begin="0" end="10" step="1" varStatus="vs">
            ${vs.count } - ${student.name }
        </c:forEach>
    c:forTokens
        遍歷字符串
        <c:forTokens items="要處理的字符串" delims="split的符號" var="分隔后每個元素的名稱"></c:forTokens>
        <c:forTokens items="${strs }" delims="-" var="str" begin="0" end="10" step="1" varStatus="vs">
            ${vs.count } - ${str }
        </c:forTokens>
    c:url
        簡化URI的編寫
        <c:url value="url路徑,服務器路徑"></c:url>
    c:redirect
        重定向
        <c:redirect url="重定向路徑"></c:redirect>
    c:param
        參數(shù)標簽
        <c:param name="參數(shù)名稱" value="參數(shù)的值"></c:param>
    c:import
        導入標簽
        <c:import url="導入資源的路徑"></c:import>
    c:remove
    c:catch
EL函數(shù)庫 fn 
    用來處理字符串
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    toUpperCase
        小寫轉(zhuǎn)大寫
        ${fn:toUpperCase(str) }
        <%
            request.setAttribute("name", "zhangsan");
        %>
        ${fn:toUpperCase(name) }
    toLowerCase
        大寫轉(zhuǎn)小寫
        ${fn:toLowerCase(str) }
        <%
            request.setAttribute("name", "SHUAIGE");
        %>
        ${fn:toLowerCase(name) }
    length
        字符串長度
        ${fn:length(str)}
        <%
            request.setAttribute("name","shuaige");
        %>
        ${fn:length(name) }
    contains
        包含某個字符串
        <%
            request.setAttribute("name", "shuaige");
        %>
        ${fn:contains(name,'ge') }
        ${fn:contains(name,"ge") }
    containsIgnoreCase
        是否包含(忽略大小寫)
        <%
            request.setAttribute("name", "shuaige");
        %>
        ${fn:containsIgnoreCase(name,'Ge') }
        ${fn:containsIgnoreCase(name,"Ge") }
    endsWith
        以什么結(jié)尾
        <%
            request.setAttribute("name", "shuaige.txt");
        %>
        ${fn:endsWith(name,'.txt') } 
    escapeXml
        html標簽是否生效
        <%
            request.setAttribute("name","<p>shuaige</p>");
        %>
        ${name }<br/>
        ${fn:escapeXml(name) }
    indexOf
        查找某個字符第一次發(fā)現(xiàn)的下標
        <%
            request.setAttribute("name", "shuaige.txt");
        %>
        ${fn:indexOf(name,'.') }
    join
        把數(shù)組以某個分隔符拼接成字符串
        <%
            String[] str = {"aaa","bbb","ccc"};
            request.setAttribute("str",str);
        %>
        ${fn:join(str,'-') }
    replace
        替換
        <%
            request.setAttribute("name","shuai;ge");
        %>
        ${fn:replace(name,";","") }
    split
        以某個分割符分割
        <%
            request.setAttribute("name","shuai;ge");
        %>
        <c:forEach items="${fn:split(name,';')}" var="str">
            <p>${str }</p>
        </c:forEach>
    startsWith
        以某個字符開始
        <%
            request.setAttribute("name","shuaige");
        %>
        ${fn:startsWith(name,"shuai")}
        ${fn:startsWith(name,'shuai')}
    substring
        截取
        <%
            request.setAttribute("name","shuaige");
        %>
        ${fn:substring(name,0,5) }
    substringAfter
        截取
        <%
            request.setAttribute("name","shuaige");
        %>
        ${fn:substringAfter(name,"shuai") }
    substringBefore
        截取
        <%
            request.setAttribute("name","shuaige");
        %>
        ${fn:substringBefore(name,"ge") }
    trim
        去掉前后空格
        <%
            request.setAttribute("name", "  shuaige  ");
        %>
        ${fn:trim(name) }
fmt標簽
    格式化
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    fmt:formatDate
        實現(xiàn)格式化的日期和時間顯示
        <fmt:formatDate value="date" pattern="顯示格式"/>
        <fmt:formatDate  value= " date" pattern="yyyy-MM-dd HH:mm:ss"/>
    fmt:bundle
    fmt:formatNumber
    fmt:message
    fmt:param
    fmt:parseDate
    fmt:parseNumber
    fmt:requestEncoding
    fmt:setBundle
    fmt:setLocale
    fmt:setTimeZone
    fmt:timeZone

通過設置頁面的基路徑避免使用相對路徑

在頁面上取得項目路徑:
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+
    request.getServerName()+":"+
    request.getServerPort()+path+"/";
    %>
在<head>中添加:
    <base href="<%=basePath%>">

國際化

src目錄下
    message_en_US.properties
    message_zh_CN.properties
    message_en_GB.properties
測試讀取
    ResourceBundle bundle = ResourceBundle.getBundle("message", Locale.CHINA);
    String username = bundle.getString("username");
    String password = bundle.getString("password");
項目讀取
    ResourceBundle bundle = ResourceBundle.getBundle("message", Locale.getDefault());
    String username = bundle.getString("username");
    String password = bundle.getString("password");
jsp頁面使用
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    <fmt:setBundle basename="message"/><%--綁定資源包 --%>
    <fmt:message key="username"/><%--讀取資源包中的key --%>
    

日期數(shù)字格式化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末键畴,一起剝皮案震驚了整個濱河市最盅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌起惕,老刑警劉巖涡贱,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惹想,居然都是意外死亡问词,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門嘀粱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來激挪,“玉大人,你說我怎么就攤上這事锋叨÷⒎郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵娃磺,是天一觀的道長薄湿。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么豺瘤? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任吆倦,我火速辦了婚禮,結(jié)果婚禮上炉奴,老公的妹妹穿的比我還像新娘逼庞。我一直安慰自己蛇更,他們只是感情好瞻赶,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著派任,像睡著了一般砸逊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掌逛,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天师逸,我揣著相機與錄音,去河邊找鬼豆混。 笑死篓像,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的皿伺。 我是一名探鬼主播员辩,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸵鸥!你這毒婦竟也來了奠滑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤妒穴,失蹤者是張志新(化名)和其女友劉穎宋税,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讼油,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡杰赛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矮台。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淆攻。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘿架,靈堂內(nèi)的尸體忽然破棺而出瓶珊,到底是詐尸還是另有隱情,我是刑警寧澤耸彪,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布伞芹,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唱较。R本人自食惡果不足惜扎唾,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望南缓。 院中可真熱鬧胸遇,春花似錦、人聲如沸汉形。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽概疆。三九已至逗威,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岔冀,已是汗流浹背凯旭。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留使套,地道東北人罐呼。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像侦高,于是被迫代替她去往敵國和親嫉柴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一矫膨、JSP基礎 1.1什么是JSP JSP(Java ServerPage)是Java服務器端動態(tài)頁面技術(shù)差凹。是su...
    晨星資源閱讀 1,148評論 0 6
  • JSP 基本結(jié)構(gòu)JSP 頁面組成:模板文本(HTML,XML,純文本),JSP 元素侧馅;JSP 元素:腳本元素危尿,指令...
    jslancer閱讀 843評論 0 11
  • 1.什么是JSP (1)jsp全稱是Java Server Pages,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,651評論 5 99
  • 1.學習內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對象&標簽介紹 EL表達式&EL的內(nèi)置對象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,136評論 1 18
  • 一馁痴、jsp定義及作用 JSP技術(shù)使用Java編程語言編寫類XML的tags和scriptlets谊娇,來封裝產(chǎn)生動態(tài)網(wǎng)...
    yzw12138閱讀 1,230評論 0 0