文章目录

  • JSP简介
  • JSP工作原理
  • JSP生命周期
  • JSP注释
  • JSP中嵌套Java代码
  • JSP语法
  • 中文编码问题
  • 脚本程序
  • 声明变量
  • 表达式
  • 指令
  • Page指令
  • Include指令
  • Taglib指令
  • JSP内置对象
  • request对象
  • response对象
  • session对象
  • application对象
  • out 对象
  • pageContext 对象
  • config 对象
  • page 对象
  • exception 对象
  • 状态码
  • EL表达式
  • JSTL
  • 核心标签



JSP简介

JSP全称Java Server Pages(Java服务器页面),是一种动态网页开发技术

  • Java servlet的简化设计,主要用于实现Java web应用程序的用户界面部分
  • 使用JSP标签在HTML网页中插入Java代码(动态部分用Java编写),标签通常以<%开头、以%>结束
  • JSP就是在HTML页面中嵌入java代码,通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页
  • 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行
  • JSP将网页逻辑与网页设计的显示分离

html与jsp主要区别:

.html 是静态页面,包含固定的页面内容

.jsp 是动态页面,页面数据可以动态更新,支持嵌套java代码和html代码


JSP工作原理

当浏览器访问页面、服务器发现后缀为.jsp的文件时会根据路径找到index.jsp文件,并将index.jsp翻译成index_jsp.java文件并进行编译,产生index_jsp.class文件,将class文件加载运行

将JSP翻译成java文件,是将JSP中的所有的HTML代码通过流进行输出、最终翻译成class后被虚拟机加载,本质是servlet,往回响应(响应回去就是把JSP中的HTML代码以流的方式写回浏览器)

java jsp 关联 jsp怎么连接java_jsp


JSP生命周期

JSP生命周期,即从创建到销毁的整个过程,

类似于servlet生命周期,JSP生命周期还包括将JSP文件编译成servlet

  • 编译阶段:
    servlet容器解析JSP文件、将JSP文件转为servlet,随后编译servlet源文件、生成servlet类
  • 初始化阶段:jspInit()
    加载与JSP对应的servlet类,创建实例并调用它的初始化方法
    (一般来说只执行一次)
  • 执行阶段:_jspService()
    调用与JSP对应的servlet实例的服务方法(一切与请求相关的交互行为,直到被销毁)
  • 销毁阶段:jspDestroy()
    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

代码示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<html>
<head>
    <title>life.jsp</title>
</head>
<body>

<%!
    private int initVar=0;
    private int serviceVar=0;
    private int destroyVar=0;
%>

<%!
    public void jspInit(){
        initVar++;
        System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
    }
    public void jspDestroy(){
        destroyVar++;
        System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次");
    }
%>

<%
    serviceVar++;
    System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");

    String content1="初始化次数 : "+initVar;
    String content2="响应客户请求次数 : "+serviceVar;
    String content3="销毁次数 : "+destroyVar;
%>
<h1>JSP demo</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p>

</body>
</html>

JSP注释

<!-- html注释内容,查看源码时能看到 -->

<%-- jsp注释,查看⻚⾯源码时看不到 --%>

主要注释:

语法

描述

<%-- 注释 --%>

JSP注释,注释内容不会被发送至浏览器甚至不会被编译

<!-- 注释 -->

HTML注释,通过浏览器查看网页源代码时可以看见注释内容

<%

代表静态 <%常量

%>

代表静态 %> 常量

\’

在属性中使用的单引号

\"

在属性中使用的双引号


JSP中嵌套Java代码

使用小脚本:<% java代码%>

基本格式:

声明标签: 
<%!变量或者⽅法声明%>

表达式标签: 
<%= 表达式%> 在⻚⾯上显示的效果

程序代码标签: 
<%java代码%> ⻚⾯上动态展示内容

page指令:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


代码示例:
 <body>
 <%! int i=10;%><!--成员变量-->
 <%! public void show(){}%> <!--成员⽅法-->
 <%=i%> <!--输出变量值-->
 </body>

