JSP的基本使用总结

news2024/11/20 15:21:49

JSP的基本使用总结

🏠个人主页:shark-Gao

🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉

🎉目前状况:23届毕业生,目前在某公司实习👏👏

❤️欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

🖥️个人小站 :个人博客,欢迎大家访问

JSP的使用

一、JSP的介绍与创建

  1. JSP的全称是Java Server Pages,即Java的服务器页面
  2. JSP的主要作用是代替Servlet程序回传HTML页面的数据
  3. web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建

二、JSP的本质

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:

在这里插入图片描述

而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序

三、JSP的语法

JSP头部的page指令:
在这里插入图片描述
JSP头部的page指令可以修改JSP页面中的一些重要属性或行为
(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值):

  1. contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值
  2. language属性:表示JSP翻译之后是什么语言文件(目前只支持Java)
  3. pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到)
  4. import属性:表示导包(导类),与Java一致
  5. autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true
  6. buffer属性:设置out缓冲区的大小,默认是8kb
    注意:out缓冲区满了之后不能自动刷新的话会报错
  7. errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径,这个 路径一般都是以斜杠打头,表示请求的地址是http://ip:port/工程路径/,对应代码web目录
  8. isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息
  9. session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true
  10. extends属性:设置JSP页面翻译出来的Java类默认继承谁

注意:以上默认值除非有特殊需要,否则不建议修改

四、JSP中的常用脚本

1. 声明脚本

格式:<%! 声明Java代码 %>
作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等
特点:不会在浏览器的页面上显示出来,仅存在于翻译后的Java类中

代码演示:声明脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--1.声明类属性--%>
    <%!
        private String name;
        private static Map<String, Object> map;
    %>
    <%--2.声明类方法--%>
    <%!
        public int sum() {
            return 12;
        }
    %>
    <%--3.声明静态代码块--%>
    <%!
        static {
            map = new HashMap<String, Object>();
            map.put("key1", "value1");
        }
    %>
</body>
</html>

对应的翻译后的java源文件:
image-20230420214011482

2. 表达式脚

格式:<%=表达式 %>
作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
特点:
(1) 所有的表达式脚本都会被翻译到对应的Java类的_jspService()方法中,故表达式脚本可以 直接使用_jspService()方法参数中的对象
(2) 表达式脚本都会被编译后的Java类中的out.print()方法输出到浏览器页面上
(3) 表达式脚本中的表达式不能以分号结束

代码演示:表达式脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%=22 %> <br/>
<%="可以输出字符串" %> <br/>
<%=map %> <br/>
<%--使用_jspSe=rvice方法中的对象--%>
<%=request.getParameter("username") %>

启动Tomcat服务器后浏览器的运行结果:

image-20230420215909834
对应的翻译后的Java源文件(在_jspService方法中):

image-20230420214025714
注意:

  1. write方法中的标签、转义字符自动识别为对应的
    功能,不在页面输出,执行各自代表的功能
  2. out的两个方法也在_jspService方法中,也都是java语言
  3. 只有print、write方法、表达式脚本中的内容才可在浏览器中显示,其余Java代码的sout在控制台输出

3. 代码脚本

格式:<% Java语句 %>
作用:在JSP页面中可以编写需要的Java代码
特点:
(1) 代码脚本翻译后都在_jspService方法中,故代码脚本可以直接使用此方法参数中的对象
(2) 可以由多个代码脚本块组合完成一个完整的Java语句
(3) 代码脚本还可以和表达式脚本一起组合使用,在JSP页面上输出数据

代码演示:代码脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%--1.if语句--%>
<%
    int i = 1;
    if (i == 1) {
        System.out.println("我爱祖国!");
    } else {
        System.out.println("我很爱祖国!");
    }
%> <br/>
<%--2.for循环语句--%>
<%
    for (int j = 0 ; j < 3; j++) {
        System.out.println("第" + j + "次循环");
    }
%> <br/>
<%--3.使用_jspService方法参数中的对象--%>
<%
    String username = request.getParameter("username");
    System.out.println("username对应的值为:" + username);
%>

运行结果:
启动Tomcat服务器后在地址栏输入:http://localhost:8080/MyTest/First.jsp?username=Jaychou

对应的翻译后的Java源文件(在_jspService方法中):

image-20230420214046289

五、JSP三种注释

  1. HTML注释:<!--HTML注释-->
    HTML注释会被翻译到JSP文件对应的Java类的_jspService方法中,以out.write()输出到客户端,
    write方法会自动识别标签,执行标签对应的功能,不会在浏览器的页面上输出注释
  2. Java注释:(1) //单行注释 (2) /*多行注释*/
    Java注释要写在声明脚本和代码脚本中才被认为是Java注释,会被翻译到JSP文件对应的Java类的_jspService方法中,在对应的Java类中也是注释
  3. JSP注释:<%- -这是JSP注释- -%>
    JSP注释中的内容不会在JSP文件翻译后的Java类中出现,即注释中的内容没有任何功能

