通过重写URL , 得到session

//1.    重写普通的网址  , 通常是超链接/表单中使用的网址
//url = response.encodeUrl(url);

//2.    重写重定向的网址, 这种网址用于重定向
url = response.encodeRedirectUrl(url);

EL表达式

作用:
    用于快速的从域对象中取出数据, 并将结果输出到网页.
    也可以用于一些运算, 运算的结果也会输出到网页
格式:
    ${表达式}
例如: 用于运算:
运算的结果:${ 1+2+3+4+5 }
用于取出域对象中的数据
访问存储数据的格式:
    ${存储的key}

访问存储的对象属性值:
    静态取值:${存储的key.属性名}
    静态取值:${存储的key["属性名"]}

    动态取值:${存储的key[属性名的key]}

访问集合/数组中的对象
    静态取值:${存储的key[下标].属性名}
    静态取值:${存储的key[下标]["属性名"]}

    动态取值:${存储的key[下标][属性名的key]}


有时我们需要使用变量的值. 可以将其先存储到域对象中, 再在el表达式中使用存储的key来操作
例如:
    <%
        User[] data = {new User("root1","123"),new User("root2","223"),new User("root3","323"),new User("root4","423"),};
        pageContext.setAttribute("users", data);
        pageContext.setAttribute("a","username");
    %>
    <%for(int i=0;i<data.length;i++){
        pageContext.setAttribute("index", i);
    %>
        静态取值:    ${ users[index].username }

    <%} %>

EL表达式 取出数据的流程.

取出的顺序:    范围从小到大

步骤:
    1.    先从pageContext中寻找数据是否存在
    2.    当pageContext中不存在此数据时 , 去request中寻找数据是否存在
    3.    当request中不存在此数据时, 去session中寻找数据是否存在
    4.    当session中不存在此数据时, 去application中寻找数据是否存在.
    5.    当application中不存在此数据时, 向网页输出 长度为0的字符串 (是"" , 不是null)

在上述的流程中, 一旦某一个步骤寻找到了数据 , 就会将数据输出到网页中, 且后续流程不再执行.

taglib指令

用于在JSP中引入标签库 .
语法格式:
    <%@ taglib prefix="" uri=""%>

属性:    prefix:    是引入的标签库的名称, 用于区分多个标签库.  在使用此标签库中的标签时, 需在标签前添加标签库名称:
        例如:    我们引入一个标签库, prefix=a ,则其中的标签在使用时:  <a:标签名></a:标签>

        uri:    用于匹配标签库. 在引入的tld文件中存在一个uri属性值,  我们uri属性与tld文件中的属性相同时, 则引入这个文件描述的库.

JSTL标签库

是一套JSP的标准标签库. 对JSP的标签进行了扩展. 
IF标签
作用:    用于判断元素是否显示

格式:
    <库的名称:if test="">></库的名称:if>

    test属性值:
        可以是boolean值, 或运算结果为boolean的el表达式 .

案例:
    <%-- <heiheihei:if test="true">
        从前有座山
    </heiheihei:if>
    <heiheihei:if test="false">
        山上有座庙
    </heiheihei:if> --%>

    <%
        pageContext.setAttribute("flag", false)    ;
    %>
    <heiheihei:if test="${ flag }">
        从前有座山
    </heiheihei:if>
    <%
        pageContext.setAttribute("flag",true);
    %>
    <heiheihei:if test="${ flag }">
        山上有座庙
    </heiheihei:if>
choose+when+otherwise标签
类似Java中的:    switch+case+default

这三个标签, 只有when是由test属性的 ,属性值是boolean值, 允许使用el表达式传入

作用:
    用于多分支 显示 .

案例:
    <%
        pageContext.setAttribute("flag",100);
    %>
    <heiheihei:choose>
        <heiheihei:when test="${ flag== 1}">
            拔毛烧开水 , 铁锅炖大鹅 
        </heiheihei:when>
        <heiheihei:when test="${ flag== 2}">
            英雄不问出处, 流氓不论岁数
        </heiheihei:when>
        <heiheihei:when test="${ flag== 3}">
            衣带渐宽终不悔
        </heiheihei:when>
        <heiheihei:when test="${ flag== 4}">
            好吃不过饺子 , 好闻不过包子
        </heiheihei:when>
        <heiheihei:otherwise>
            二十四桥明月夜 , 玉人何处教吹箫 .
        </heiheihei:otherwise>
    </heiheihei:choose>
