JavaWeb笔记_JSPEL

一.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.mzph.cn/web/48648.shtml

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

相关文章

npm下载pnpm

一、提供node_global和node_cache的文件夹 若不存在&#xff0c;可自行新建文件夹 二、配置环境变量 配置NODE_PATH变量&#xff1a; 配置Path变量&#xff1a; 三、执行cmd指令 npm config set prefix "D:\Configure\nodejs\node_global" npm config set cache &…

公司邮箱一般是什么邮箱

公司邮箱一般是什么邮箱呢&#xff1f;公司邮箱是企业官方通信工具&#xff0c;体现专业形象&#xff0c;提高协作效率。选择时需考虑安全性、功能集成、性价比和技术支持。Zoho邮箱因简洁界面、丰富协作工具和出色安全性能受好评&#xff0c;提供多种套餐选择。 一、公司邮箱…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释&#xff1a; Spring Boot Starter 是一种方便的依赖管理方式&#xff0c;它封装了特定功能或技术栈的所有必要依赖项和配置&#xff0c;使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…

接入百度文心一言API教程

然后&#xff0c;编辑文章。点击AI识别摘要&#xff0c;然后保存即可 COREAIPOWER设置 暂时只支持经典编辑器.古腾堡编辑器等几个版本后支持.在比期间,你可以自己写点摘要 摘要内容 AL识别摘要 清空 若有收获&#xff0c;就点个赞吧 接入文心一言 现在百度文心一言&…

vsftpd搭建FTP服务器 - 虚拟用户

命令记录 $ sudo apt install vsftpd db-util $ sudo nano /etc/vsftpd.conf $ sudo nano /etc/vsftpd/vsftpd-virtual-users.txt $ sudo db_load -T -t hash -f /etc/vsftpd/vsftpd-virtual-users.txt /etc/vsftpd/vsftpd-virtual-users.db ls /etc/vsftpd/vsftpd-virtual-us…

IDEA的pom.xml显示ignored 的解决办法

问题&#xff1a; idea中创建Maven module时&#xff0c;pom.xml出现ignored。 原因&#xff1a; 相同名称的module在之前被创建删除过&#xff0c;IDEA会误以为新的同名文件是之前删除掉的&#xff0c;将这个新的module的pom.xml文件忽略掉显示ignored. 解决&#xff1a; 在…

看 Unity 组件的源码 —— ILSpy

ILSpy 是开源的 .NET 程序集浏览器和解编译器。 下载 ILSpy ILSpy Github 地址&#xff1a;icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform! (github.com) 它有 Release 包可以下载 也提供 IDE 的…

STM32工业物联网系统教程

目录 引言环境准备工业物联网系统基础代码实现&#xff1a;实现工业物联网系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业监测与优化问题解决方案与优化收尾与总结 1. 引言 工业物联网&#xff08…

K210视觉识别模块学习笔记7:多线程多模型编程识别

今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习使用多线程、多模型来识别各种物体 这里先提前说一下本文这次测试实验的结果吧&#xff1a;结果是不太成…

Python实现websocket连接服务器报rejected WebSocket connection: HTTP 401

1. websockets报HTTP 401解决办法 代码如下&#xff1a; #!/usr/bin/env python import asyncio import websockets import requestsuri ws://192.168.20.167/websocket msg {"type":6,"param":{"businessType":3,"cmd":1,"f…

线性代数|机器学习-P25线性规划和两人零和博弈

文章目录 0. 概述1. 线性规划问题1.1 定义1.2 举例 2. 线性规划中的对偶问题3. 最大流 - 最小割问题4. 两人零和博弈 MIT教授教学视频&#xff0c;讲得比较泛&#xff0c;需要另外学习很多知识补充 0. 概述 线性规划[LP]问题 线性规划是问题为线性求最值&#xff0c;约束也是求…

自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)

李群李代数扰动bundle adjustment 这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客也会同步更新&#xff0c;全网…

《计算机网络》(学习笔记)

目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…

STM32F0-寄存器ADC配置指南

目录 输入方式&#xff1a; 模拟看门狗功能&#xff1a; ADC中断 配置一个Demo 设置时钟 自校准 通道选择 采样时间选择 转换模式选择 断续模式 启动转换 软件触发 外部触发 转换结束 关于DMA 模拟看门狗 ​编辑ADC数据位置​编辑 在STM32F中&#xff0c;ADC可…

AV1技术学习:Loop Restoration Filter

环路恢复滤波器&#xff08;restoration filter&#xff09;适用于64 64、128 128 或 256 256 像素块单元&#xff0c;称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器&#xff08;Wiener filter&#xff09;或使用自导滤波器&#…

pyenv-win | python版本管理,无需卸载当前版本

系统&#xff1a;windows&#xff0c;且已安装git。 使用 pyenv-win 在Windows中管理多个python版本&#xff0c;而无需卸载当前版本。安装步骤如下&#xff1a; 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

Word 导入导出

在实际的开发过程中&#xff0c;也会遇到导入导出的功能&#xff0c;今天就简单的做一下总结。 1.需求&#xff1a;将下面word 数据导入到数据库并进行存储 在Controller中 RequestMapping(value "/ImportWord")public RawResponseBodyObject ImportWord(HttpServl…

深入解析Linux目录结构及其功能

深入解析Linux目录结构 Linux 系统的目录结构采用层次化设计&#xff0c;从根目录 / 开始逐级扩展&#xff0c;了解和掌握这些目录的作用和内容有助于我们更好地管理和维护系统。本文将深入解析每个常见目录的功能&#xff0c;并提供相关命令和示例。 目录结构概览 根目录 / …

【BUG】已解决:ERROR: No matching distribution found for PIL

ERROR: No matching distribution found for PIL 目录 ERROR: No matching distribution found for PIL 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0…

css大屏设置中间元素四周渐变透明效果

css大屏设置中间元素四周渐变透明效果 四周透明效果&#xff1a; // 设置蒙版上下左右渐变显示mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 100%),linear-gradient(to bottom, rgba(0, 0, 0…