六、JSP九大内置对象

JSP的内置对象指的是Tomcat服务器将JSP页面翻译为Java类之后内部提供的九大对象:
(将page指令的isErrorPage属性写成true可以出现exception对象)

image-20230420214110236

request:请求对象
response:响应对象
pageContext:JSP的上下文对象
session:会话对象
application:ServletContext对象
config:ServletConfig对象
out:JSP输出流对象
page:指向当前JSP的对象
exception:异常对象

七、JSP四大域对象

在这里插入图片描述
域对象是指可以像Map一样存取数据的对象,四个域对象功能一样,只是对数据的存取范围不同

代码演示1:四个域对象存取数据的范围的不同(在web目录下创建scope1.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope1</title>
</head>
<body>
    <h1>scope1.jsp页面</h1>
    <%
        //向四个域对象中分别保存数据
        pageContext.setAttribute("key", "pageContext");
        request.setAttribute("key", "request");
        session.setAttribute("key", "session");
        application.setAttribute("key", "application");
    %>
    <%-- <jsp:forward page=""></jsp:forward>是请求转发标签,
         page属性设置请求转发的路径 --%>
    <jsp:forward page="/scope2.jsp"></jsp:forward>
</body>

代码演示2:在web目录下创建scope2.jsp

<head>
    <title>Title</title>
</head>
<body>
    <h1>scope2.jsp页面</h1>
    <%-- JSP页面中不加任何标签直接输入的内容被write方法输出在浏览器的页面上   --%>
    pageContext域是否有值:<%=pageContext.getAttribute("key")%> <br>
    request域是否有值:<%=request.getAttribute("key")%> <br>
    session域是否有值:<%=session.getAttribute("key")%> <br>
    application域是否有值:<%=application.getAttribute("key")%> <br>
</body>

运行结果1:

image-20230420220950663

八、JSP的out输出和response.getWriter输出的异同

  1. 相同点:response表示响应,用于给客户端(浏览器)返回内容
    out同样也是用于给客户端(浏览器)输出内容

  2. 不同点:

    image-20230421140703865
  3. 注意:由于官方的代码中翻译后的Java代码底层都是使用out进行输出,故一般都使用out进行 输出,out又分为write方法和print方法:
    (1) out.print():会将任何内容转换成字符串后调用write方法输出
    (2) out.write():输出字符串没有问题,但输出int型时会将int转换成char输出,导致输出的并非是想要的数字而是数字对应的ASCII码
    结论:JSP页面的代码脚本中任何要输出在浏览器的内容均使用out.print()方法

九、JSP的常用标签

1. 静态包含

(1)使用场景:

image-20230421143000988

(2)使用方法:
<%@include file=“”%>
其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录

代码演示1:在web目录下创建body.jsp

<body>
    头部信息 <br>
    主体信息 <br>
    <%@include file="/foot.jsp"%>
</body>

代码演示2:在web目录下创建foot.jsp

<body>
    页脚信息 <br>
</body>

运行结果:

image-20230420222953777

(3)静态包含的特点:
①静态包含不会将被包含的JSP页面翻译成.java.class文件
②静态包含是把被包含的页面的代码拷贝到body.jsp对应的Java文件的对应位置执行输出

2. 动态包含

(1)使用方法:
<jsp:include page=””></jsp:include>
其中page属性设置要包含的JSP页面,与静态包含一致

(2)动态包含的特点:
①动态包含将被包含的JSP页面翻译成.java.class文件
②动态包含还可以传递参数
③动态包含底层使用如下代码调用被包含的JSP页面执行输出:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, “/foot.jsp”, out, false);

代码演示1:在web目录下创建body.jsp

<body>
    头部信息 <br>
    主体信息 <br>
    <jsp:include page="/foot.jsp">
        <jsp:param name="username" value="Jaychou"/>
        <jsp:param name="password" value="root"/>
    </jsp:include>
</body>

注意:

  1. 设置参数的标签要写在动态包含之中
  2. 出现Expecting “jsp:param” standard action with “name” and “value” attributes异常,两个原因:
    ①动态包含中未设置参数但没有把<jsp:include page=””></jsp:include>放在一行上
    ②动态包含中加了注释
    代码演示2:在web目录下创建foot.jsp
<body>
    页脚信息 <br>
    <%=request.getParameter("username")%>
