JSP基础_file用到了jsp引擎?-程序员宅基地

技术标签: Java学习  # Javaweb  jsp  

什么是jsp?
    JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
    JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
    JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。
为什么使用jsp?
性能更加优越,JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API。
jsp处的位置

image-20210219104945712

JSP处理流程
  1. 浏览器发送一个 HTTP 请求给服务器。
  2. Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。
  3. JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。
  4. JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。
  5. Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
  6. Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到浏览器中。
  7. Web 浏览器处理 HTTP response 中动态产生的HTML网页。

img

JSP生命周期

JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet.

image-20210219105739027

  1. JSP编译

    当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。

  2. JSP初始化

    容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,重写jspInit()方法就行。

  3. JSP执行

    这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。

    当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。

    void _jspService(HttpServletRequest request,HttpServletResponse response){
         
          
       // Todo
    }
    
  4. JSP销毁

    JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法。

    public void jspDestroy(){
         
          
       //清理
    }
    
  5. JSP生命周期代码测试:

    <%@ 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>
    	<%! 
    	//声明变量
    		private int initCnt = 0;
    		private int serviceCnt = 0;
    		private int destroyCnt = 0;
    	%>
    	<%!
    	//初始化方法
      	public void jspInit(){
    		initCnt++;
        	System.out.println("jspInit(): JSP被初始化了"+initCnt+"次");
      	}
    	//销毁方法
      	public void jspDestroy(){
      		destroyCnt++;
        	System.out.println("JSP被销毁了"+destroyCnt+"次");
      	}
    	%>
    	<%
    		serviceCnt++;
    		System.out.println("Jsp响应了"+serviceCnt+"次");
    		String initString="初始化次数 : "+initCnt;
    		String serviceString="响应客户请求次数 : "+serviceCnt;
    		String destroyString ="销毁次数 : "+destroyCnt;
    	%>
    	<h1>结果如下:</h1>
    	<p><%= initString%></p>
    	<p><%= serviceString%></p>
    	<p><%= destroyString%></p>
    </body>
    </body>
    </html>
    
    结果如下:(Tomcat 9.0 + jdk1.8)

    初始化次数 : 1

    响应客户请求次数 : 1

    销毁次数 : 0

jsp相关语法:
1.<% %>叫做脚本片段,其中写的内容会翻译在Servlet的Service方法中,显然我们可以在Service方法中定义局部变量或者调用其他方法,但是不能在Service中再定义其他的方法,也就是我们可以在<%%>中定义局部变量或者调用方法,但不能定义方法。在jsp页面可以有多个脚本片段,但是多个脚本片段之间要保证结构完整。
2.<%!%>称作声明,其中写的内容将来会直接翻译在Servlet类中,因为我们可以在类中定义方法和属性以及全局变量,所以我们可以在<%!%>中声明方法、属性、全局变量。
3.<%=%>称作jsp表达式,用于将已经声明的变量或者表达式输出到网页上面。
4.直接写在jsp页面<body></body>中的代码称作模板元素,将来会Servlet的Service方法out.write("___")中,作为输出内容。
编写与其等价的XML语句<jsp:scriptlet>代码片段</jsp:scriptlet>。
<%-- jsp注释 --%>注释内容不会被发送
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40624026/article/details/113866531

智能推荐

Word插件开发

创建一个新的 Office 插件项目:在 Visual Studio 中,选择"文件" -> “新建项目”,然后在模板中选择"Office/SharePoint",选择适当的 Office 插件项目模板,如 Word 插件、Excel 插件或 PowerPoint 插件。设计用户界面:在解决方案资源管理器中,打开你的插件项目,并在其中打开相应的 Office 文件(如 Word 文件、Excel 文件或 PowerPoint 文件)。你可以在 Office 应用中测试插件的功能,并在开发过程中进行调试。

便携式iv检测仪解析

