jsp (java server page)
什么是jsp?
- sun公司制定的一种服务器端动态页面技术规范;
因为虽然使用servlet也可以生成动态页面,但是过于繁琐
(需要使用out.println)并且难以维护(修改页面就需要就该java代码),所以制定了jsp.
- jsp本质就是一个Servlet;
jsp是以”.jsp”为后缀的文件,该文件被容器转换成一个对应的Servlet然后执行。
如何写jsp?
-
step1.添加一个.jsp后缀文件
-
step2.在文件里面可以添加如下内容:
-
1、html(css、javascript):直接写;
-
2、java代码:
- java代码片段:<% java代码 %>
- jsp表达式:<%= java表达式 %>
- jsp声明:<%! 声明一些新的属性或者方法 %>
-
3、隐含对象:直接使用
- 隐含对象:在jsp可以直接使用的对象(共9个)
- 输入输出对象:out、request、response;
- 作用域通信对象:session、application、pageContext;
- pageContext:容器会为每一个jsp实例创建唯一符合PageContext接口的对象,称为page上下文;
- 唯一性:一个jsp实例对应一个page上下文;
- 持久性:jsp实例存在,page上下文就存在。
- pageContext作用:
- 绑定数据;(a6/a7.jsp)
绑定到page上下文上的数据,只有对应的jsp能访问;
- 能通过该对象,找到其他所有对象
- 绑定数据;(a6/a7.jsp)
- servlet对象:config、page(从来不用)
- config:jsp也可以当作servlet来配置;(a5.jsp)
- 异常对象:exception(只当isErrorPage指令为true时使用)
- 能直接使用原因:容器将jsp转译成servlet时会自动添加获得这些隐含对象的代码;
- 隐含对象:在jsp可以直接使用的对象(共9个)
-
4、指令
- 指令:通知容器在将jsp转换成servlet时,做一些额外操作,如导包;
- 语法:<%@ 指令名 属性=值 %>
-
page指令:
- import属性:导包;
<%@ page import=“java.util.*”%>注意:多个包之间用逗号隔开
- ContentType属性:设置响应字符集;
<%@ page contentType=“text/html;charset=utf-8”%>注意:多个属性间用空格隔开
- pageEncoding属性:设置容器读取jsp文件时的编码字符集。
<%@ page pageEncoding=“utf-8”%> - session属性:缺省值为true,如果是false表示session隐含对象不可用。
<%@ page session=“false”%> - errorPage属性:指定一个异常处理界面;
当jsp运行发生异常时,容器调用指定异常处理界面。
<%@ page errorPage=“a4.jsp”%> - isErrorPage属性:缺省值false,如果值为true,则可以使用exception隐含对象。
例题参见Servlet_day04
- import属性:导包;
-
include指令:
- 作用:告诉容器,将jsp转换成Servlet时,将某个文件的内容插入到该指令所在位置。
<%@ include file=“路径”%>
- 作用:告诉容器,将jsp转换成Servlet时,将某个文件的内容插入到该指令所在位置。
-
taglib指令:
- 导入jsp标签,替换jsp当中的java代码;
标签体
- 导入jsp标签,替换jsp当中的java代码;
-
5、注释
-
- 如果注释内容是java代码,java代码会执行;
- <%—注释的内容—%>
- 如果注释内容是java代码,java代码不会执行;
-
-
jsp如何运行?
-
step1.容器要将jsp读取(期间要解码)并转译成servlet;
- html(css、js)—>service方法里面使用out.write()输出;
- <% java代码 %> —>service方法里面照搬不动;
- <%= java表达式 %> —>service() 里面用out.println()输出
- <%! 声明一些新的属性或者方法 %>—->在转译后servlet中添加新的属性和方法
out.write()会将null转换成 “ “(空子符串)输出;
out.println()会将null直接输出。
-
step2.容器调用该servlet.
jsp标签(jstl)和el表达式 (案例:servlet_jsp)
(1)jsp标签是什么?
- jsp标签是sun公司制定的一种用来代替jsp中java代码的技术,语法类似html(含有开始结束标记和属性等)。
(2)制定原因
- 因为直接在jsp中写java代码,不利于jsp文件的维护,所以sun公司制定了jsp标签技术规范。
- 好处:使jsp文件更简洁,方便维护,也可以实现代码重用;
(3)el表达式是什么?
- 是一套简单的运算规则,用来给jsp标签的属性赋值,也可以用来直接输出。
注:el表达式也可以脱离jsp标签直接使用。
javaBean
- 指的是一个公共的类,含有一个空参构造器和一些属性及访问这些属性的get/set方法且实现Serializable接口。
el表达式的作用
(1)读取javaBean属性
-
方式一:${对象绑定名.方法名去掉get,然后剩下全部的变小写}
${user.username} -
方式二:${对象绑定名.[“方法名去掉get,然后剩下全部的变小写”]
[]里面可以使用绑定名(request.setAttribute(“s1”,“username”));
u s e r . u s e r n m a e 等 价 于 {user.usernmae} 等价于 user.usernmae等价于{user.[‘username’]}和${user[s1]}
[]里面可以使用从0开始的下标,用于访问数组中某个元素。
${arr.[0]} -
el表达式从作用域对象查找数据原则:
- 获取数据顺序:pageContext–>request–>session–>application–>不显示
-
el表达式获取数据(指定查找范围)原则:
- ${xxxScope.方法名去掉get,然后剩下全部的变小写}//xxxScope可省,但不要省
${requestScope.user.username} - 顺序:pageScope–>requestScope–>sessionScope–>applicationScope
- ${xxxScope.方法名去掉get,然后剩下全部的变小写}//xxxScope可省,但不要省
-
优点:
- 相比较直接插入java代码。更简洁;
- 会将null转换成""输出,不会报空指针异常。
(2)简单运算
- 算术运算:+、-、*、/、%
注意:+ 只能求和,不能连接字符串。
- 关系运算:>、>=、<、<=、==、!=
- 逻辑运算:&&、||、!
- empty运算:empty
(3)读取请求参数
- ${param.name} 等价于 request.getParameter(“name”);
- ${paramValues.interest} 等价于 request.getParameterValues(“name”);
jstl (java standard tag library)
(1)什么是jstl?
- java标准标签库,由apache开发,sun公司定义的一套标准。
(2)如何使用?
- 在官网下载jstl开发包,jstlxx.xx.jar,然后把jar包拷到WEB-INF/lib下。
- 使用taglib指令引入jsp标签
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
url属性:指定标签命名空间;
prefix属性:设置命名空间的别名。
命名空间:为了区分同名元素在元素前添加的一个限定,通常是一个域名。
(3)标签
- 核心标签: core 简称c 常用的标签
- if标签:
<c:if test="" var="" scope="">
标签体
</c:if>
- test属性为true,容器会执行标签体内容;
- test属性可以使用el表达式来赋值;
- var属性用来指定绑定名;
- scope属性指定绑定范围。
- if标签:
-
choose标签:
<c:choose>
<c:when test="">
标签体
</c:when>
<c:otherwise>
标签体
</c:otherwise>
</c:choose>- when属性可以出现一次或多次,test为"true"时,执行标签体;
- otherwise可以出现0次或1次,用来处理例外;
- 该标签类似多层if嵌套。
-
forEach标签:
<c:forEach item="" var="" varStatus="">
标签体
</c:forEach>
- item属性用来指定要遍历的集合或者数组,一般用el表达式赋值;
- var:指绑定的一个名称;该标签每一次从集合或数组中取一个元素,将其绑定到pageContext上,var属性用来指定绑定名。
- varStatus:指定一个绑定名;
绑定范围是pageContext,绑定值是一个对象,该对象提供了方法,用于获取当前遍历状态;
getIndex( ):获得当前正在被遍历元素的下标(从0开始);
getCount( ):获得当前正在被遍历元素的序号(从1开始);
- 格式化标签:format 简称fmt 用来对数据做格式化,数字的小数保留位数
- sql标签: sql 简称s 用来对数据库进行增删改查的标签
(4)标签执行流程
- 容器依据命名空间找到标签的描述文件(.tld),然后依据标签名称找到对应的标签类,然后将标签类实例化并执行该实例的相应方法。
自定义标签
(1)编程步骤
- 写一个java类,继承SimpleTagSupport类(简单标签支持类);
注意:jsp标签有两种:复杂标签技术类、简单标签技术类。
- 重写daTag方法,在该方法里面,编写相应的处理逻辑;
- 标签有哪些属性,标签类也要有对应属性(属性名要相同,类型要匹配,并且提供对应set方法)
- 在标签描述文件当中,描述该标签
(2)标签执行过程
- 容器依据标签的命名空间找到标签的描述文件(.tld文件);
- 容器依据标签的名称找到标签类(及知道标签类的类名),然后会将该标签类实例化。
- 如果标签有属性,则容器会调用对应的set方法给这些属性赋值(即将xx的属性赋值给标签对象)
- 最后容器调用标签类的doTag()方法。