# jsp是什么?
sun公司制定的一种服务器端的动态页面技术规范。
注:
因为虽然使用servlet也可以生成动态页面,但是过于繁琐(需要使用out.println语句
来输出),并且不利于页面的维护(修改页面,就需要修改java代码),所以sun才
推出了jsp规范。
jsp是一个以.jsp为后缀的文件(主要内容是html和少量的java代码),容器会将这个
文件转换成一个对应的servlet,然后执行。也就是说,jsp的本质就是一个servlet。
# 如何写一个jsp文件?
# step1.添加一个以.jsp为后缀的文件。
# step2.在该文件里面,可以添加如下内容:
# 1)html(css,js)
直接写即可。
# 2)Java代码
第一种 :java代码片段 <% java代码 %>
第二种:jsp表达式
<%= java表达式 %>
# 3)隐含对象?
什么是隐含对象?
在jsp文件里面,可以直接使用的对象,比如out、request、response。
为什么可以直接使用这些隐含对象?
因为容器会自动添加获得这些对象的代码。
# 4)指令
什么是指令?
可以通过指令告诉容器,在将jsp转换成servlet时,做一些额外的处理,比如导包。
指令的语法(指令名一共有三种)
<%@ 指令名 属性=值 属性=值%>
注:
如果有多个属性,使用空格隔开。
page指令
import属性 指定要导的包名,如果有多个包,用“,”号隔开。
比如:
<%@ page import="java.util.*,java.text.*'' %>
contentTYpe属性:设置response.setContentType的内容。
pageEncoding属性:告诉容器,在读取jsp文件的内容时,使用指定的字符集来解码。
# jsp是如何执行的?
# 阶段一 容器将jsp转换成一个servlet。
1)html(css,js) ---->service方法里面,使用out.write输出。
2)<% %> ----->在service方法里面,照搬。
3)<%= %> ----->在service方法里面,使用out.print输出。
# 阶段二 容器调用servlet。
# jsp标签和el表达式
# jsp标签是什么
jsp标签是sun公司推出的一个规范,目的是为了替换jsp中的java代码。
jsp标签语法类似于html标签(比如说,有开始标记、结束标记、有一些属性、
有标签体)。容器遇到jsp标签之后,会调用jsp标签对应的jsp标签中的
java代码。
使用jsp标签,好处是,jsp文件便于美工去修改,另外,也便于代码的复用
(jsp标签可以重复使用).
# el表达式是什么?
一套简单的运算规则,用于给jsp标签的属性赋值,也可以脱离jsp标签,直接使用。
# el表达式的使用
1)读取bean的属性值
注(了解):
javabean是一个规范,满足如下几个条件,就可以称之为一个javabean.
public 类
public 构造器
实现Serializable接口
实现一些属性及对应的get/set方法
a.方式一
${user.username}
a1.执行过程:容器依次从pageContext-->request-->session
-->application中查找绑定名为"user"的对象(getAttribute),
找到之后,调用对象的“getUsername“的方法,然后输出。
a2.优点:
会将null转换成空""输出。
如果依据绑定名找不到对应的对象,不会报空指针异常。
a3.指定查找范围:
可以使用pageScope、requestScope、sessionScope、
applicationScope来指定查找范围。
b.方式二
${user['username']}
a1.执行过程同上。
a2.[]里面可以出现绑定名(不懂就去看代码在day11.e1.jsp)
a3.[]里面可以出现从0开始的下标,用来访问数组中的某个元素。
2)进行一些简单的运算。(e2.jsp)
a.算术运算:
+,-,*,/,%
注意,"+"只能求和。
b.关系运算:
>,>=,<,<=,==,!=
c.逻辑运算:
&&,||,!
d.empty运算:
empty
集合是否为空:${empty list1 }
是否是一个空字符串:${empty s2 }
null值:${empty null } //true
3)读取请求参数值(e3.jsp)
${param.username}等价于request.getParameter("username");
${paramValues.city}等价于request.getParameterValues("city");
# jstl标签的使用
1)jstl是什么?(jsp standard tag lib)
注:
apache开发的一套jsp标签,后来捐献给sun,sun将其命名为jstl。
2)jstl如何使用?
step1.导包。
jstl.jar
step2.使用taglib指令导入要使用的jsp标签。
<%@ taglib uri="" prefix=""%>
uri是要导入的jsp标签的命名空间。
注:
命名空间是为了区分同名的元素而在元素前添加的一段说明,
通常是一个域名(为了避免命名空间也冲突)。
prefix是命名空间的别名。
3)if 标签
a.用法
<c:if test="">
</c:if>
b.当test属性值为true时,容器执行标签体的内容。
c.test属性值可以使用el表达式进行计算。
4)choose标签 (choose.jsp)
a. 用法
<c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
b. when可以出现一次或者多次,表示一个分支(相当于一个if语句),
当test属性值为true时,执行标签体的内容。test属性值可以使用el表达式
来进行计算。
c. otherwise可以出现0次或者1次,表示例外(相当于最后那个else语句)
5)forEach标签 (forEach.jsp)
a.用法
<c:forEach items="" var="" varStatus="">
</c:forEach>
b. items属性用来指定要遍历的集合或者数组,可以使用el表达式来赋值。
c. var属性用来指定绑订名。
注:
绑订范围固定是pageContext,该标签每次从集合或者数组中取一
个元素,然后将其绑定到pageContext上。
d.vatStatus属性用来指定绑定名。
注:
绑定范围固定是pageContext,绑定值是一个特俗的对象,
该对象由标签创建,用来获得当前遍历的状态。
该对象提供了一下方法,用来获得当前遍历的状态:
getIndex():获得当前正在被遍历的元素的下标(从0开始)。
getCount():获得当前正在被遍历的元素的序号(从1开始)。
# 自定义标签(mytag.tld)
step1.写一个java类,继承SimpleTagSupport类。
注:
复杂标签技术(old)
简单标签技术(new),继承SimpleTagSupport类开发的
标签属于简单标签技术。
step2. override doTag方法,在该方法里面,编写处理逻辑。
标签类:
1.继承SimpleTagSupport类
2.override doTag方法(实现处理逻辑)。
3.标签有哪些属性,标签类也得有对应的属性,属性名
要相同,类型要匹配,并且有对应的set方法。
step3.在.tld文件里面描述该标签。
# 标签的执行过程
step1.容器依据标签的命名空间找到标签的描述文件(.tld文件),然后
依据标签名找到标签类,接下来将标签类实例化。
step2.容器将标签的属性值赋值给标签对象(通过调用标签对应的
set方法,如果标签的属性值需要计算,容器会事先计算)。
step3.容器调用标签的doTag方法。
# 在java类中如何获得jsp隐含对象
通过继承自SimpleTagSupport类的方法来获得pageContext. 该对象提供了获得其它所有隐含对象的方法。
PageContext pctx = (PageContext)getJspContext();
JspWriter out = pctx.getOut();
# 如何在.tld中描述标签
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.1</tlib-version>
<short-name>d</short-name>
<uri>http://tedu.cn/mytag</uri>
<tag>
<name>hello</name>
<tag-class>tag.HelloTag</tag-class>
<!--
body-content用来设置该标签是否有标签体,如果有,
标签体的内容容许出现哪些内容。
empty:该标签没有标签体。
scriptless:该标签有标签体,但是标签体的内容不能够出现
Java代码(<% %>,<%= %>,<%! %>)。
JSP:该标签有标签体,并且标签体的内容可以是java代码。
但是,只有负责标签技术才支持该值。
-->
<body-content>empty</body-content>
<attribute>
<name>msg</name>
<!--
如果值为true,表示该属性是必须的,
-->
<required>true</required>
<!--
自定义标签属性(Run-time Expression Value)
如果值为true,表示该属性值可以动态赋值
(可以使用el表达式赋值)
-->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>qty</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>