【JavaWeb】Jsp基本教程

目录

  • JSP概述
    • 作用
    • 一个简单的案例:使用JSP页面输出当前日期
  • JSP处理过程
  • JSP 生命周期
    • 编译阶段
    • 初始化阶段
    • 执行阶段
    • 销毁阶段
    • 案例
  • JSP页面的元素
    • JSP指令
      • JSP中的page指令
      • Include指令
        • 示例
      • taglib指令
    • JSP中的小脚本与表达式
    • JSP中的声明
    • JSP中的注释
      • HTML的注释
      • JSP注释
    • JSP行为

JSP概述

  • JSP(全称Java Server Pages)是一种动态网页开发技术。是由 Sun公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
  • JSP 技术是以 Java 语言作为脚本语言的,使用HTML嵌套Java代码实现,运行在服务器端的Java页面。
  • JSP文件后缀名为 *.jsp 。
  • JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows上。

作用

  • 替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)
  • 就是显示网页的,和HTML有什么区别?就是我们的jsp页面可以嵌套java代码
  • 可以和Servlet完美的契合

一个简单的案例:使用JSP页面输出当前日期

<%@ page language="java" import="java.util.*,java.text.*" 
	contentType= "text/html; charset=utf-8" %>
<html>
    <head>
        <title>输出当前日期</title>
    </head>
    <body>
        你好,今天是
        <% SimpleDateFormat formater =new SimpleDateFormat("yyyy年 MM月dd日");
    	    String strCurrentTime = formater.format(new Date()); %>	
        <%=strCurrentTime %>
    </body>
</html>

在这里插入图片描述

JSP处理过程

在这里插入图片描述
第一次请求之后,Web容器可以重用已经编译好的字节码文件
在这里插入图片描述
如果对JSP文件进行了修改,Web容器会重新对JSP文件进行翻译和编译

以下步骤表明了Web服务器是如何使用JSP来创建网页的:

  1. 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
  2. Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
  3. JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
  4. JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
  5. Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
  6. Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
  7. 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。

一般情况下,JSP引擎会检查JSP文件对应的servlet是否已经存在,并且检查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于对应的servlet,那么容器就可以确定JSP文件没有被修改过并且servlet有效。这使得整个流程与其他脚本语言(比如PHP)相比要高效快捷一些。

总的来说,JSP网页就是用另一种方式来编写servlet而不用成为Java编程高手。除了解释阶段外,JSP网页几乎可以被当成一个普通的servlet来对待。

JSP 生命周期

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

以下是JSP生命周期中所走过的几个阶段:

编译阶段

servlet容器编译jsp源文件,生成servlet类
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:

  • 解析JSP文件。
  • 将JSP文件转为servlet。
  • 编译servlet。

初始化阶段

加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:

public void jspInit(){
  // 初始化代码
}

以般来讲程序只初始化一次,servlet也是如此。通常情况下您可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。

执行阶段

调用与JSP对应的servlet实例的服务方法
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。

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

_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样:

void _jspService(HttpServletRequest request,HttpServletResponse response)
{
   // 服务端处理代码
}

_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。

销毁阶段

调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。

jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。

jspDestroy()方法的格式如下:

public void jspDestroy()
{
   // 清理代码
}

案例

创建一个index.jsp 将下面的 代码 复制到 jsp页面中 然后运行Tomcat

访问http://localhost:9090/kgcSmbms/index.jsp 看看 控制台打印效果 已经页面显示的内容
在这里插入图片描述

在这里插入图片描述
关闭tomcat
在这里插入图片描述

JSP页面的元素

在这里插入图片描述

JSP指令

JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

JSP指令语法格式:<%@ directive attribute="value" %>
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。

JSP中的三种指令标签:

指令描述
<%@ page … %>定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义

JSP中的page指令

作用:通过设置内部的多个属性定义整个页面的属性

属性描述
buffer指定out对象使用缓冲区的大小
autoFlush控制out对象的 缓存区
contentType指定当前JSP页面的MIME类型和字符编码
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends指定servlet从哪一个类继承
import导入要使用的Java类
info定义JSP页面的描述信息
isThreadSafe指定对JSP页面的访问是否为线程安全
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session
isELIgnored指定是否执行EL表达式 (默认true)
isScriptingEnabled确定脚本元素能否被使用
pageEncoding当前页面的编码格式

Include指令

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。最后会被整合 成一个 Servlet .class

注意: 使用 include 指令是以静态方式包含文件 简单来说就是合二为一 ,原封不动地附加到当前文件中 所以要避免重复的代码 和变量 等逻辑。

