JavaWeb笔记_JSPEL

news2024/9/21 0:43:26

一.JSP相关技术

1.1 JSP由来

当我们需要向页面输出大量的HTML代码的时候,我们需要通过response对象写多次来输出HTML代码
    response.getWriter().write("<font>文本</font>");
    页面的展示和servlet密不可分,不利于后期代码维护,因此推出一种可以将java代码嵌入到HTML中的技术:JSP
    JSP=HTML+CSS+JS+JAVA

1.2 JSP技术概述

JSP(Java Server Pages),JSP本质上就是一个servlet,JSP文件后缀名为.jsp
    JSP的第一行有一个声明,解决中文乱码
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>

1.3 JSP技术作用

JSP中的HTML代码负责静态内容的展示
     *JSP中的Java代码负责动态内容的展示

1.4 JSP技术原理

a.当我们访问一个jsp页面的时候,Tomcat会把.jsp文件翻译成对应的.java文件,然后在编译这个.java文件生成.class文件,最后执行.class
      (Tomcat会把.jsp翻译的.java文件存放到当前服务器的work目录下)
      例如:当我们访问index.jsp=翻译==>index_jsp.java==编译=>index_jsp.class=>Tomcat将index_jsp.class加载到内存中执行
    b.核心代码剖析
       /*
          1.JSP翻译成的java文件继承了org.apache.jasper.runtime.HttpJspBase
            而org.apache.jasper.runtime.HttpJspBase继承了HttpServlet
          2.当我们访问JSP的时候,其实就是Tomcat去调用HttpJspBase中service方法
            HttpJspBase中service中方法:
                  @Override
                  public final void service(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException
                  {
                      _jspService(request, response);//最终调用的是HttpJspBase子类中的_jspService()方法
                  }
            最终调用的就是_jspService方法

          3._jspService方法中的一些核心逻辑:
            a.首先解决响应中文乱码问题
            b.接着通过过out将jsp中的所有HTML代码输出到页面


       */
       public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
            implements org.apache.jasper.runtime.JspSourceDependent,
                         org.apache.jasper.runtime.JspSourceImports {

          public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
              throws java.io.IOException, javax.servlet.ServletException {


            final javax.servlet.jsp.PageContext pageContext;
            javax.servlet.http.HttpSession session = null;
            final javax.servlet.ServletContext application;
            final javax.servlet.ServletConfig config;
            javax.servlet.jsp.JspWriter out = null;
            final java.lang.Object page = this;
            javax.servlet.jsp.JspWriter _jspx_out = null;
            javax.servlet.jsp.PageContext _jspx_page_context = null;


            try {
              response.setContentType("text/html;charset=UTF-8");//<%@ page contentType="text/html;charset=UTF-8" language="java" %>

              pageContext = _jspxFactory.getPageContext(this, request, response,
                        null, true, 8192, true);
              _jspx_page_context = pageContext;
              application = pageContext.getServletContext();
              config = pageContext.getServletConfig();
              session = pageContext.getSession();
              out = pageContext.getOut();
              _jspx_out = out;

              out.write("\n");
              out.write("<html>\n");
              out.write("  <head>\n");
              out.write("    <title></title>\n");
              out.write("  </head>\n");
              out.write("  <body>\n");
              out.write("     <span style=\"color: red\">Hello JSP</span>\n");
              out.write("  </body>\n");
              out.write("</html>

1.5 JSP中嵌入java代码与JSP注释

a.声明标签
      <%!java代码%>:其中声明的java代码会放在jsp对应的类的成员位置,所以可以在标签中声明成员变量,成员内部类,成员方法
    b.脚本片段
      <%java代码%>:其中声明的java代码会放在jsp对应类的_jspService方法中,所以是放在局部位置,可以在标签中声明局部变量,局部内部类
    c.脚本表达式
     <%=java表达式%>:负责向页面输出表达式执行结果,其实将表达式放在_jspService方法中的out.print(表达式)中,最终实现将内容输出到页面
     注意:java表达式不能以;结尾

  a.HTML代码可以用<!--注释内容-->
    b.JSP中java代码注释
      //注释
      /*注释*/
    c.JSP文件特有注释方式:<%--注释内容--%>
      这种注释既可以注释JSP相关代码也可以注释HTML代码

1.6 JSP九大内置对象

 a.概述:
      内置对象指的是当把JSP翻译成Servlet后,自动生成的9个对象,可以直接在<%%>使用九个内置对象
 b.

 对象名称         对象类型            对象描述
  page           Object            代表当前jsp翻译的servlet类的实例(本类的实例)

  request       HttpServletRequest       请求对象
  response     HttpServletResponse    响应对象
  session        HttpSession         将会话信息保存在服务端对象
  application    ServletContext      代表当前应用(ServletContext域中的数据被所有Servlet共享)
  config         ServletConfig       可以针对某个Servlet初始化一些参数可以通过getServletConfig()获取到
  out            JspWriter           通过out对象的write方法或print方法向页面输出内容
  exception      Throwable           需要通过在jsp声明上添加属性isErrorPage="true"
  pageContext     PageContext         代表JSP页面的上下文,通过pageContext可以通过getXXX方法获取其它八个对象

二.EL表达式

2.1 EL表达式概述

 1.EL表达式概述
     EL是expression Language的缩写,它是JSP内置(可以直接使用)中的一种表达式语言
   2.EL表达式作用
     a.EL表达式主要用来替换jsp中<%=java表达式%>脚本
     因为JSP脚本中融合了多项技术(HTML+CSS+JS+Java),如果JSP页面非常复杂,<%=%>脚本会写的非常多,导致这个页面可读性差
     而且不利于后期代码维护,因此用EL表达式来代替<%=%>脚本向页面输出内容
     b.EL表达式其实主要用来获取四大域(pageContext request session application)中数据并显示
   3.EL表达式格式
     ${表达式}包含两种写法:
     1.${xxScope.key}:获取指定的域中查找指定的key对应值
       **2.${key}:默认会根据key去四大域中依次查找(pageContext=>request=>session=>application)  

2.2 EL表达式获取四大域中的数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式获取四大域中的数据</title>
</head>
<body>
    <%
        //向request域中存数据
      request.setAttribute("username","zhangsan");
        //向session域中存数据
      session.setAttribute("password","123");
        //向pageContext域中存数据
      pageContext.setAttribute("id","456");
        //向application域中存数据
      application.setAttribute("gender","male");
    %>
    <%="request域中的值:"+request.getAttribute("username")%><br>
    <%="session域中的值:"+session.getAttribute("password")%><br>
    <%="pageContext域中的值:"+pageContext.getAttribute("id")%><br>
    <%="application域中的值:"+application.getAttribute("gender")%><br>
    <hr>
    request域中的值:${requestScope.username}<br>
    session域中的值:${sessionScope.password}<br>
    pageContext域中的值(简化形式):${id}<br>
    application域中的值(简化形式):${gender}
</body>
</html>

2.2 EL表达式获取自定义对象

EL表达式注意事项
      如果从所有域中都不能找到key对应的值,那么EL表达式将来浏览器什么都不输出
      如果key的值比较特殊,我们可以通过["key"]来代替.的形式
   EL表达式原理
      ${a.b.c.xx....}
      EL表达式的每一级都是根据getXxx方法将数据取出

<%@ page import="bean.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式获取自定义对象</title>
</head>
<body>
    <%
        request.setAttribute("person",new Person("张三",18,"man"));
        request.setAttribute("001",new Person("李四",20,"male"));
    %>
    使用脚本表达式获取自定义对象的值:<br>
    <%=((Person)(request.getAttribute("person"))).getName()+" "+
       ((Person)(request.getAttribute("001"))).getAge()+" "+
       ((Person)(request.getAttribute("person"))).getGender()
    %><br>
    使用EL表达式获取自定义对象的值:<br>
    ${person.name}  ${person.age} ${person.gender}
    ${requestScope["001"].name} <%--由于属性名不能以数字开头,直接使用${001.name}会报错--%>
    <%--底层默认调用get方法来获取值--%>
</body>
</html>

2.3 EL表达式取出集合中的数据

<%@ page import="java.util.Arrays" %>
<%@ page import="bean.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式取出集合中的数据</title>
</head>
<body>
    <%
        //list集合
      List<Person> peoples = Arrays.asList(
              new Person("张三", 18, "man"),
              new Person("李四", 20, "male")
      );
      request.setAttribute("peoples",peoples);
        //map集合
      HashMap<String, Person> map = new HashMap<>();
      map.put("张三",new Person(18,"man"));
      map.put("001",new Person(20,"male"));
      session.setAttribute("map",map);
    %>
    使用脚本表达式获取集合中的值:<br>
    <%="list集合中的数据:"+((List<Person>)request.getAttribute("peoples")).get(0).getName()+
                          ((List<Person>)request.getAttribute("peoples")).get(1).getGender()%><br>
    <%="map集合中的数据:"+((HashMap<String,Person>)session.getAttribute("map")).get("张三").getAge()+
                         ((HashMap<String,Person>)session.getAttribute("map")).get("001").getGender()
    %><br>
    <hr>
    使用EL表达式获取集合中的值:<br>
    list集合(索引): ${peoples[0].name}
                   ${peoples[1].name}<br>
    map集合:${map.张三.gender}
            ${map["张三"].age}
            ${map["001"].gender}
</body>
</html>

2.4 EL表达式获取应用上下文

EL表达式11个内置对象:可以在EL表达式中直接使用
     参照图表
     我们经常使用pageContext来获取应用上下文(Application Context)
     ${pageContext.request.contextPath}

 

2.5 EL表达式中的运算符 & 非空判断

 EL表达式运算符
      <%--算术运算符
             1.常量运算
             2.从域中取出数据并计算,如果对数值字符串进行运算,会先转换为数值在做运算
          --%>

    <%--逻辑运算符
             1.常量布尔表达式
             2.先从域中取数据,然后进行逻辑运算
          --%>
     <%--三元运算符--%>
   EL表达式非空判断
       <%--非空判断
              利用empty运算符做空判断,如果表达式的值空,表达式返回true,如果表达式的值不为空返回false
              1.判断对象是否null
              2.判断字符串是否为""
              3.判断集合对象(List,Map)是否为null,也可以判断集合中是否元素
           --%>  

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

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

相关文章

docker firewalld 防火墙设置

1、环境 centos 7 firewalld docker-ce docker 默认会更改防护墙配置 导致添加的防火墙策略不生效&#xff0c;可以启用firewalld 重新设置策略 2、启用防火墙 systemctl start firewalld systemctl enable firewalld3、配置文件禁用docker 的iptables /etc/docker/daemon.js…

用在ROS2系统中保持差速轮方向不变的PID程序

在ROS 2中&#xff0c;为了保持差速轮机器人的方向不变&#xff0c;通常需要使用PID&#xff08;Proportional Integral Derivative&#xff09;控制器来控制机器人的角速度。PID控制器可以帮助调整机器人的角速度&#xff0c;以维持其朝向不变。 下面是一个简单的ROS 2节点示…

docker镜像文件加密(Win11)

分享一个可以给docker导出的tar包加密的方法 要使用openssl&#xff0c;地址&#xff1a;openssl安装&#xff0c;安装exe就行&#xff0c;选择不带Light的&#xff0c;下面的是二进制文件 傻瓜式安装&#xff0c;最后的赞助页面&#xff0c;根据自己经济实力选择赞助&#xf…

PWM信号转模拟信号转换器GP8101/GP8101M

前言&#xff1a; 各位大佬&#xff0c;听说过PAC吗&#xff1f;PAC (PWM to Analog Converter)。 今天介绍一个小众的转换芯片&#xff0c;PWM转模拟信号的&#xff0c;有一定的应用场景,单价一元多。这种芯片隔离PWM还是很容易的。 0%-100% PWM to 0-5V/0-10V SOP8封装的GP…

裸机:SDRAM引入

SDRAM引入 SDRAM&#xff1a;Synchronous Dynamic Random Access Memory&#xff0c;同步动态随机存储器 DDR 就是DDR ADRAM DDR SDRAM是Double Data Rate SDRAM的缩写 SDRAM通过地址总线和数据总线接口&#xff08;总线接口&#xff09;与SoC通信。 SDRAM的特性&#xff08…

【Linux】进程IO|重定向|缓冲区|dup2|dup|用户级缓冲区|模拟缓冲区

目录 前言 重定向 实验一 为什么log.txt文件的文件描述符是1 为什么向stdout打印的信息也出现在文件中 实验二 用户级缓冲区 为什么要有用户级缓冲区 系统调用 dup 为什么close(fd1)之后还能向log.txt写入数据&#xff1f; dup2 缓冲区 观察现象 测试1 测试2 测…

IGV.js | 载入自己下载的gtf文件

1.安装 htslib-1.20 https://www.htslib.org/doc/tabix.html J3$ cd ~/Downloads/ $ wget https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2 $ tar jxvf htslib-1.20.tar.bz2编译安装&#xff1a; $ cd htslib-1.20/ $ ./configure --prefix/…

【图文多模态】

GPT4o 架构的核心是<font color"red">**Transformer**</font>&#xff0c;它通过自注意力机制&#xff08;Self-Attention&#xff09;来处理输入的序列数据端到端的方式训练&#xff1a;即从输入到输出的整个过程都在同一个网络中进行多模态大模型&…

不看后悔 养宠家庭的必备好物——最值得买的宠物空气净化器推荐

"猫毛满天飞&#xff0c;打扫永无尽头&#xff01;"这是多少养猫人的日常写照。或许你已经尝试了各种方法&#xff0c;从手动打扫到普通空气净化器&#xff0c;但效果总是不尽人意。普通空气净化器虽然有点用&#xff0c;但实际上它们并非专为宠物家庭设计&#xff0…

应用层自定义协议以及序列化和反序列化

文章目录 应用层自定义协议以及序列化和反序列化1、应用层自定义协议1.1、应用层1.2、协议 2、序列化和反序列化3、TCP 为什么支持全双工4、jsoncpp基础4.1、序列化4.2、反序列化 5、实现网络版计算器6、手写序列化和反序列化 应用层自定义协议以及序列化和反序列化 1、应用层…

【YOLOv8系列】图像分类篇----通过YOLOv8实现图像分类功能

最近需要使用YOLOv8对自己的数据集进行训练,从而实现图像分类的功能,因此记录一下整个过程。 YOLOv8的github地址:https://github.com/ultralytics/ultralytics 参考链接:超详细YOLOv8图像分类全程概述:环境、训练、验证与预测详解 文章目录 一、YOLOv8环境搭建二、准备…

【C++】:红黑树深度剖析 --- 手撕红黑树!

目录 前言一&#xff0c;红黑树的概念二&#xff0c;红黑树的性质三&#xff0c;红黑树节点的定义四&#xff0c;红黑树的插入操作4.1 第一步4.2 第二步4.3 插入操作的完整代码 五&#xff0c;红黑树的验证六&#xff0c;实现红黑树的完整代码五&#xff0c;红黑树与AVL树的比较…

从 NextJS SSRF 漏洞看 Host 头滥用所带来的危害

前言 本篇博文主要内容是通过代码审计以及场景复现一个 NextJS 的安全漏洞&#xff08;CVE-2024-34351&#xff09;来讲述滥用 Host 头的危害。 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能…

Java Linux操作系统

1、操作系统是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 2、Linux内核 提供了linux系统的主要功能 3、发行版Centos&#xff1a;内核应用程序 4、快照&#xff1a;保存虚拟机的状态&#xff0c;当虚拟机出现问题的时候&#xff0c;可以恢复原始的状态…

Hospital 14.6.0全开源医院管理预约系统源码

InfyHMS 具有 60 种功能和 9 种不同类型的用户类型&#xff0c; 他们可以登录系统并根据他们的角色访问他们的数据。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89580674 更多资源下载&#xff1a;关注我。

MyBatis--11-- 判断 Integer类型,值为0动态SQL不生效

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MyBatis标签&#xff1a; Integer类型&#xff0c;值为0动态SQL不生效1.现象2.分析原因3.解决办法去掉判断条件 dto.status ! "即可 MyBatis标签&#xff1a; …

CSS相关记录

文章目录 backgroundposition文字displayflexjustify-contentalign-itemsflex-directionflex-wrap gridimportant transformtranslate&#xff08;位移&#xff09;scale&#xff08;缩放&#xff09;rotate&#xff08;旋转&#xff09;origin (旋转中心点)skew (倾斜 ) borde…

kafka架构+原理+源码

1.安装jdk17 sudo yum -y update sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm sudo yum -y install ./jdk-17_linux-x64_bin.rpm、 sudo java -version 2.安装kafka How to easily install kafka without zookeeper | Aditya’s Blog …

C++——保持原有库头文件不变的情况下,成功编译运行工程

问&#xff1a;想要保持原来库方式&#xff0c;应该怎么操作呢&#xff1f; 答&#xff1a;如果想保持原来的方式&#xff0c;则只需要将 库所在路径 tracker/detector/rknn_model_zoo/utils 加入到 工程库包含中即可。

DVWA的安装和使用

背景介绍 DVWA是Damn Vulnerable Web Application的缩写&#xff0c;是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境&#xff0c;帮助他们测试自己的专业技能和工具&#xff0c;同时也帮助web开发者更好地理解web应用安全防范的过程。DV…