JSP(JavaServer Pages)是一种在服务器端执行的Java技术,用于构建动态Web页面。它允许将Java代码嵌入HTML页面中,使开发人员能够更方便地创建和管理动态内容。
*.html 静态页面(包含固定的页面内容)
*.jsp 动态页面(页面数据可以动态更新,支持嵌套java代码和html代码)
动态页面生成:JSP页面可以包含HTML、XML、Java代码片段和JSP标签等内容。当JSP页面被访问时,服务器会动态地处理和执行其中的Java代码,并将生成的HTML响应返回给客户端浏览器。
JSP标签(JSP Tag):JSP标签是一种特殊的指令或标记,用于在JSP页面中插入Java代码片段或调用自定义标签库(Tag Library)中的功能。常见的JSP标签包括核心标签库(JSTL)和自定义标签库(Custom Tag Library)等。
JSP指令(JSP Directive):JSP指令用于指定特定的配置信息,如导入Java类、设定页面编码、设置缓冲区大小等。常见的JSP指令包括<%@ page %>和<%@ include %>等。
EL表达式(Expression Language):EL表达式是一种简化和优化Java代码在JSP页面中的使用的方式,可以在JSP页面中直接引用和操作JavaBean属性、数组、集合和映射等数据结构。EL表达式的语法类似于${expression}。
隐式对象(Implicit Object):JSP容器会自动在JSP页面中创建一些隐式对象,这些对象可以被直接使用,无需进行额外的声明和初始化。常见的隐式对象包括request、response、session、application、out等。
生命周期:JSP页面经历了多个生命周期阶段,包括初始化、编译、执行和销毁等。在每个阶段,JSP容器会调用相应的方法来处理和执行。
MVC模式:JSP通常与Servlet和JavaBean等其他组件结合使用,共同实现MVC(Model-View-Controller)模式。JSP作为视图(View)层,负责展示数据和与用户交互,通过Servlet作为控制器(Controller)来处理请求和业务逻辑,JavaBean作为模型(Model)来封装数据。
1.servlet展示信息的不方便,引入了JSP。
2.JSP本质上也是一个servlet!!!!!!
3.JSP就是在HTML页面中嵌入了java代码。
<% java代码%>
声明标签 <%!变量或者方法声明%>
表达式标签 <%= 表达式%> 在页面上显示的效果
程序代码标签 <%java代码%> 页面上动态展示内容
page指令:
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
第一次执行
第二次执行
当浏览器访问http://localhost:8080/day9_1/index.jsp。服务器发现后缀为.jsp,它会根据路径找到index.jsp文件,会将index.jsp翻译成index_jsp.java文件,对这个java文件进行编译,产生一个index_jsp.class文件,将class文件加载运行。将JSP翻译成java文件,它是将JSP中的所有的HTML代码通 过流进行输出,也就是说最终翻译成class,被虚拟机加载,它本质是servlet,它就会往回响应,响应回 去就是把JSP中的HTML代码以流的方式写回浏览器。所以在JSP中展示出了HTML代码
需要注意的是,JSP中的静态内容会直接被输出,而动态内容则需要在_jspService()方法中通过输出流(ServletResponse对象的getWriter()方法)进行输出。
在JSP的工作原理中,对于JSP页面中的每个请求,都会创建一个Servlet实例来处理,因此JSP页面中的实例变量是线程安全的。同时,JSP页面也支持会话(session)对象、上下文(application)对象和其他的Servlet API。
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。所属类型:HttpServletResponse
3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。HttpSession
4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量” ServletContext
区别:
5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
示例:
out.print("<script type='text/javascript'>alert('用户名不存
在');location.href='index.jsp'</script>");
6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、
request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过config对象传递给这个Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
//将image路径转换成服务器端的路径
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>
8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
(1)先在可能发生错误的页面中添加errorPage属性:
<%@ page pageEncoding="utf-8"
errorPage="error.jsp"
contentType="text/html;charset=UTF-8" language="java" %>
(2) 在error.jsp页面中设置isErrorPage=“true” 的属性
(使用exception对象之前,需要先将当前页面设置成错误页面)
<%@ page language="java" isErrorPage="true" import="java.util.*"
pageEncoding="UTF-8"%>
jsp的作用域:
pageContext -> request -> session -> application
当前页面 单次请求有效 当前会话期间 服务器运行期间有效
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
语法格式如下:
<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值
指令名称 | 描述 |
---|---|
page | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
include | 包含其他文件 |
taglib | 引入标签库的定义 |
Page指令为容器提供当前页面的使用说明一个JSP页面可以包含多个page指令
Page指令的语法格式:
<%@ page attribute=“value” %>
属性名 | 属性值 | 描述 |
---|---|---|
language | java | 解释该JSP文件时采用的语言,一般为java语言,默认为java |
extends | 任何类的全名 | 编译该JSP文件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等方法 |
import | 任何包名、类名 | 引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用uogelei,中间用英文逗号隔开<%@ page import=包名.类名,包名.类名%> |
session | true、false | 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true |
autoFlush | true,false | 是否运行缓存,如果为true,则使用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存满了或者程序行完毕或者执行out.flush()操作时才到客户端,默认为true。 |
buffer | none或者数字KB | 指定缓存大小,当autoFlush设为true时有效,例如<%@ pagebuffer=10kb%> |
isThreadSafe | true,false | 是否线程安全,如果为true,则运行多个线程同时运行该jsp程序,否则只运行一个线程,其余线程等待,默认为false |
isErrorPage | true,false | 指定该页面是否为错误显示页面,如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有,默认为false |
errorPage | 某个JSP页面的相对路径 | 指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面,errorPage指定的页面通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常 |
contentType | 有效的文档类型 | 客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、GIF图像为image/gifWORD文档为application/msword,该属性常跟着charset设置编码一起,作用是通知服务器和浏览器都使用同一个码表 |
pageEncoding | UTF-8,ISO-8859-1等 |
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含
的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
<%@ taglib uri="uri" prefix="" %> 1
uri属性确定标签库的位置,prefix属性指定标签库的前缀(可自定义)。
最初定义于JSTL1.0部分
在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式
展示的信息需要先存到属性中才能拿到
语法格式:${需要展示信息的名字}
注意:
当表达式没有指定变量或者对象的范围时,
那么容器会依次从pageContext—>request—>session->application
中查找该变量或对象,我们可以
通过隐含对象获得指定作用域的值:
pageScope对象
,用于获取当前页面的属性值
requestScope对象
,用于获取请求范围的属性值
sessionScope对象
,用于获取会话范围的属性值
applicationScope对象
,用于获取程序范围的属性值
语法:
${requestScope.key}
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。核心标签 格式化标签 sql标签 xml标签 jstl函数
(后面详细解释)
作用:简化jsp页面编写代码
语法格式:
功能范围 | Uri | 前缀 |
---|---|---|
core | http://java.sun.com/jsp/jstl/core | c |
i18n | http://java.sun.com/jsp/jstl/fmt | fmt |
sql | http://java.sun.com/jsp/jstl/sql | sql |
xml | http://java.sun.com/jsp/jstl/xml | x |
functions | http://java.sun.com/jsp/jstl/function | fn |
①核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
② 核心标签的分类
表达式操作 out、set、remove、catch
流程控制 if、choose、when、otherwise
迭代操作 forEach、forTokens
URL操作 import、param、url、redirect
Set标签
<c:set> 主要用来将变量存储至JSP范围中 或是JavaBean的属性或Map对象中
<c:out>主要用来显示数据的内容
<c:remove> 主要负责移除变量
<c:if> 主要用于进行if判断,如果为true,则输出标签体中的内容
<c:choose>,<c:when>,<c:otherwise> 作用相当于if-else
<c:forEach> 循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍
fmt:formatDate 作用:将日期类型格式化为指定模式的字符串
属性
value:将要被格式化的数据
pattern:格式化的模式,与SimpleDateFormat的参数设置一样
var:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在页面
scope:变量存放的域属性空间,默认page
type:其取值为date、time、both,表示给出的value是日期、时间、还是两者都包含,默认是date
fmt:parseDate 作用:用于将指定字符串转化为日期类型
Value服务器获取的时间
Pattern:转换的格式
Var:页面显示的变量
fmt:formatNumber 按照指定格式对数字进行格式化
属性
maxIntegerDigits:整数部分最多的位数
minIntegerDigits:整数部分最少的位数
maxFrctionDigits:小数部分最多的位数
minFrctionDigits:小数部分最少的位数
var:存储格式化结果的变量
scope:var属性的作用域
integerOnly:是否只解析整型数true或者浮点数false