1.jsp是什么(java server page)
sun公司制订的一种服务器端动态页面技术规范。
a.虽然使用servlet也可以生成动态页面,但是过于繁琐(需要使用out.println语句输出),并且维护麻烦(要修改页面,就必须修改java代码)。所以sun才制订了jsp规范。
b. jsp是一个以.jsp为后缀的文件,主要内容是html和少量的java代码。容器(比如tomcat)会将该文件转换成一个对应的servlet然后执行。
c. jsp本质就是一个servlet
2.如何写一个jsp文件
step1.添加一个以.jsp为后缀的文件。
step2.在该文件当中,可以使用以下元素:
1)html (css,js)
直接写即可。
2)java代码
a. java代码片断
<% java代码 %>
b. jsp表达式
<%= java表达式 %>
c. jsp声明
<%! 声明一个方法或者变量 %>
3)指令
a.什么是指令?
通知容器,在将jsp转换成servlet时,做一些额外的处理,比如导包。
b.语法
<%@ 指令名 属性=值 %>
c.page指令
import属性:指定要导入的包。
pageEncoding属性:告诉容器,jsp文件的编码。
contentType属性:设置setContentType方法的参数。
session属性: 缺省值是true,如果设置为false,则不能够使用session隐含对象了。
errorPage属性: 用来指定一个异常处理页面,当jsp运行出错,容器会调用异常处理页面。
isErrorPage属性: 缺省值是false,如果值为true,则可以使用exception隐含对象。
d.include指令
file属性:指定被包含的文件。
e.taglib指令
用于导入jsp标签。
4)隐含对象
a.什么是隐含对象? 在jsp文件里面,直接可以使用的对象
b.为什么可以直接使用这些隐含对象? jsp会被容器转换成一个对应的servlet,在转换过程中,容器会自动添加获得这些对象的代码。
c.有哪些隐含对象?
out,request,response,session,application
exception: 只有在isErrorPage="true"时才能使用。
pageContext: 容器会为每一个jsp实例都会创建一个唯一的一个符合PageContext接口要求的对象。唯一性:一个jsp实例对应一个pageContext。持久性:只要jsp实例还在,则pageContext会一直存在。 作用1:绑订数据。绑订到pageContext上的数据,只有对应的jsp实例能访问到。作用2: 提供了获得其它所有隐含对象的方法。 config: ServletConfig
page: jsp实例本身, jsp对应的那个servlet实例。
5)注释
a. <!-- 注释内容 -->
如果注释的内容是java代码,则java代码会执行。
b. <%-- 注释内容 --%>
如果注释的内容是java代码,不会执行。
3.jsp是如何运行的?
3.1 容器将jsp转换成一个servlet
html -----> service方法里,使用out.write输出。
<% %> ---> service方法里,照搬。
<%= %> ---> service方法里,使用out.print输出。
<%! %> ----> 为servlet增加新的属性和方法。
3.2 容器调用该servlet,包括编译、实例化、调用service方法。
4. jsp标签和el表达式
4.1 jsp标签是什么?
sun公司制订的一种用来替换jsp中java代码的技术,语法类似于html标签,容器遇到jsp标签之后,会找到标签对应的标签类然后执行。
4.2 el表达式是什么?
是一套简单的运算规则,用于给jsp标签的属性赋值。也可以脱离jsp标签直接使用。
4.3 el表达式的使用
4.3.1)访问bean的属性
方式一
${user.username}
注:
a.执行过程: 容器依次从pageContext->request->session->application中查找绑订名称为"user"的对象(即调用getAttribute方法),找到该对象之后,调用getUsername方法,然后输出结果。
b.会将null转换成""输出。
c.如果依据绑定名找不到对应的对象,不会报空指针异常,仍然输出""。
d.可以使用pageScope、requestScope、sessionScope、applicationScope来指定查找范围。比如,从session对象中查找: ${sessionScope.user.username}
方式二
${user['username']}
注:
a.执行过程:同方式一。
b.允许[]里面使用绑定名。
c.允许[]里面使用从0开始的下标,用于访问数组中的某个元素。
4.3.2)做一些简单的运算
运算结果可以用来给jsp标签的属性赋值,也可以直接输出。可做算术运算,关系运算,逻辑运算以及判断集合内容是否为空,或者是否为一个空字符串。
4.3.3)读取请求参数值
${param.username} 等价于 request.getParameter("username");
${paramValues.interest} 等价于 request.getParameterValues("interest");
5.jstl (java standard tag lib 即java标准标签库)
使用taglib指令导入要使用的标签。
uri属性:指定要导入的标签的命名空间。
prefix属性:指定命名空间的别名。
命名空间:是为了区分同名的元素而在元素前添加的一个限定。通常是一个域名。
5.1 if标签
a.语法
<c:if test="" var="" scope="">
标签体
</c:if>
b.当test属性值为true时,容器执行标签体的内容。属性值可以使用el表达式来赋值。
c.var属性指定绑定名,scope属性指定绑定的范围。
5.2 choose标签
a.语法
<c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
b.when可以出现1次或者多次,表示一个分支;otherwise可以出现0次或者1次,表示例外。
c.当test属性值为true时,执行标签体的内容,可以使用el表达式来给该属性赋值。
5.3 forEach标签
遍历集合或者数组
<c:forEach items="" var="" varStatus="">
</c:forEach>
6.自定义标签
(1)步骤
step1. 写一个java类,继承SimpleTagSupport类。继承SimpleTagSupport类属于简单标签技术
step2. override doTag方法,在该方法里面,编写相应的处理逻辑。
step3. 在.tld文件里面描述标签。
(2)标签的运行过程
step1.容器依据标签的命名空间,找到标签的描述文件(.tld)。
step2.容器依据标签的名字找到对应的标签类。 比如,标签名字为"hello",对应的标签类是"tag.HelloTag"。
step3.容器调用标签类的构造器,创建其实例。
step4.容器将标签的属性值赋给标签对象对应的属性。
step5.容器调用标签对象的doTag方法。