forEach标签
用于遍历集合 或 数组元素

格式:
    <标签库名称:forEach items="" var="">

    </标签库名称:forEach>

属性:
    items    :    要遍历的数组 或 集合 必须通过el表达式传递
    var        :    在循环遍历时, 从数组或集合中取出的每一个元素会被存储到pageContext中, key就是var的值

案例:
    <%
        ArrayList<String> d = new ArrayList<>();
        d.add("拔毛烧开水 , 铁锅炖大鹅 ");
        d.add("英雄不问出处, 流氓不论岁数 ");
        d.add("衣带渐宽终不悔 ");
        d.add("好吃不过饺子 , 好闻不过包子 ");
        d.add("二十四桥明月夜 , 玉人何处教吹箫 . ");
        d.add("厚积薄发");
        d.add("日月之行若出其中");
        d.add("锄禾日当午 , 复方草珊瑚");
        //将集合存储到域对象pageContext中, 便于EL表达式取出使用
        pageContext.setAttribute("data",d);
    %>
    <heiheihei:forEach items="${ data }" var="x">
        <h4>${x }</h4>
    </heiheihei:forEach>

如何自定义标签库

自定义标签库的类:
    两种实现方式:
        1.    继承SimpleTagSupport 
        2.    继承TagSupport

SimpleTagSupport案例

public class MyTag1 extends SimpleTagSupport {
    private static ArrayList<String> d = new ArrayList<>();
    static {
        d.add("拔毛烧开水 , 铁锅炖大鹅 ");
        d.add("英雄不问出处, 流氓不论岁数 ");
        d.add("衣带渐宽终不悔 ");
        d.add("好吃不过饺子 , 好闻不过包子 ");
        d.add("二十四桥明月夜 , 玉人何处教吹箫 . ");
        d.add("厚积薄发");
        d.add("日月之行若出其中");
        d.add("锄禾日当午 , 复方草珊瑚");
        d.add("栽种思想,成就行为; 栽种行为,成就习惯; 栽种习惯,成就性格; 栽种性格,成就命运。 ——李嘉诚");
        d.add("他即使有千般不好,万般辜负,毕竟是我爱过的人。 ——辛夷坞");
        d.add("世界上最宽阔的是海洋,比海洋更宽阔的是天空,比天空更宽阔的是人的心灵。 ——雨果");
        d.add("一个民族有一群仰望星空的人,他们才有希望 ——黑格尔");
        d.add("乌云遮不住太阳,邪恶终将被打倒,真正的胜利永远属于正义。 ——海伦凯勒");
        d.add("当大浪退去时,我们才知道谁在裸泳 ——巴菲特");
        d.add("天若有情天亦老,人间正道是沧桑。 ——毛泽东");
        d.add("上善若水,水善利万物而不争。 ——老子");
        d.add("钉子有两个长处:一个是“挤”劲,一个是“钻”劲。我们在学习上,也要提倡这种“钉子”精神,善于挤和钻。 ——雷锋");
        d.add("与其用华丽的外衣装饰自己,不如用知识武装自己 ——马克思");
        d.add("向死而生的意义是:当你无限接近死亡,才能深切体会生的意义。 ——马丁·海德格尔");
        d.add("机会不会上门来找人,只有人去找机会。 ——狄更斯");
        d.add("“原则”是“偏见”的另一个名称。 ——马克·吐温");
        d.add("人生实如钟摆,在痛苦与倦怠之间摆动。 ——叔本华");
        d.add("对于世界而言,你是一个人;但是对于某个人,你是他的整个世界 ——狄更斯");
        d.add("在事情未成功之前,一切总看似不可能。 ——曼德拉");

    }
    /**
     * 当用户使用此标签
     */
    @Override
    public void doTag() throws JspException, IOException {
        //1.    先得到向网页输出数据的 输出流
        JspWriter jw = getJspContext().getOut();
        //2.    得到要输出的文本
        String text = getText();
        //3.    将文本输出
        jw.write(text);
        jw.flush();
    }

    public String getText() {
        //生成随机数, 从集合中随机取出一句名言
        Random r = new Random();
        int index = r.nextInt(d.size());
        return d.get(index);
    }
}

TagSupport 案例:

public class MyTag2 extends TagSupport {
    /*    @Override
        public int doAfterBody() throws JspException {
            // TODO Auto-generated method stub
            return super.doAfterBody();
        }

        @Override
        public int doEndTag() throws JspException {
            // TODO Auto-generated method stub
            return super.doEndTag();
        }*/
        /**
         * 总数量
         */
        private int length;
        /**
         * 一页显示的数量
         */
        private int pageSize;
        public int getLength() {
            return length;
        }
        public void setLength(int length) {
            this.length = length;
        }
        public int getPageSize() {
            return pageSize;
        }
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }

        @Override
        public int doStartTag() throws JspException {
            //总页数
            int num = length/pageSize + (length%pageSize==0?0:1);

            String html = "<div class=\"page\">"
                    + "<button>首页</button>&nbsp;"
                    + "<button>上一页</button>&nbsp;";
                if(num < 5) {
                    for(int i=0;i<num;i++) {
                        html = html+"<button>"+(i+1)+"</button>";
                    }
                }else {
                    html = html+"<button>1</button>";
                    html = html+"<button>2</button>";
                    html = html+"<button>3</button>";
                    html = html+" ... ";
                    html = html+"<button>"+num+"</button>";
                }
                    html = html+ "&nbsp;<button>下一页</button>&nbsp;"
                    + "<button>末页</button>&nbsp;"
                    + "</div>";
            JspWriter jw = pageContext.getOut();
            try {
                jw.write(html);
                jw.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return super.doStartTag();
        }
    }

xld文件:

xld文件存储在web-inf中!

案例:
    <?xml version="1.0" encoding="UTF-8" ?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">

        <!-- 标签库的描述 -->
        <description>
            这个标签库编写的目的是为了 , 不知道为啥.
        </description>
        <!-- 设置标签库名称 -->
        <display-name>xdl</display-name>
        <!-- 描述标签库的版本 -->
        <tlib-version>10.1</tlib-version>
          <!-- 描述标签库的短名称 -->
        <short-name>xdl</short-name>
        <!-- 用于匹配的uri -->
        <uri>http://www.dsb.com/heiheihei</uri>


        <!-- 向标签库中 添加一个标签 -->
        <tag>
            <!-- 对于标签的解释, 在使用时会提示给用户 -->
            <description>这个标签用于向网页中随机生成一条名言</description>
            <!-- 标签名称 -->
            <name>heihei</name>
            <!-- 标签的Java类的全名 -->
            <tag-class>cn.xdl.tag.MyTag1</tag-class>
            <!-- 标签是否允许包含内容
                可以设置的值 :    JSP , 表示允许存在JSP代码
                可以设置的值:    empty , 表示为空
             -->
            <body-content>empty</body-content>
        </tag>
        <!-- 向标签库中 添加一个标签 -->
        <tag>
            <!-- 对于标签的解释, 在使用时会提示给用户 -->
            <description>这个标签用于向网页中加入分页标签</description>
            <!-- 标签名称 -->
            <name>page</name>
            <!-- 标签的Java类的全名 -->
            <tag-class>cn.xdl.tag.MyTag2</tag-class>
            <!-- 标签是否允许包含内容
                可以设置的值 :    JSP , 表示允许存在JSP代码
                可以设置的值:    empty , 表示为空
             -->
            <body-content>empty</body-content>
            <!-- 描述属性 -->
            <attribute>
                <!-- 属性的描述 -->
                <description>这个属性用于设置总数量</description>
                <!-- 属性名 , 与类中的名称必须一致 -->
                <name>length</name>
                <!-- 属性是否必须传递 -->
                <required>true</required>
                <!-- 是否支持el表达式传递 -->
                <rtexprvalue>true</rtexprvalue>
                <!-- 属性的类型 -->
                <type>int</type>
            </attribute>
            <!-- 描述属性 -->
            <attribute>
                <!-- 属性的描述 -->
                <description>这个属性用于一页展示的数量</description>
                <!-- 属性名 , 与类中的名称必须一致 -->
                <name>pageSize</name>
                <!-- 属性是否必须传递 -->
                <required>true</required>
                <!-- 是否支持el表达式传递 -->
                <rtexprvalue>true</rtexprvalue>
                <!-- 属性的类型 -->
                <type>int</type>
            </attribute>
        </tag>

    </taglib>


11月      Java

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!