【Javaweb】JSP基础教程


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代码以流的方式写回浏览器)

在这里插入图片描述


JSP生命周期

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

类似于servlet生命周期(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" %>
属性名属性值描述
languagejava解释该JSP⽂件时采⽤的语⾔,⼀般为java语⾔,默认为java
extends任何类的全名编译该JSP⽂件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等⽅法
import任何包名、类名引⼊该JSP中⽤到的类、包等,import是唯⼀可以声明多次的page指令属性,⼀个import可以引⽤uogelei,中间⽤英⽂逗号隔开<%@ page import=包名.类名,包名.类名%>
sessiontrue、false该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使⽤,否则反之,默认为true
autoFlushtrue,false是否运⾏缓存,如果为true,则使⽤out.println()等⽅法输出的字符串并不是⽴刻到达客户端服务器的,⽽是暂时存到缓存⾥,缓存满了或者程序⾏完毕或者执⾏out.flush()操作时才到客户端,默认为true
buffernone或者数字KB指定缓存大小,当autoFlush设为true时有效,例如<%@ pagebuffer=10kb%>
isThreadSafetrue,false是否线程安全,如果为true,则运⾏多个线程同时运⾏该jsp程序,否则只运⾏⼀个线程,其余线程等待,默认为false
isErrorPagetrue,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设置编码⼀起,作⽤是通知服务器和浏览器都使⽤同⼀个码表
pageEncodingUTF8,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 对象


状态码

状态码消息描述
100Continue只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求
101Switching Protocols服务器交换机协议
200OK请求被确认
201Created请求时完整的,新的资源被创建
202Accepted请求被接受,但未处理完
300Multiple Choices一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接
301Moved Permanently被请求的页面已经移动到了新的URL下
302Found被请求的页面暂时性地移动到了新的URL下
303See Other被请求的页面可以在一个不同的URL下找到
306Unused已经不再使用此状态码,但状态码被保留
307Temporary Redirect被请求的页面暂时性地移动到了新的URL下
400Bad Request服务器无法识别请求
401Unauthorized被请求的页面需要用户名和密码
402Payment Required目前还不能使用此状态码
403Forbidden禁止访问所请求的页面
404Not Found服务器无法找到所请求的页面
405Method Not Allowed请求中所指定的方法不被允许
406Not Acceptable服务器只能创建一个客户端无法接受的响应
407Proxy Authentication Required在请求被服务前必须认证一个代理服务器
408Request Timeout请求时间超过了服务器所能等待的时间,连接被断开
409Conflict请求有矛盾的地方
410Gone被请求的页面不再可用
411Length Required "Content-Length"没有被定义,服务器拒绝接受请求
412Precondition Failed请求的前提条件被服务器评估为false
413Request Entity Too Large因为请求的实体太大,服务器拒绝接受请求
414Request-url Too Long服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息
415Unsupported Media Type服务器拒绝接受请求,因为媒体类型不被支持
500Internal Server Error请求不完整,服务器遇见了出乎意料的状况
501Not Implemented请求不完整,服务器不提供所需要的功能
502Bad Gateway请求不完整,服务器从上游服务器接受了一个无效的响应
503Service Unavailable请求不完整,服务器暂时重启或关闭
504Gateway Timeout网关超时
505HTTP 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。可以与其他值进⾏⽐较,或与布尔型、字符串型、整型或浮点型⽂字进⾏⽐较
EmptyEmpty操作符是⼀个前缀操作符⽤于判断⼀个值是否为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
corechttp://java/sun.com/jsp/jstl/core
i18nfmthttp://java/sun.com/jsp/jstl/fmt
sqlsqlhttp://java/sun.com/jsp/jstl/sql
xmlxhttp://java/sun.com/jsp/jstl/xml
functionsfnhttp://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存⼊的变量名称
scopevar变量的JSP范围Page
targetJavaBean或Map对象
property指定target对象的属性

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

名称说明是否必须写默认值
value需要显示出来的值
default如果value的值为null,则显示default的值
escapeXml是否转换特殊字符,如:<转换成 & lt;True

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

名称说明是否必须写默认值
Var欲移除的变量名称
Scopevar变量的jsp范围Page

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

名称说明是否必须写默认值
Test表达式的结果为true,则执⾏体内容,false则相反
var如果用来存储test运算的结果(true或false)
scopeVar变量的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存储格式化结果的变量
scopevar属性的作⽤域
integerOnly是否只解析整型数true或者浮点数false

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selcouther

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值