动态网页-JSP
JSP(全称 JavaServer Pages)Java 服务器页面。 是一种动态网页技术标准。JSP 部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 WEB 网页,然后返回给请求者。
JSP 技术以 Java 语言作为脚本语言,为用户的 HTTP 请求提供服务,并能与服务器上的其它 Java 程序共同处理复杂的业务需求,是简化版的 Servlet。
写 jsp 就像在写 html,但它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码
JSP 实际上就是 Servlet,每个 JSP 页面会被服务器翻译成一个 Java 文件
一个 JSP 页面的体系结构:01.jsp------>_01_jsp.java----->HttpJspBase---->HttpServlet
# JSP 基础语法
JSP 模版元素: JSP 页面中的 HTML 内容称之为 JSP 模版元素,其实指的是 JSP 中的 HTML 标签
JSP 表达式 :<%= 变量或表达式 %>
其实这个表达式就是在 out.print(变量或者表达式)方法中填充参数
JSP 脚本片断 :于在 JSP 页面中编写多行 Java 代码,语法格式:<% 多行 java 代码 %>
<%String str="HelloWorld";%>
JSP 中的所有代码都被翻译在对应的 Java 文件作为 public void _jspService() 方法的方法体内容
JSP 的脚本片段其实就相当于在_jspService 方法中编写代码,定义局部变量、语句
JSP 声明: jsp 声明中的 java 代码被翻译到_jspService 方法的外面
因为它和_jspService 方法是同一个等级的,所以可以编写方法、内部类
语法格式:
<%!Java 代码 %>
<%!
public void show(){
System.out.println("aaaaaa");
}
%>
2
3
4
5
6
JSP 注释:在 JSP 文件中推荐使用 JSP 的注释:<%-- 注释内容 --%>
虽然 html 注释一样在浏览器中不会显示,但是它依然会被翻译成 Java 代码,而 JSP 注释则不会进行翻译
# JSP 指令
指令的基础格式:<%@ 指令 属性名 ="值" %>
# page 指令
<%@page 属性名 ="值" 属性名 ="值" %>
2
3
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
# include 指令
语法:<%@include file="被包含的页面名称" %>
- 包含另外一个页面,注意该指令是将两个 JSP 合成一个 Servlet 文件,这种形式我们称为静态包含
# taglib 指令
语法:<%@ taglib uri="uri" prefix="prefixOfTag" %>
# JSP 内置对象
内置对象:也称隐式对象,在jsp中,已经初始化好并且给我们封装好了,不需要程序员创建,可以直接使用的对象就是内置对象。
SP 第一次访问时会翻译成 servlet,所以第一次访问通常会比较慢
JSP 引擎在调用 JSP 对应的_jspServlet 时,会传递或创建 9 个与 web 开发相关的对象供_jspServlet 使用
其实就是_jspService 中的局部变量和参数
名称 | 描述 |
---|---|
Request | 请求对象 |
Response | 响应对象 |
Config | ServletConfig |
Application | ServletContext |
Exception | 异常对象 |
Session | 会话对象(域对象)作用范围是一次会话 |
Page | Object |
Out | PrintWriter |
pageContext | 获取其他 8 个内置对象,域对象:作用范围是当前页面 |
# JSP 六大动作标签
JSP动作元素在请求处理阶段起作用,利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
jsp:setProperty | 设置JavaBean的属性。 |
jsp:getProperty | 输出某个JavaBean的属性。 |
jsp:forward | 把请求转到一个新的页面。 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记。 |
jsp:element | 定义动态XML元素 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板 |
示例
<jsp:forward page="05.jsp">
<jsp:param name="username"value="admin"/>
<jsp:param name="pwd"value="123"/>
</jsp:forward>
2
3
4
5
6
。
# 操作 JavaBean
jsp:useBean:用于在 JSP 页面中查找或实例化一个 JavaBean 组件。
标签用于在指定的域范围内查找指定名称的 JavaBean 对象:
常用属性
id 属性用于指定 JavaBean 实例对象的引用名称和其存储在域范围中的名称
class 属性用于指定 JavaBean 的完整类名(即必须带有包名)。
scope 属性用于指定 JavaBean 实例对象所存储的域范围,其取值只能是 page、request、session 和 application 等四个值中的一个,其默认值是 page。
如果存在则直接返回该 JavaBean 对象的引用。如果不存在则实例化一个新的 JavaBean 对象并将它以指定的名称存储到指定的域范围中。
<jsp:useBean id="stu" class="am_1.Student" scope="page"></jsp:useBean>
<%
System.out.println(pageContext.getAttribute("stu"));
%>
2
3
4
5
6
jsp:setProperty:用于在 JSP 页面中设置一个 JavaBean 组件的属性。
<jsp:setProperty name="stu" property="name" value="小黑" />
name 属性用于指定 JavaBean 对象的名称。
property 属性用于指定 JavaBean 实例对象的属性名。
value 属性用于指定 JavaBean 对象的某个属性的值,value 的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为 JavaBean 属性相应的类型,如果 value 的值是一个表达式,那么该表达式的计算结果必须与所要设置的 JavaBean 属性的类型一致。
param 属性用于将 JavaBean 实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的 JavaBean 属性的类型。
jsp:getProperty:用于在 JSP 页面中获取一个 JavaBean 组件的属性。
<jsp:getProperty name="stu" property="name" />
name 属性用于指定 JavaBean 实例对象的名称,其值应与jsp:useBean标签的 id 属性值相同。
property 属性用于指定 JavaBean 实例对象的属性名。
# EL 表达式
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
# 获取数据
EL 表达式主要用于替换 JSP 页面中的脚本表达式<%= 表达式 %>,以从各种类型的 web 域 中检索 java 对象、获取数据。
<jsp:useBean id="stu" class="am_1.Student" scope="page"></jsp:useBean>
<jsp:setProperty property="name" name="stu" value="小黑"/>
<jsp:setProperty property="age" name="stu" value="18"/>
<!-- 它只能从域中获取数据 -->
EL 表达式获取的是:${stu.name}<br />
2
3
4
5
6
7
# 执行运算
利用 EL 表达式可以在 JSP 页面中执行一些基本的关系运算、逻辑运算和算术运算,以在 JSP 页面中完成一些简单的逻辑运算。${user==null}
常用的运算符
empty 运算符:检查对象是否为 null 或“空”,很好用!!! [ ] 和 . 号运算符
${1==1}<br />
${empty stu}<br />
2
3
# 隐式对象
EL 表达式定义了 11 个隐含对象,利用这些隐式对象,web 开发人员可以很轻松获得对 web 常用对象的引用
通过 EL 表达式获取 request 对象${pageContext.request.contextPath}
# JSTL -EL 函数库
由于在 JSP 页面中显示数据时,经常需要对显示的字符串进行处理,SUN 公司针对于一些常见处理定义了一套 EL 函数库供开发者使用。
这些 EL 函数在 JSTL 开发包中进行描述,因此在 JSP 页面中使用 SUN 公司的 EL 函数库,需要导入 JSTL 开发包,并在页面中导入 EL 函数库
在页面中使用 JSTL 定义的 EL 函数
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
${fn:toUpperCase("This is my JSP page.")}
${fn:toLowerCase("AAAAAAAAAAAAAAAAAAAA")}
2
3
4
5
# 自定义 EL 函数
EL 表达式允许用户开发自定义 EL 函数,以在 JSP 页面中通过 EL 表达式调用 Java 类的方法(实际开发使用的并不多)。
- 编写一个 Java 类的静态方法
package am_2;
public class MyFunction {
// 编写一个静态方法
public static String toUpperCase(String str){
return str.toUpperCase();
}
}
2
3
4
5
6
7
8
9
编写标签库描述符(tld)文件,在 tld 文件中描述自定义函数。
Tomcat 中 tld 文件存放的位置:TomcatHome\webapps\examples\WEB-INF\jsp2
在 tld 文件中绑定 Java 中的方法
<?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>aaaa.</description>
<!-- 版本 -->
<tlib-version>1.0</tlib-version>
<!-- 短名称 -->
<short-name>myfn</short-name>
<!-- 没有实际意思,类似于 java 中的包名,. 一般写的像个网址 -->
<uri>http://coder163.com/myfuns</uri>
<!-- 绑定 Java 方法 -->
<function>
<!-- 描述 -->
<description>Reverses the characters in the given String</description>
<!-- 标签名一般和函数名保持一致 -->
<name>hello</name>
<!-- 该方法所在类,注意是全类名 -->
<function-class>am_2.MyFunction</function-class>
<!-- 方法声明,注意参数和返回值类型需要全类名,基本数据类型除外 -->
<function-signature>java.lang.String toUpperCase( java.lang.String)</function-signature>
</function>
</taglib>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 在 JSP 页面中导入和使用自定义函数
<%@taglib uri="http://coder163.com/myfuns" prefix="myfn" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL 函数库</title>
<meta charset="utf-8"http-equiv="pragma" content="no-cache">
</head>
<body>
${myfn:hello("aaaaaaaaaaaaaaaaaa") }<br />
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
# JSTL-Core标签库
# 引入标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
# 常用标签
主要作用是为了替换 JSP 中 java 脚本 (<% 脚本 %>)
# 标签详解
c:out 标签
格式:
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
属性
c:set 标签
格式:
<c:set var="<string>" value="<string>" target="<string>"property="<string>" scope="<string>" />
属性
c:remove 标签
格式
<c:remove var="<string>" scope="<string>"/>
属性
c:catch 标签
格式
<c:catch var="e">
<%
String str =null;
str.equals("");
%>
</c:catch>
${e}
2
3
4
5
6
7
8
属性
c:if 标签
格式
<c:if test="false">aaaaaaaaaaaaaaaaaaa </c:if>
属性
<c:choose>标签没有属性。<c:when>标签只有一个属性,在下表中有给出。<c:otherwise>标签没有属性。
格式
<c:choose>
<c:when test="${salary <= 0}"> if
太惨了。
</c:when>
<c:when test="${salary > 1000}"> else if
不错的薪水,还能生活。
</c:when>
<c:otherwise>else
什么都没有。
</c:otherwise>
</c:choose>
2
3
4
5
6
7
8
9
10
11
12
属性
c:forEach 标签
格式
<c:forEach begin="1" end="10">
HelloWorld<br>
</c:forEach>
<c:forEach begin="1" end="10" step="5">
HelloWorld1111<br>
</c:forEach>
<c:forEach begin="1" end="10" varStatus="ind" >
aaaaaaaaaaaaaaa1${ind.index}<br>
</c:forEach>
<%
ArrayList<Student> stus=new ArrayList<Student>();
stus.add(new Student("小黑 1",181));
stus.add(new Student("小黑 2",182));
stus.add(new Student("小黑 3",183));
stus.add(new Student("小黑 4",184));
stus.add(new Student("小黑 5",185));
pageContext.setAttribute("list", stus);
%>
<c:forEach items="${list}" var="stu">
${stu.name}
</c:forEach>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
属性
# JSP 标签的体系结构
# 各自的特点
传统标签复杂,但是兼容性好
简单标签,开发简单,但是需要 JSP2.0 规范支持
# 自定义 JSP 标签
# 传统标签的调用过程
# tag 标签中子标签的意义
body-content: 指示标签主体内容的类型(可选值)
empty: 没有主体内容。传统简单都适用
JSP: 有主体内容。为传统服务
scriptless: 有主体内容。为简单服务(主体内容不能出现 java 脚本)
tagdependent:指示标签主体内容原封不动的传给标签处理类。
attribute:定义标签的属性
name:属性名称。
required:该属性是否是必须的。true
rtexprvalue:是否支持表达式
# 简单标签的调用过程
# 自定义 JSP 标签的步骤
编写一个 Java 类继承 javax.servlet.jsp.tagext.TagSupport
重写其中的方法
public class MyTag extends TagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("HelloWorld");
return super.doStartTag();
}
@Override
public int doEndTag() throws JspException {
System.out.println("结束了");
return super.doEndTag();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- 在 WEB-INF 下编写描述 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.0</tlib-version>
<short-name>mytags</short-name>
<uri>http://www.coder163.com/mytags</uri>
<!-- 定义一个标签 -->
<tag>
<!-- 调用时的名称 -->
<name>mytag01</name>
<!-- 标签所在类 -->
<tag-class>pm_1.MyTag</tag-class>
<!-- 标签中的主体内容 -->
<body-content>empty</body-content>
</tag>
</taglib>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 在 JSP 中调用
<%@taglib uri="http://www.coder163.com/mytags" prefix="mytags"%>
<mytags:mytag01/>
2