</body>

运行结果:

image-20230420223010787

(3)动态包含的底层原理:

image-20230421140703865

2. ServletContextListener监听器

ServletContextListener监听器可以监听ServletContext对象的创建和销毁(web工程启动时创建,停止时销毁),监听到创建和销毁之后都会调用ServletContextListener监听器的方法进行反馈:

public interface ServletContextListener extends EventListener {
    //在ServletContext对象创建之后调用
    public void contextInitialized(ServletContextEvent sce);
    //在ServletContext对象销毁之后调用
    public void contextDestroyed(ServletContextEvent sce);
}
123456

3. ServletContextListener监听器的使用步骤

(1) 编写一个类实现ServletContextListener接口
(2) 重写两个方法
(3) 在web.xml文件中配置监听器

代码演示1:创建一个类

public class ListenerTest implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象创建");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象销毁");
    }
}

代码演示2:在web.xml中配置

<listener>
    <!-- <listener-class>标签中写上述程序的全类名 -->
    <listener-class>com.qizegao.servlet.ListenerTest</listener-class>
</listener>

运行结果:
Tomcat服务器启动之后控制台输出ServletContext对象创建
Tomcat服务器停止之后控制台输出ServletContext对象销毁

注意:

  1. 查看翻译后的Java源文件的方法:启动Tomcat服务器访问到JSP页面之后在控制台输出的信息的前端找到Using CATALINA_BASE中的路径,在硬盘中打开此目录,点击work --> Catalina --> localhost,找到对应的工程文件夹寻找即可
  2. 访问JSP页面其实是在执行对应的翻译后的Java代码的_jspService方法:翻译后的Java类中没有service方法,而是重写了父类的_jspService方法,这个方法会被父类的service方法调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海睿思分享 | 风控监管,守住企业生命线

1 企业如何应对市场风险 随着市场形势日益严峻&#xff0c;企业风险系数也在同步增加&#xff0c;一旦风险管理出现重大问题&#xff0c;将是致命的、灾难性的&#xff0c;可能导致企业出现生存危机。 风控监管的主要目的在于通过对各类风险进行识别、分析、监控&#xff0c…

【java web篇】MyBatis之Mapper代理

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

MacOS版本RedisDesktopManager源码编译

1. 克隆 : git clone --recursive https://github.com/RedisInsight/RedisDesktopManager.git 查看依赖模块: git submodule 编译注意事件,部分源码的子仓库依赖没有下载完整的,要手动下载 brotli子模块 编译brotli子模块 $ mkdir out && cd out $ ../configure-c…

助力春耕:数智驱动现代农业高质量发展

最近有部很有意思的综艺《种地吧&#xff01;少年》&#xff0c;节目内容就是十个少年要用192天的时间在142亩土地上&#xff0c;完成抢收水稻&#xff0c;抢种小麦&#xff0c;并在6月份完成小麦的收割&#xff0c;这样一个内容。 这个节目没有流量明星&#xff0c;而被吸引去…

MyBatis(十六)MyBatis使用PageHelper

一、limit分页 mysql的limit后面两个数字&#xff1a; 第一个数字&#xff1a;startIndex&#xff08;起始下标。下标从0开始。&#xff09; 第二个数字&#xff1a;pageSize&#xff08;每页显示的记录条数&#xff09; 假设已知页码pageNum&#xff0c;还有每页显示的记录…

K8s集群搭建-Kubeadm方式搭建集群【1.23.0版本】

文章目录 一、初始化准备二、安装kubeadm三、初始化Master集群四、将新的Node节点加入集群五、部署CNI网络插件六、其他配置 Kubernetes1.24(包括1.24)之后不在兼容docker,如果有需要兼容docker的需求&#xff0c;则安装一个 cri-docker的插件&#xff0c;本文使用的是kuberne…

【技巧】如何在微信与企业微信端实现自动化ChatGPT智能机器人服务?(WorkTool)

场景描述 对于使用企业微信办公协作的公司/团体/组织等&#xff0c;在工作的时候&#xff0c;经常需要通过群机器人的方式&#xff0c;回答群内成员的问题。 基于此&#xff0c;一些企业想要将ChatGPT的智能对话能力与企业微信群机器人的回复能力结合&#xff0c;在企业微信群…

VMware Site Recovery Manager 8.7 (for vSphere 8 U1) - 数据中心灾难恢复 (DR)

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-srm-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Site Recovery Manager 8.7 | 18 APR 2023 | Build 21590800 什么是 Site Recovery Manager (SRM)&#xff1…

【网络安全】CVE漏洞分析以及复现

