【JavaWeb】jsp

news2025/7/7 10:57:18

文章目录

  • ⭐️ 一.jsp概念及其作用
  • ⭐️ 二.jsp的本质
  • ⭐️三.jsp的三种语法
  • ⭐️四.jsp的九大内置对象
  • ⭐️五.jsp四大域对象
  • ⭐️六.jsp中的out输出和response.getWriter输出的区别
  • ⭐️七.jsp的常用标签
  • ⭐️八.Listener监听器

⭐️ 一.jsp概念及其作用

1.概念:jsp的全称是java server pages,java的服务器界面.
2.作用: 代替servlet程序回传html页面的数据.
因为servlet程序回传html页面的数据是一件非常繁琐的事情,开发成本和维护成本都极高.

  • 用servlet程序回传数据
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过响应的输出回传html页面数据
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("<!DOCTYPE html>");
        writer.write("<html lang=\"en\">\r\n");
        writer.write("<head>\r\n");
        writer.write("<meta charset=\"UTF-8\">\r\n");
        writer.write("<title>Title</title>\r\n");
        writer.write("</head>\r\n");
        writer.write("<body>\r\n");
        writer.write(" 这是html页面数据\r\n");
        writer.write("<body>\r\n");
        writer.write("</html>\r\n");
    }
  • 用jsp回传数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
a.jsp页面
</body>
</html>

⭐️ 二.jsp的本质

本质:是一个servlet程序

当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,并对它进行编译成为.class字节码程序

在这里插入图片描述

我们打开java源文件发现里面的内容为:

在这里插入图片描述
我们跟踪源代码发现,HttpJspBase类直接的继承了HttpServlet类.
也就是说,jsp翻译出来java类,间接的继承了HttpServlet类,也就是说翻译出来的是一个sevlet程序.
我们通过对翻译出来的Servlet程序的观察发现,其底层实现也是通过输出流,把html页面的数据回传给客户端.

⭐️三.jsp的三种语法

1.jsp头部的page指令
jsp的page指令可以修改jsp页面中一些重要的属性或者行为.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language属性 表示jsp翻译后是什么语言文件,暂时只支持ava.
contentType属性 表示jsp返回的数据类型是什么.也是源码中response.setContentType参数值
pageEncoding属性 表示当前jsp页面文件本身的字符集
import属性 跟java源代码一样,用于导包导类.
autoFlush属性 设置当out输出流缓冲区满了之后,是否自动刷新缓冲区,默认值是true
buffer属性 设置out缓冲区的大小,默认是8kb.
errorPage属性 设置当jsp页面运行出错时,自动跳转到错误页面的路径.
isErrorPage属性 设置当前jsp页面是否是错误页面,默认是false.
session属性 设置访问当前jsp页面,是否会创建HttpSession对象,默认是true.
extends属性 设置jsp翻译出来的java类默认继承谁.
注意:autoFlush属性和buffer属性是给out输出流使用.

2.jsp中的常用脚本
(1).声明脚本(极少用)
格式:<%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性方法甚至是静态代码块,内部类等.

<body>
//1.声明类属性
  <%!
    private Integer id;
    private String name;
    private static Map<String,Object> map;
  %>
  //2.声明static静态代码块
  <%!
     static{
       map = new HashMap<String,Object>();
       map.put("key1","value1");
       map.put("key2","value2");
       map.put("key3","value3");
      }
  %>
  //3.声明类方法
<%!
    public int abc(){
        return 12;
    }
%>
//4.声明内部类
<%!
    public static class A{
        private Integer id = 12;
        private String abc = "abc";
    }
%>
</body>

(2).表达式脚本(常用)
格式:<%=表达式%>
作用:在jsp页面上输出数据.
特点:
第一点:所有的表达式脚本,都会被翻译到_jspService方法中.
第二点:表达式脚本都会被翻译成为out.print()输出到页面上.
第三点:由于表达式脚本翻译的内容都在_jspService方法中,所以_jspService方法中的对象都可以直接使用.
第四点:表达式脚本中的表达式不能以分号结束.

<%--1.输出整形--%>
<%--2.输出浮点型--%>
<%--3.输出字符串--%>
<%--4.输出对象--%>
<%--5.获得请求参数--%>
<%=12 %> </br>
<%=12.12 %> </br>
<%="我是字符串" %> </br>
<%=map %> </br>
<%=request.getParameter("username")%>