JSP语法

中文编码问题

如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

脚本程序

脚本程序可以包含任意Java语句、变量、方法或表达式,只要它们在脚本语言中有效

任何文本、HTML标签、JSP元素必须写在脚本程序的外面

语法格式:

一、 
<% 代码片段 %>


二、等价的xml格式:
<jsp:scriptlet>
   代码片段
</jsp:scriptlet>

声明变量

一个声明语句可以声明一个或多个变量、方法

一、
<%! declaration; [ declaration; ]+ ... %>



二、等价的xml语句
<jsp:declaration>
   代码片段
</jsp:declaration>

代码示例:

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %>

表达式

一个JSP表达式中包含的脚本语言表达式先被转化成String,再插入到表达式出现的地方

表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式

一、
<%= 表达式 %>

二、 等价的xml语句
<jsp:expression>
   表达式
</jsp:expression>

代码示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>demo</title>
</head>
<body>
	<p>
	   今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
	</p>
</body> 
</html>

输出:

今天的日期是: 2021-9-21 13:40:07

指令

JSP指令用来设置JSP页面相关的属性

语法格式:

<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值

三种指令标签:

指令名称

描述

<%@ page … %>

定义页面依赖属性,比如脚本语言、error页面、缓存需求等等

<%@ include … %>

包含其他文件

<%@ taglib … %>

引入标签库的定义(可以是自定义标签)

Page指令

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

UTF8,ISO8859-1等

Include指令

JSP可以通过include指令来包含其他文件

被包含的文件可以是JSP文件、HTML文件或文本文件,包含的文件可以看作是JSP文件的一部分,会被同时编译执行

include 指令中的文件名实际上是⼀个相对的 URL 地址,如果没有给文件关联⼀个路径,JSP编译器默认在当前路径下寻找

语法格式:

<%@ include file="⽂件相对 url 地址" %>

Taglib指令

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签

uri属性确定标签库的位置,prefix属性指定标签库的前缀(可⾃定义)

语法格式:

<%@ taglib uri="uri" prefix="" %>

JSP内置对象

JSP中⼀共预先定义了9个对象:request、response、session、application、out、pagecontext、config、page、exception

request对象

作用:
代表客户端的请求信息,接受通过HTTP协议传送到服务器的数据(包括头信息、系统信息、请求方式以及请求参数等)

所属类型: javax.servlet.httpServletRequest

request对象的作用域为一次请求


response对象

作用:
代表对客户端的响应,将JSP容器处理过的对象传回到客户端

所属类型:HttpServletResponse

作用域:只在JSP页面内有效


session对象

由服务器自动创建的与用户请求相关的对象

服务器为每个用户都生成⼀个session对象,用于保存该用户的信息,跟踪用户的操作状态

session对象内部使用Map类来保存数据,保存数据的格式为 “Key/value”

session对象的value不仅仅局限于字符串类型


application对象

作用:
将信息保存在服务器中,直到服务器关闭(期间application对象中保存的信息会在整个应用中都有效)

与session对象相比,application对象生命周期更长,类似于系统的“全局变量”

  • 区别:
    request-单次请求
    session-浏览器访问期间(会话期间)
    application-服务器启动期间,所存的数据可以跨浏览器

out 对象

作用:
在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区

在使用out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间

待数据输出完毕后,要及时关闭输出流

代码示例:

out.print("<script type='text/javascript'>alert('⽤户名不存在');location.href='index.jsp'</script>");

pageContext 对象

作用:
取得任何范围的参数

通过它可以获取 JSP页面的out、request、reponse、session、application 等对象

pageContext对象的创建和初始化都由容器完成,在JSP页面中可以直接使用pageContext对象


config 对象

作用:
取得服务器的配置信息

通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象

当⼀个Servlet 初始化时,容器把某些信息通过config对象传递给这个Servlet,开发者可以在web.xml文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数

代码示例:

//将image路径转换成服务器端的路径
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>

page 对象

page 对象代表JSP本身,只有在JSP页面内才合法

