通过重写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> "
+ "<button>上一页</button> ";
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+ " <button>下一页</button> "
+ "<button>末页</button> "
+ "</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>
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!