跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
  • 基础篇

    • 聊聊环境变量
    • 永不过时的HelloWorld
    • 标识符
    • 数据类型
    • 运算符
    • 语句
    • 数组
    • 方法详解
    • 类和对象
    • 类的成员
    • 类的继承
    • 类的形式
    • 封装和多态
    • 接口和Lambda表达式
    • 泛型编程
    • 常用API之函数式接口
    • 常用API
    • 异常机制
    • 多线程
    • 常用API之File类
    • IO流
    • 集合
    • 常用API之Stream流
    • 网络编程
    • 枚举
    • 注解和反射
  • 进阶篇

    • MySQL基础
    • 数据库-JDBC
    • HTML基础
    • CSS基础
    • JavaScript-基础
    • 服务器-Servlet
    • 服务器-Servlet3
    • 动态网页-JSP
      • JSP 基础语法
      • JSP 指令
        • page 指令
        • include 指令
        • taglib 指令
      • JSP 内置对象
      • JSP 六大动作标签
        • 操作 JavaBean
      • EL 表达式
        • 获取数据
        • 执行运算
        • 隐式对象
      • JSTL -EL 函数库
        • 自定义 EL 函数
      • JSTL-Core标签库
        • 引入标签库
        • 常用标签
        • 标签详解
      • JSP 标签的体系结构
        • 各自的特点
      • 自定义 JSP 标签
        • 传统标签的调用过程
        • tag 标签中子标签的意义
        • 简单标签的调用过程
        • 自定义 JSP 标签的步骤
    • Ajax
    • 前端项目工程化
    • ECMA2015
    • 模块化规范
  • 框架篇

    • 工具-Maven
    • 框架-MyBatis
    • 框架-Spring
    • 框架-SpringMVC
    • 工具-SpringBoot
    • 工具-Nginx
  • Java
  • 进阶篇
舞动的代码
2022-06-17
目录

动态网页-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");
	}
%>

1
2
3
4
5
6

JSP 注释:在 JSP 文件中推荐使用 JSP 的注释:<%-- 注释内容 --%>

虽然 html 注释一样在浏览器中不会显示,但是它依然会被翻译成 Java 代码,而 JSP 注释则不会进行翻译

# JSP 指令

指令的基础格式:<%@ 指令 属性名 ="值" %>

# page 指令


<%@page 属性名 ="值" 属性名 ="值" %> 

1
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>

1
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"));
%>

1
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 />

1
2
3
4
5
6
7

# 执行运算

利用 EL 表达式可以在 JSP 页面中执行一些基本的关系运算、逻辑运算和算术运算,以在 JSP 页面中完成一些简单的逻辑运算。${user==null}

常用的运算符

empty 运算符:检查对象是否为 null 或“空”,很好用!!! [ ] 和 . 号运算符

${1==1}<br />
${empty stu}<br />

1
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")}

1
2
3
4
5

# 自定义 EL 函数

EL 表达式允许用户开发自定义 EL 函数,以在 JSP 页面中通过 EL 表达式调用 Java 类的方法(实际开发使用的并不多)。

  1. 编写一个 Java 类的静态方法

package am_2;
public class MyFunction {
	// 编写一个静态方法
	public static String toUpperCase(String str){
		return str.toUpperCase();
	}
}

1
2
3
4
5
6
7
8
9
  1. 编写标签库描述符(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>

1
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
  1. 在 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>

1
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>"/>
1

属性

c:set 标签

格式:

<c:set var="<string>" value="<string>" target="<string>"property="<string>" scope="<string>" />
1

属性

c:remove 标签

格式

<c:remove var="<string>" scope="<string>"/>
1

属性

c:catch 标签

格式

<c:catch var="e">
		<%
			String str =null;
			str.equals("");
		%>
	</c:catch>
${e}

1
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>

1
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>

1
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 标签的步骤

  1. 编写一个 Java 类继承 javax.servlet.jsp.tagext.TagSupport

  2. 重写其中的方法

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();
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1. 在 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>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  1. 在 JSP 中调用
<%@taglib uri="http://www.coder163.com/mytags"  prefix="mytags"%>
<mytags:mytag01/>
1
2
服务器-Servlet3
Ajax

← 服务器-Servlet3 Ajax→

Theme by Vdoing | Copyright © 2013-2023 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×