在应用场景方面,便携式IV功率测试仪广泛应用于光伏电站的日常运维、光伏组件生产过程中的质量控制以及光伏项目的前期评估等环节。在光伏电站运维中,定期对光伏组件进行IV测试,可以及时发现性能下降或损坏的组件,为电站的运维提供有力支持。首先,从工作原理来看,光伏电站便携式IV功率测试仪通过模拟太阳光照射光伏组件,并测量组件在不同电压下的电流输出,从而绘制出IV曲线。此外,测试仪还可以计算光伏组件的功率输出、转换效率等参数,为用户提供全面的性能评估。

postgresql 索引之 hash_load_categories_hash postgres-程序员宅基地

文章浏览阅读3.6k次。os: ubuntu 16.04postgresql: 9.6.8ip 规划192.168.56.102 node2 postgresqlhelp create indexpostgres=# \h create indexCommand: CREATE INDEXDescription: define a new indexSyntax:CREATE [ UNIQUE ..._load_categories_hash postgres

face++实现人脸识别及人脸相似度对比_face++人脸识别 html5-程序员宅基地

文章浏览阅读4.8k次。使用face++,先获取key和secret下方是人脸识别,还添加了画出人脸轮廓的正方形下方是人脸识别,还添加了画出人脸轮廓的正方形 import requests#网络访问控件 from json import JSONDecoder#互联网数据交换标准格式 import cv2 as cv#图像处理控件 http_url =&amp;amp;amp;quot;https://a..._face++人脸识别 html5

desencrypt java md5_Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类-程序员宅基地

文章浏览阅读322次。很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了import java.io.IOException;import java.security.MessageDigest;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;im..._java desencrypt.encrypt(pass)

BZOJ 2818 欧拉函数,线性筛_线性筛预处理质数表, 并求出欧拉函数, 预处理前缀和即可 bzoj2818boj-程序员宅基地

文章浏览阅读145次。题目链接:https://www.acwing.com/problem/content/description/222/给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。GCD(x,y)即求x,y的最大公约数。输入格式输入一个整数N输出格式输出一个整数,表示满足条件的数对数量。数据范围1≤N≤10^7输入样例:4..._线性筛预处理质数表, 并求出欧拉函数, 预处理前缀和即可 bzoj2818boj

随便推点

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

【数据结构】静态表查找之顺序查找、二分查找、分块查找_读取表元是什么意思-程序员宅基地

文章浏览阅读4.1k次,点赞8次,收藏23次。​通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。_读取表元是什么意思

如何设置交易滑点?精确到tick 测算期货冲击成本(附源码)_滑点设置多少合适-程序员宅基地

文章浏览阅读8.3k次,点赞4次,收藏18次。我们在非撮合回测模式下,因为无法获知交易价格当时的真实盘口价差、挂单数量,常主观设定一个滑点均值,比如针对螺纹钢等合约,设置 1 跳,针对某些交易不活跃的品种,设置 2 跳。但是这种近乎拍脑袋的方法并不精确。我们今天尝试通过简单的辅助工具,实现尽可能接近准确的 tick 级别滑点设置,代码已写好,不用编程也可获得结果。_滑点设置多少合适

大数据技术之 Azkaban_azkaban要建立job之间的依赖关系需要使用-程序员宅基地

文章浏览阅读551次。尚硅谷大数据技术之 Azkaban—————————————————————————————更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网尚硅谷大数据技术之 Azkaban(作者:尚硅谷大数据研发部)版本:V3.0一 概述1.1 什么是 AzkabanAzkaban 是由 Linkedin 公司推出的一个批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的 key:value 对的方式,通过配置中_azkaban要建立job之间的依赖关系需要使用

python批量修改文件编码格式,由utf-16 le 格式转为utf-8_utf16le转换utf8-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏9次。#! python3# encoding: utf-8import osimport chardetdef strJudgeCode(str1): return chardet.detect(str1)"""def readFile(path): with open(path,'r',encoding='utf-16 le') as f: filecontent ..._utf16le转换utf8