漏洞详情 Shiro 在路径控制的时候&#xff0c;未能对传入的 url 编码进行 decode 解码&#xff0c;导致攻击者可以绕过过滤器&#xff0c;访问被过滤的路径。 漏洞影响版本 Shiro 1.0.0-incubating 对应 Maven Repo 里面也有 【一一帮助安全学习&#xff0c;所有资源获取一…

GrapeCity Documents for Imaging

GrapeCity Documents for Imaging 现在可以使用高斯模糊效果在整个输入图像或部分图像上基于高斯函数创建模糊。 在GcBitmap类中添加了IsBlackAndWhite和IsGrayscale。这些方法可以更快地检查图像是由黑白像素组成还是仅由灰度组成。 IsBlackAndWhite方法检查所有图像像素是不透…

回炉重造八--系统启动和内核管理

系统启动和内核管理 1、系统启动 1.1 centos7启动的过程 UEFI或BIOS初始化&#xff0c;运行post开机自检选择启动的设备&#xff08;USB、硬盘、本地光盘&#xff09;引导装载程序&#xff0c;centos7是给grub2加载装载程序的配置文件&#xff1a; /etc/grub.d/ /etc/default…

使用 Amazon Step Functions 和 Amazon Athena 实现简易大数据编排

很多公司都在亚马逊云上围绕 Amazon S3 实现了自己的数据湖。数据湖的建设涉及到数据摄入、清洗、转换&#xff0c;以及呈现等多个步骤&#xff0c;还需要对这些步骤进行编排&#xff0c;这对很多人手不足或者初识数据湖的团队形成了挑战。 在本篇文章中&#xff0c;我将介绍一…

可以一口气读完的算法书

算法&#xff01;Algorithms&#xff01; 咳咳&#xff01;很多人一听到这个词&#xff0c;估计脑袋就要炸了&#xff1a;一定又是复杂极了的东西&#xff0c;看来此书必定翻不过第一节&#xff0c;就要睡着了。 没错&#xff0c;很多算法书虽然写得很精妙&#xff0c;但凭我…

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务 准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务 准备工作 需要安装好nodejs&#xff0c;nodejs下载地址&#xff0c;下载对应的版本向导式安装即可。 安装完成后&#xff0c;控制台输入node -v…

OAID解密场景和对应策略,淘宝订单解密接口,淘宝订单明文接口

OAID解密场景和对应策略 场景编码 场景名称 返回的隐私字段 1001 顺丰电子面单发货 消费者手机号&#xff0c;姓名&#xff0c;详细地址 1002 4通一达电子面单发货 消费者手机号&#xff0c;姓名&#xff0c;详细地址 1003 EMS电子面单发货 消费者手机号&#xff0c…

Eclipse基本使用、数据类型、运算符

Eclipse基本使用 创建JAVA项目 1.打开新建项目窗口&#xff08;File --> New --> Project&#xff09; 2.在New Project窗口中选择Java Project创建项目 3.在New Java Project对话框 Project name&#xff1a;项目名称 Project Layout项目布局&#xff1a;Create sepa…

初识Node

Node.js是什么 Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱动、非阻塞式I/O 的模型。 Node.js 可以做什么 Nodejs作为一个JavaScript的运行环境&#xff0c;仅仅提供了基础的功能和API。然而&#xff0c;基于Node.js 提供的这些基础能…

【SCI征稿】SPRINGER旗下CCF1区计算机工程类SCI, 网格计算、储层计算、机器学习相关领域均可~

一、期刊简介&#xff1a; 1区计算机工程类SCI&EI (CCF) 【期刊概况】SPRINGER出版社&#xff0c;IF:4.0-5.0, JCR1/2区, 中科院2区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3个月左右录用&#xff1b; 【检索情况】SCI&EI双检&#xff1b; 【数据库收录…

Revit墙问题:系统自带幕墙偏移解决和墙翻模操作

一、关于Revit绘制默认幕墙会自动产生偏移问题的解决办法! 很多人在安装完Revit后绘制系统自带的幕墙会产生偏移! 首先我们要了解偏移产生的根源&#xff1a; 1、绘制的时候在偏移量里设置了偏移值! 2、幕墙嵌板族设置了偏移&#xff1a;这种问题一般分种情况&#xff1a; A&am…

Linux编译器 gcc与g++

Linux编译器 gcc/g工具 目录 Linux编译器 gcc/g工具1、程序的诞生2、gcc工具2.1 预处理2.2 编译2.3 汇编2.4 链接2.5 运行2.6 总结 3、静态链接与动态链接3.1 静态链接3.2 动态链接3.3 Linux下库的命名 1、程序的诞生 程序的编译过程&#xff1a; 1、预处理&#xff08;头文件包…