(3).代码脚本
格式:<% java语句 %>
作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
特点:
第一点:代码脚本翻译后都在_jspService方法中.
第二点:代码脚本由于翻译到_jspService方法中,所以在_jspService方法中的现有对象都可以直接使用.
第三点:还可以由多个代码脚本块组合完成一个完整的java语句.
第四点:``代码脚本可以和表达式脚本一起组合使用,在jsp页面上输出数据.

<%--1.if语句--%>
<%--2.for语句--%>
<%--3.翻译后_jspService方法内的代码都可以写--%>
<%
    int i = 12;
    if(i == 12){
%>
     <h1>你好</h1>
<%
    }
%>
<table border="1" cellspacing="0">
<%
    for(int j = 0;j < 3;j++){
%>
    <tr>
        <td><%=j + 1%></td>
    </tr>
<%
    }
%>
<%
    String username = request.getParameter("username");
    System.out.println("用户名的请求参数值是:" + username);
%>

3.jsp中的三种注释
(1).html 注释
在这里插入图片描述html注释会被翻译到java源代码中,在_jspService方法中,以out.writer输出到客户端.

(2).java注释
在这里插入图片描述
java注释会被翻译到java源代码中.

(3).jsp注释
在这里插入图片描述
jsp注释可以注掉jsp页面中所有代码.

⭐️四.jsp的九大内置对象

在这里插入图片描述

⭐️五.jsp四大域对象

四个与域对象分别是:
pageContext (PageContextimpl类) 当前jsp页面范围内有效.
request (HttpServletRequest类) 一次请求内有效.
session (HttpSession类) 一个会话范围内有效,(打开浏览器访问服务器,直到关闭浏览器).
application (ServletContext类) 整个web工程范围内有效(只要web工程不停止,数据都在).

注意:
域对象可以像Map一样是存取数据的对象,四个域对象功能一样,但对数据的存取范围不同.
使用上的优先顺序: pageContext—request—session—application

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
    pageContext.setAttribute("key","pageContext");
    request.setAttribute("key","request");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
pageContext:<%= pageContext.getAttribute("key") %></br>
request:<%= request.getAttribute("key")%></br>
session:<%= session.getAttribute("key")%></br>
application:<%= application.getAttribute("key")%></br>
<%
    request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>
<h1>scope2.jsp页面</h1>
pageContext:<%=pageContext.getAttribute("key")%></br>
request:<%=request.getAttribute("key")%></br>
session:<%=session.getAttribute("key")%></br>
application:<%=application.getAttribute("key")%></br>
</body>

⭐️六.jsp中的out输出和response.getWriter输出的区别

response中表示响应,经常用于设置返回给客户端的内容(输出).
out也是给用户做输出使用的.
在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        <%
            out.write("输出</br>");
            out.flush();
            response.getWriter().write("输出r</br>");
        %>
</body>
</html>

注意:
(1).由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出,避免打乱页面输出内容的顺序.
(2).
out.write() 输出字符串没有问题
out.print() 输出任何数据都没有问题.(统一使用)

⭐️七.jsp的常用标签

1.jsp静态包含

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%--
          <%@ include file="" %> 就是静态包含
          file 属性指定你要包含的jsp页面的路径
          地址中第一个斜杠 / 表示为http://ip:port/工程路径/ 映射到代码的web目录
          静态包含的特点:
          1.静态包含不会翻译被包含的jsp页面
          2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出.
--%>
<%@ include file="/include/footer.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
页脚信息<br>
</body>
</html>

在这里插入图片描述
2.jsp动态包含

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%--
       <jsp:include page=""></jsp:include> 动态包含
       page 属性是指你要包含的jsp页面的路径
       动态包含和静态包含一样,把被包含的内容执行输出到包含位置
       动态包含的特点:
       1.动态包含会把被包含的jsp页面也翻译成java代码
       2.动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出.
       JsRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
       3.动态包含还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
   <jsp:param name="username" value="root"/>
    <jsp:param name="password" value="root1"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
页脚信息<br>
<%=request.getParameter("password")%>
</body>
</html>