例如:里面不要包含 … 这样的标签,因为是把源代码原封不动的附加过来,所以会与当前的jsp中的这样的标签重复导致出错。

但是也是有好处的 就是 js 和jsp … 变量方法等共享 你可以在 Include指令 后面修改包含页面内 变量的内容 从而改变包含页面的状态

为了避嫌 html 和jsp 中文乱码的情况 在项目的web.xml中添加

  <jsp-config>
    <jsp-property-group>
      <url-pattern>*.html</url-pattern>
      <url-pattern>*.jsp</url-pattern>
      <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
  </jsp-config>

语法:<%@ include file=“url” %>

示例
<%@ page language="java" contentType="text/html; charset=UTF-8"  isELIgnored="true" pageEncoding="UTF-8" %>
<html>
<head>
    <title>index</title>
</head>
<body>
<%@ include file="index1.html" %>
<%@ include file="index1.jsp" %>
<h1>index.jsp</h1>

</body>
</html>

taglib指令

在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”

Taglib指令的语法:<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。

比如引入JSTL标签库<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

JSP中的小脚本与表达式

在JSP页面中计算两个数的和,将结果输出显示

<%@ page language="java" import="java.util.*,java.text.*" contentType="text/html; charset=utf-8" %>
<html>
	<head><title>计算求和</title></head>
	<body>
		两个数的求和结果为:
		<%
			int numA = 4, numB = 5 ;
			int result = numA+numB;
		%>
		<%=result %>
	</body>
</html>

JSP中的声明

作用:JSP页面中定义方法
语法:<%! Java代码%>

<%@ page language="java" import="java.util.*,java.text.*"  
    contentType="text/html; charset=utf-8"%>
<html>
<%!
    String formatDate(Date d){
        SimpleDateFormat formater = 
             new SimpleDateFormat("yyyy年MM月dd日");
return formater.format(d); }
%>你好,今天是
<%=formatDate(new Date()) %>
</body>
</html>

JSP中的注释

HTML的注释

F12查看页面源码可见

<!-- html注释-->

JSP注释

F12查看页面源码不可见

<%-- JSP注释--%>

<% //单行注释 %> 
<%  /*多行注释 */ %>

JSP行为

JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。

行为标签只有一种语法格式,它严格遵守XML标准:<jsp:action_name attribute="value" />
行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:

语法描述
jsp:include用于在当前页面中包含静态或动态资源
jsp:useBean寻找和初始化一个JavaBean组件
jsp:setProperty设置 JavaBean组件的值 配合 jsp:useBean使用
jsp:getProperty输出某个JavaBean的属性。 配合 jsp:useBean 使用
jsp:forward把请求转到一个新的页面 (转发)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

llinux进程控制

学习进程创建,fork/vfork 学习到进程等待 学习到进程程序替换, 微型shell&#xff0c;重新认识shell运行原理 学习到进程终止,认识$? fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程…

PostgreSQL入门到实战-第十五弹

PostgreSQL入门到实战 PostgreSQL数据过滤(八)官网地址PostgreSQL概述PostgreSQL中LIKE命令理论PostgreSQL中LIKE命令实战更新计划 PostgreSQL数据过滤(八) 如何使用PostgreSQL LIKE运算符基于模式查询数据。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一…

Commitizen:规范化你的 Git 提交信息

简介 在团队协作开发过程中&#xff0c;规范化的 Git 提交信息可以提高代码维护的效率&#xff0c;便于追踪和定位问题。Commitizen 是一个帮助我们规范化 Git 提交信息的工具&#xff0c;它提供了一种交互式的方式来生成符合约定格式的提交信息。 原理 Commitizen 的核心原…

人工智能分类算法概述

文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式&#xff0c;将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用&#xff0c;如图…

每日一题(leetcode2529):正整数和负整数的最大计数--二分法

因为需要O&#xff08;logn&#xff09;的复杂度&#xff0c;所以考虑使用二分法&#xff0c;先找到负数里面的最大下标&#xff08;初始值定为-1&#xff09;&#xff0c;再找到第一个正数的下标&#xff08;初始值定为数组长度值&#xff09;。最后求出个数并进行比较即可。 …

操作系统的基础知识:操作系统的特征:并发,共享,虚拟,异步

操作系统的特性&#xff1a; 1.并发 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的&#xff0c;但微观上是交替注意&#xff1a;并行:指两个或多个事件在同一时刻同时发生。 操作系统的并发性指计算机系统中“同时”运行着多个程序&#xff0c;这…

【Entity Framework】聊聊EF中键