page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针


exception 对象

作用:
显示异常信息,只有在包含 isErrorPage=“true” 的页面中使用

在⼀般的JSP页面中使用该对象将无法编译JSP文件

如果在JSP页面中出现没有捕获到的异常,会生成 exception 对象,并把exception 对象传送到在page指令中设定的错误页面中,再在错误页面中处理相应的exception 对象


状态码

状态码

消息

描述

100

Continue

只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求

101

Switching Protocols

服务器交换机协议

200

OK

请求被确认

201

Created

请求时完整的,新的资源被创建

202

Accepted

请求被接受,但未处理完

300

Multiple Choices

一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接

301

Moved Permanently

被请求的页面已经移动到了新的URL下

302

Found

被请求的页面暂时性地移动到了新的URL下

303

See Other

被请求的页面可以在一个不同的URL下找到

306

Unused

已经不再使用此状态码,但状态码被保留

307

Temporary Redirect

被请求的页面暂时性地移动到了新的URL下

400

Bad Request

服务器无法识别请求

401

Unauthorized

被请求的页面需要用户名和密码

402

Payment Required

目前还不能使用此状态码

403

Forbidden

禁止访问所请求的页面

404

Not Found

服务器无法找到所请求的页面

405

Method Not Allowed

请求中所指定的方法不被允许

406

Not Acceptable

服务器只能创建一个客户端无法接受的响应

407

Proxy Authentication Required

在请求被服务前必须认证一个代理服务器

408

Request Timeout

请求时间超过了服务器所能等待的时间,连接被断开

409

Conflict

请求有矛盾的地方

410

Gone

被请求的页面不再可用

411

Length Required "Content-Length"没有被定义,服务器拒绝接受请求

412

Precondition Failed

请求的前提条件被服务器评估为false

413

Request Entity Too Large

因为请求的实体太大,服务器拒绝接受请求

414

Request-url Too Long

服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息

415

Unsupported Media Type

服务器拒绝接受请求,因为媒体类型不被支持

500

Internal Server Error

请求不完整,服务器遇见了出乎意料的状况

501

Not Implemented

请求不完整,服务器不提供所需要的功能

502

Bad Gateway

请求不完整,服务器从上游服务器接受了一个无效的响应

503

Service Unavailable

请求不完整,服务器暂时重启或关闭

504

Gateway Timeout

网关超时

505

HTTP Version Not Supported

服务器不支持所指定的HTTP版本


EL表达式

在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分

在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式

语法:

${需要展示信息的名字}



当表达式没有指定变量或者对象的范围时:
容器会依次从pageContext—>request—>session—>application中查找该变量或对象,
通过隐含对象获得指定作⽤域的值:
pageScope对象,⽤于获取当前⻚⾯的属性值
requestScope对象,⽤于获取请求范围的属性值
sessionScope对象,⽤于获取会话范围的属性值
applicationScope对象,⽤于获取程序范围的属性值


语法:
 ${requestScope.key}

基础操作符:

术语

定义

算术型

+ 、-、 * /(div) 除 、 %(mod) 余数

逻辑型

and、&&、or、||、!、not

关系型

==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进⾏⽐较,或与布尔型、字符串型、整型或浮点型⽂字进⾏⽐较

Empty

Empty操作符是⼀个前缀操作符⽤于判断⼀个值是否为null或者为empty如String str =“”; ${empty str} 返回值为true

条件型

A ?B :C。根据 A 赋值的结果来赋值 B 或 C

代码示例:

单个变量:${a+10}<br>
单个变量:${s}<br>
单个对象:${key.属性名}
 //对象类型
 Users u=new Users();
 u.setName("王⽼五");
 u.setPass("abc");
 pageContext.setAttribute("u1",u);
 user.name=${u1.name}
 user.pass=${u1.pass}
 // list集合对象:
 List list=new ArrayList();
 list.add("刘能");
 list.add(30);
 list.add(u);
 pageContext.setAttribute("list2",list);
 list1=${list2[0]}<br/>
 list2=${list2[1]}<br/>
 list3=${list2[2].pass}<br/>