在这里插入图片描述
3.jsp标签-转发
<%
// request.getRequestDispatcher(“/scope2.jsp”).forward(request,response);
%>
<%- -<jsp:forward page=""></jsp:forward> 就是请求转发标签 功能就是请求转发
page 属性设置请求转发的路径
–%>
<jsp:forward page=“/scope2.jsp”></jsp:forward>

请求转发的使用说明:
在这里插入图片描述

⭐️八.Listener监听器

  • Listener监听器是JavaWeb的三大组件之一
  • JavaWeb三大组件:Servlet程序Filter过滤器Listener监听器
  • Listener是JavaEE的规范(接口)
  • 监听器的作用:监听某种事物的变化,通过回调函数,反馈给客户(程序)去做一些相应的处理.

1.ServletContextListener监听器

  • ServletContextListener可以监听ServletContext对象的创建和销毁.
  • ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁.
  • 监听到创建销毁之后都会分别调用ServletContextListener监听器的方法反馈.
  • 两个方法分别是:
  • contextInitialized(ServletContextEvent sce)
  • contextDestroyed(ServletContextEvent sce)

ServletContextListener监听器监听ServletContext对象的步骤
1.编写一个类去实现ServletContextListener
2.实现其两个回调方法
3.到web.xml中配置监听器

public class Listener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象被创建了");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象被销毁了");
    }
}
 <listener>
    <listener-class>com.servlet.listener.Listener</listener-class>
    </listener>

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

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

相关文章

SpringMVC框架中的异常处理机制

目录 1. 什么是异常处理&#xff1f; 2. SpringMVC框架中的异常处理机制是什么&#xff1f; 3. SpringMVC框架汇中实现异常处理的实现步骤 4. SpringMVC框架出现异常时候的处理过程 5. 附手写代码&#xff0c;并含有注释 1. 什么是异常处理&#xff1f; http://t.csdn.cn/x…

【线性代数】四、二次型

第四章 二次型 文章目录第四章 二次型一、二次型定义二、合同变换1.线性变换2.矩阵合同标准型和规范型3.惯性定理三、正定二次型一、二次型定义 如果系数aij全为实数&#xff0c;那么为实二次型。上述二次型展开式可表示用矩阵为 可以看出&#xff0c;二次型矩阵A是一个对称矩…

做了8年前端,细说那些曾经让你浴霸不能的后端

说明&#xff1a;本文并没有针对某位大哥大姐&#xff0c;看见如果觉得好笑的就笑一笑&#xff0c;如果被戳中了你的过往&#xff0c;请不要气愤&#xff0c;人活着嘛&#xff0c;开心最重要。 A 曾经有个后端&#xff0c;我要调一个详情。他告诉我传id&#xff0c;然后测试的…

LeetCode 790. 多米诺和托米诺平铺

LeetCode 790. 多米诺和托米诺平铺一、题目&#xff08;经典动态规划&#xff09;二、解题思路1. 铺满2*N面积&#xff1a;2. 对于第i列&#xff0c;有4种情况&#xff1a;3. N-1 -> N 转移方程&#xff1a;三、核心代码四、代码中存在的一些知识性问题1. 二层vector的定义、…

浅谈JVM

内存结构&#xff1a; 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的 不会出现内存溢出 虚拟机栈 虚拟机栈&#xff1a;是描述java方法执行的内存模型&#xff0c;每个方法在执行的同时都会创建…

生信初学者必知的镜像设置

文章目录Ubuntu镜像conda镜像R语言镜像Python镜像Julia镜像国内网络问题很烂&#xff0c;大家都知道&#xff0c;github、pubmed这些网站经常访问不了&#xff01;如果你平常会用到Ubuntu、conda、R语言、Python、Julia&#xff0c; 那你肯定为安转各种包、库、软件而烦恼过&am…

​草莓熊python turtle绘图代码(玫瑰花版)附源代码

​草莓熊python turtle绘图代码&#xff08;玫瑰花版&#xff09;附源代码 目录 一、前言 二、草莓熊手持玫瑰花成品效果图 三、代码演示方法和代码命令解释 四、草莓熊手持的玫瑰花源代码 五、相关资源图片 六、我的“草莓熊python turtle绘图&#xff08;玫瑰花版&…