【Entity Framework】聊聊EF中键 文章目录 【Entity Framework】聊聊EF中键一、概述二、配置主键2.1 约定配置主键2.2 单个属性配置为实体主键2.3 组合主键 三、主键名称四、键类型和值五、备用键 一、概述 键用作每个实体实例的唯一标识符。EF中的大多数实体都有一个键&#…

langchain-chatchat加载Azure Open AI

1.找到knowledge_base_chat.py文件中的get_ChatOpenAI函数 2.按crtl进入get_ChatOpenAI函数位置 3.注释原先的get_ChatOpenAI函数&#xff0c;修改成以下内容&#xff1a; def get_ChatOpenAI(model_name: str,temperature: float,streaming: bool True,callbacks: List[Ca…

5款最值得推荐的电脑监控软件丨高人气甄选

在企业和学校等场所&#xff0c;电脑监控软件被广泛应用于员工或学生的行为管理。 通过监控软件&#xff0c;管理者可以了解员工或学生的学习和工作情况&#xff0c;及时发现并纠正不当行为&#xff0c;提高工作效率和学习效果。同时&#xff0c;这类软件还可以用于保护企业机…

13 指针(上)

指针是 C 语言最重要的概念之一&#xff0c;也是最难理解的概念之一。 指针是C语言的精髓&#xff0c;要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方&#xff0c;就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…

SQL注入的其他攻击思路方法与Python脚本设计思路

SQL注入的其他攻击思路方法与Python脚本设计思路 也是很早就写了&#xff0c;也备个份吧 注意&#xff1a;在接下来的攻击方式中&#xff0c;由于实现的条件较为苛刻&#xff0c;并且需要较高权限&#xff0c;有的师傅又称之为高权限攻击 利用文件读取进行SQL注入 上一篇文章提…

mysql8主从复杂原理分析

MySQL 复制&#xff08;Replication&#xff09; 是官方提供的主从复制&#xff08;源到副本的复制&#xff09;方案&#xff0c;用于将一个 MySQL 的实例同步到另一个实例中。 这是使用最广泛的容灾方案&#xff08;重点掌握&#xff09;。 复制&#xff08;Replication&…

编译器如何理解C++的指针和引用?

初学引用时&#xff0c;往往很难真正理解引用&#xff0c;它与指针究竟有什么区别和联系。下面我们不妨看看编译器如何理解引用和指针的。 一.函数通过指针传参 1.1 示例代码 #include <iostream>using namespace std;void swap(int *x,int *y)//指针传参 {int tmp;t…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 &#xff08;1&#xff09;计算效率高 ReLU函数数学形式简单&#xff0c;仅需要对输入进行阈值操作&#xff0c;大于0则保留&#xff0c;小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快&#xff0c;降低了神经…

agi入门-大模型开发基础

AGI(Artifical General Inteligence)的到来还有多久&#xff1f; 乐观预测&#xff1a;明年主流预测&#xff1a;3-5年悲观预测&#xff1a;10年 AGI时代&#xff0c;AI无处不在&#xff0c;相关从来者将如何分&#xff1f; AI使用者&#xff1a;使用别人开发的AI产品AI产品…

让链接直接唤起应用,Xinstall助力提升用户体验

在移动互联网时代&#xff0c;应用程序已成为我们日常生活的重要组成部分。然而&#xff0c;有时候我们在浏览器或其他应用中看到一个有趣的链接&#xff0c;想要打开对应的应用查看更多内容&#xff0c;却需要手动复制链接&#xff0c;再打开应用粘贴查看。这样的操作繁琐且不…

Backtrader 量化回测实践(6)——量化回测评价工具Quantstats

Backtrader 量化回测实践&#xff08;6&#xff09;——量化回测评价工具Quantstats 1.概述 Quantstats是用于量化金融分析和投资组合优化的Python库。该库提供了各种工具&#xff0c;可从不同来源获得金融数据&#xff0c;进行技术和基本分析&#xff0c;并创建和测试投资策…

VPP 负载均衡测试代码

1. 均衡的测试思想和流程说明。 先说一下理论&#xff0c; 然后后边才知道 代码逻辑。 调试了两天&#xff0c;这个代码终于通了。 由于时间关系&#xff0c; 画了一个粗略的图。另外这个代码只是流程通了&#xff0c;不过要帮助理解负载均衡我认为已经足够了。 下面是windo…

什么是企业邮箱?如何选择合适的企业邮箱?

企业邮箱和个人邮箱不同&#xff0c;它的邮箱后缀是企业自己的域名。企业邮箱供应商一般都提供手机app、桌面端、web浏览器访问等邮箱使用途径。那么什么是企业邮箱&#xff1f;如何选择合适的企业邮箱&#xff1f;好用的企业邮箱应具备无缝迁移、协作、多邮箱管理等功能。 企…