// map集合:
 k1=${map1.k1}<br>
 k2=${map1.k2.username}--- ${map1.k2.password}

判断变量是否有值或是否存在:  ${empty key值}
 List list2=new ArrayList();
 list2.add("aa");
 request.setAttribute("list222",list2);

判断list中是否有数据:  ${empty list222}

JSTL

JSP标准标签库(JSTL)是JSP标签集合,封装了JSP应用的通用核心功能

JSTL支持通用的、结构化的任务(迭代、条件判断、XML文档操作、国际化标签、SQL标签),还提供了一个框架来使用集成JSTL的自定义标签,根据JSTL标签所提供的功能,可以将其分为5个类别:核心标签、格式化标签、sql标签、xml标签、jstl函数

  • 作用:
    简化jsp⻚⾯编写代码
  • 语法格式:
    ①standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下
    ②在JSP页面中引入<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>

功能范围

前缀

uri

core

c

http://java/sun.com/jsp/jstl/core

i18n

fmt

http://java/sun.com/jsp/jstl/fmt

sql

sql

http://java/sun.com/jsp/jstl/sql

xml

x

http://java/sun.com/jsp/jstl/xml

functions

fn

http://java/sun.com/jsp/jstl/function

核心标签

核心标签是最常用的 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

① <c:set>
主要⽤来将变量存储⾄JSP范围中 或是JavaBean的属性或Map对象中

名称

说明

是否必须写

默认值

Value

要被存储的值



var

存⼊的变量名称



scope

var变量的JSP范围


Page

target

JavaBean或Map对象



property

指定target对象的属性



② <c:out>
主要用来显示数据的内容

名称

说明

是否必须写

默认值

value

需要显示出来的值



default

如果value的值为null,则显示default的值



escapeXml

是否转换特殊字符,如:<转换成 & lt;


True

③ <c:remove>
主要负责移除变量

名称

说明

是否必须写

默认值

Var

欲移除的变量名称



Scope

var变量的jsp范围


Page

④ <c:if>
主要用于进行if判断,如果为true,则输出标签体中的内容

名称

说明

是否必须写

默认值

Test

表达式的结果为true,则执⾏体内容,false则相反



var

如果用来存储test运算的结果(true或false)



scope

Var变量的JSP范围


page

⑤ <c:choose>,<c:when>,<c:otherwise>
作用相当于if-else

名称

说明

是否必须写

默认值

test

如果表达式的结果为true,则执⾏体内容,false则相反



⑥ <c:forEach>
循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍

名称

说明

是否必须写

默认值

var

⽤来存放现在指定的成员



items

被迭代的集合对象



varStatus

⽤来存放现在指的相关成员信息



begin

开始的位置


0

end

结束的位置


最后⼀个成员

step

每次迭代的间隔数


1

格式化标签:

① fmt:formatDate

  • 作用
    将日期类型格式化为指定模式的字符串

属性

描述

value

将要被格式化的数据

pattern

格式化的模式,与SimpleDateFormat的参数设置⼀样

var

格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在⻚⾯

scope

变量存放的域属性空间,默认page

type

其取值为date、time、both,表示给出的value是⽇期、时间、还是两者都包含,默认是date

②fmt:parseDate

  • 作用
    用于将指定字符串转化为日期类型

<fmt:parseDate value="${now }" pattern=“yyyy-MM-dd” var=“today”/>

属性

描述

Value

服务器获取的时间

Pattern

转换的格式

Var

页面显示的变量

③ fmt:formatNumber

  • 作用
    按照指定格式对数字进行格式化

属性

描述

maxIntegerDigits

整数部分最多的位数

minIntegerDigits

整数部分最少的位数

maxFrctionDigits

小数部分最多的位数

minFrctionDigits

小数部分最少的位数

var

存储格式化结果的变量

scope

var属性的作⽤域

integerOnly

是否只解析整型数true或者浮点数false