Sparse编码和字典学习(1)基础知识和python简单实现

Sparse编码和字典学习1. 稀疏表示与字典学习简介1.1 Motivation1.2 字典学习的流程1.3 字典学习的数学模型2 python实现2.1字典学习2.1 稀疏性统计和误差计算参考资料和文献1. 稀疏表示与字典学习简介 1.1 Motivation 字典学习的思想应该源来实际生活中的字典的概念。字典是前…

谷粒商城 -- 项目环境搭建

注&#xff1a;以下的项目环境搭建过程&#xff0c;适用于所有的微服务项目的环境搭建&#xff0c;以后做微服务项目的时候看着这个笔记进行搭建环境即可 一、项目微服务划分图 二、Linux安装Docker 三、Docker安装mysql / redis 四、Vscode下载安装 五、谷粒项目结构创建&a…

碎片化学习Python的又一神作:termux

什么是Termux&#xff1f; 据Termux官网介绍&#xff0c;Termux是一个Android终端仿真器和Linux环境应用程序&#xff0c;运行于内部存储&#xff08;不在SD卡上&#xff09;&#xff0c;无需root或设置。 系统自动进行最小化安装&#xff0c;使用APT软件包管理器安装其它软件…

【成为红帽工程师】第三天 web服务器

目录 一、www简介 二、网址及http简介 三、www服务器的类型 四、www服务器的基本配置 五、相关实验 一、www简介 &#xff08;一&#xff09;什么是www www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询 用户所需要的信息…

【十问十答】回归模型知识点

1. 线性回归的假设是什么 线性回归有四个假设&#xff1a; 线性&#xff1a;自变量&#xff08;x&#xff09;和因变量&#xff08;y&#xff09;之间应该存在线性关系&#xff0c;这意味着x值的变化也应该在相同方向上改变y值。 独立性&#xff1a;特征应该相互独立&#xf…

[附源码]java毕业设计大学生足球预约信息

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Java基础】泛型+反射+枚举+Lambda表达式 知识点总结

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Java基础&#xff1a;泛型、反射、枚举、Lambda表达式知识点总结。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#x…

Redis安装与配置 LInux Centos

1.介绍Redis Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 特点&#xff1a; 支持数据的持久化&#xff0c;可以将内存中的数据保存到硬盘&#xff0c;在重启后再次加载使用。 支持…

Navigation 组件使用入门

Navigation 组件使用入门https://developer.android.google.cn/guide/navigation/navigation-getting-started 添加依赖 dependencies {def nav_version "2.5.2"implementation "androidx.navigation:navigation-fragment:$nav_version"} 创建导航图 …

LeetCode 752. 打开转盘锁

今天在看bfs模板的时候看到了一个题目&#xff0c;解密码锁的这道题&#xff0c;半天也没啥思路和行动力&#xff0c;看了人家的java版的注释&#xff0c;花了40分钟才搞懂这个题&#xff0c;也真的是菜。写完之后发现这个题目还可以去优化&#xff0c;用双向bfs去解决&#xf…

Android App开发超实用实例 | 约束布局

从多个角度介绍约束布局设计中的控件定位。 01、约束布局基础 从 Android Studio 2.3版本起&#xff0c;约束布局是Android Studio布局文件的默认布局。其他布局方式在实现复杂一些的布局设计时存在多种或多个布局嵌套的情况&#xff0c;设备调用这样的布局文件就需要花费更多…

(未整理完)十月每日一题打卡

每日打卡 10.1 [重新格式化电话号码 lc1694](1694. 重新格式化电话号码 - 力扣&#xff08;LeetCode&#xff09;) 模拟题&#xff1a;特殊情况就是在最后划分完全部三个之后&#xff0c;还剩四个需要变成aa-bb class Solution { public:string reformatNumber(string number…

Redis系列:Redis主从、哨兵、集群介绍

本篇内容包括&#xff1a;Redis 主从架构、Redis 哨兵架构、Redis 集群架构 的介绍等内容&#xff5e; 文章目录一、Redis 主从架构1、Redis 主从架构2、主从架构原理二、Redis 哨兵模式1、Redis 哨兵模式2、Redis 哨兵模式工作过程三、Redis 集群模式1、Redis 集群模式2、Redi…