✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一文带你掌握JSP基础知识
更多内容点击👇
IDEA创建Java Web项目
文章目录
- 脚本程序
- JSP程序注释
- JSP表达式
- JSP声明
- JSP指令
- JSP行为
- JSP隐含对象
在上一篇中,我们学了用IDEA工具创建JAVA Web项目,创建后,生成了一个jsp文件,那么本文就根据以IDEA集成了Tomcat服务的基础来讲解JSP基础知识。
脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
或者,您也可以编写与其等价的XML语句,就像下面这样:
<jsp:scriptlet>
代码片段
</jsp:scriptlet>
任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
下面给出一个示例:
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
注意:请确保Apache Tomcat已经成功部署到IDEA软件中,具体的部署方法可以参看前面一篇博文:IDEA创建Java Web项目
点击上图中的三角形运行按钮后得到以下结果:
JSP程序注释
项目开发中必须对代码的功能进行详细的说明,说明往往需要通过注释结构来进行。在JSP程序开发中,由于需要在HTML代码中嵌入Java代码,因此可以直接使用Java中的注释与HTML注释进行说明。其中Java的注释内容属于隐式注释,不会发送到客户端浏览器;而HTML注释属于显式注释,会发送到客户端浏览器。
除了以上的两种注释以外,在JSP中又提供了另外一种隐式注释,结构为“<%-- 注释内容 --%>”,此注释需要定义在Scriptlet代码之外。
程序示例:JSP程序注释定义
<html>
<head>
<title>$Title$</title>
</head>
<body>
Hello World!<br/>
<%--此为JSP中才可以使用的注释,为隐式注释,不会发送到客户端浏览器中--%>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
不同情况下使用注释的语法规则:
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
<% | 代表静态 <%常量 |
%> | 代表静态 %> 常量 |
\’ | 在属性中使用的单引号 |
\" | 在属性中使用的双引号 |
JSP表达式
计算Java表达式的值,Java表达式由数据和运算符组成的式子,就是Java表达式,JSP表达式得到的结果转换成字符串,并在jsp页面中表达式的位置进行显示。
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
jsp表达式语法结构:
<%=Java表达式 %>
同样,您也可以编写与之等价的XML语句:
<jsp:expression>
表达式
</jsp:expression>
jsp表达式注意事项:
- 1)<%=和%>是一个完整的符号,中间不能有空格
- 2)表达式必须能求出值
程序示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSP</title>
</head>
<body>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body>
</html>
运行结果:
今天的日期是: 2022-12-5 18:40:07
JSP声明
就是在jsp页面中声明Java方法或者Java变量。一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
语法结构:
<%! Java代码 %>
或者,您也可以编写与其等价的XML语句,就像下面这样:
<jsp:declaration>
代码片段
</jsp:declaration>
注意:
1)<%!和%>是一个完整的符号,符号中间不能有空格
2)声明的语法和在Java语言中声明变量和方法是一样的
3)在页面中声明的变量和方法,在整个页面内都有效
程序示例:
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
jsp声明变量个scriptlet变量的区别:
- jsp声明的变量是全局变量,会被多线程共享。
- scriptlet申明的变量是局部变量,只在当前页面中有效果,不会被多线程共享。
JSP指令
在编译期间的命令,用来设置与整个jsp页面相关的属性,不会直接产生任何可见的输出
可以通过page指令设置jsp的脚本语言、设置jsp的编码格式、在jsp中引入其它的java类或者包
可以通过include指令引入其它的java代码等
jsp指令主要有3种:page指令、include指令、taglib指令
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
jsp指令的语法结构:
写法一:
<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2” … 属性n=“属性值n” %>
写法二:
<%@ 指令名称 属性1=“属性值1” %>
<%@ 指令名称 属性2=“属性值2” %>
…
<%@ 指令名称 属性n=“属性值n” %>
page指令:页面指令,用来定义整个jsp页面的一些属性和这些属性的值
page指令的属性可以定义文件类型、定义需要导入的包、定义错误页面的指定、定义页面编码、定义脚本语言
page指定的作用对整个JSP页面有效,跟书写位置无关,可以在页面中的任意位置存在,一般写在页面鹅最前面
page指令中除了import属性可以出现多次,其它的属性都只能出现一次
page指令的每一个属性完成的功能不同,指令属性对大小写敏感
include指令:在jsp页面静态插入一个文件,被插入的文件可以是jsp页面、HTML页面、文本文件或者一段Java代码。
include指令语法结构
<%@ include file = "文件名" %>
注意:include执行不能传递参数
Taglib指令:JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
等价的XML语法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
JSP行为
JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。
行为标签只有一种语法格式,它严格遵守XML标准:
<jsp:action_name attribute="value" />
行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:
语法 | 描述 |
---|---|
jsp:include | 用于在当前页面中包含静态或动态资源 |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
JSP隐含对象
JSP支持九个自动定义的变量,江湖人称隐含对象。这九个隐含对象的简介见下表:
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
exception | exception类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
request对象
request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。
out对象
out对象是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。
最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用buffered='false’属性来轻松关闭缓存。
JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter新增了一些专为处理缓存而设计的方法。还有就是,JspWriter类会抛出IOExceptions异常,而PrintWriter不会。
下表列出了我们将会用来输出boolean,char,int,double,String,object等类型数据的重要方法:
方法 | 描述 |
---|---|
out.print(dataType dt) | 输出Type类型的值 |
out.println(dataType dt) | 输出Type类型的值然后换行 |
out.flush() | 刷新输出流 |
session对象
session对象是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。
session对象用来跟踪在各个客户端请求间的会话。
application对象
application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
config对象
config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。
这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
以下是config对象的使用方法,不是很重要,所以不常用:
config.getServletName();
它返回包含在元素中的servlet名字,注意,元素在 WEB-INF\web.xml 文件中定义。
pageContext 对象
pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。
这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。
这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。
PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。
其中一个重要的方法就是 removeAttribute(),它可接受一个或两个参数。比如,pageContext.removeAttribute(“attrName”) 移除四个scope中相关属性,但是下面这种方法只移除特定 scope 中的相关属性:
pageContext.removeAttribute(“attrName”, PAGE_SCOPE);
page 对象
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。
page 对象就是this对象的同义词。
exception 对象
exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。