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.rhkb.cn/news/382987.html

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

相关文章

记录一仿真错误,波形缩放有脉冲高信号,放大看不到信号了

是因为信号拉高的时间太短&#xff0c;拉高之后又把它拉低了&#xff0c;需要仔细看一下信号生成的代码。 错误代码与正确代码##正确代码always (posedge clk or negedge rst_n)begin if(!rst_n)beginwr_en < 1d0;wr_data < 8h0;endelse if(state_c DATASEND …

前端JS特效第52波:鼠标经过文字标题百叶窗动画特效风格切换图片轮播js效果

鼠标经过文字标题百叶窗动画特效风格切换图片轮播js效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <html><head><meta charset"utf-8"><title>鼠标经过文字标题百叶窗动画特效风格切换图片轮播js效果</titl…

electron 网页TodoList应用打包win桌面软件数据持久化

参考&#xff1a; electron 网页TodoList工具打包成win桌面应用exe https://blog.csdn.net/weixin_42357472/article/details/140648621 electron直接打包exe应用&#xff0c;打开网页上面添加的task在重启后为空&#xff0c;历史没有被保存&#xff0c;需要持久化工具保存之前…

【Unity国产化信创平台】麒麟银河V10系统虚拟机创建

目录 一、麒麟V10系统镜像下载 二、虚拟机创建流程 三、麒麟银河系统安装流程 一、麒麟V10系统镜像下载 https://www.kylinos.cn/# 官方访问还是会有问题&#xff0c;如果有需要麒麟银河Kylin系统V10的镜像文件&#xff0c;可以留下邮箱或者私信博主获取。 二、虚拟机创…

【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(上)

【Gin】架构的精妙编织&#xff1a;Gin框架中组合模式的革新实践与技术深度解析(上) 大家好 我是寸铁&#x1f44a; 【Gin】架构的精妙编织&#xff1a;Gin框架中组合模式的革新实践与技术深度解析(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分…

MySQL练手 --- 1251. 平均售价

题目链接&#xff1a;1251. 平均售价 思路&#xff1a; 由题意可知&#xff0c;Prices表和UnitsSold表&#xff0c;表的连接关系为一对一&#xff0c;连接字段&#xff08;匹配字段&#xff09;为product_id 要求&#xff1a;查找每种产品的平均售价。而Prices表含有价格还有…

【区块链+绿色低碳】双碳数字化管控平台 | FISCO BCOS应用案例

地方政府、园区及企业实现“双碳”目标过程中存在一些挑战与难点&#xff1a; 1. 管理者难以掌握完整、准确、全面的碳排放数据进行科学决策&#xff1a;由于碳排放核算需要对数据的来源、核算方法 的规范性和采集方法的科学性有严格要求&#xff0c;当前面临碳排放数据数据采…

视频翻译保留原音色pyvideotrans+clone-voice

剪映的视频翻译时长限制5分钟以内&#xff0c;需要积分2700首次有减免大概21.6元&#xff08;1秒9积分/1元100积分&#xff09; • 视频翻译配音工具pyvideotrans 将视频从一种语言翻译为另一种语言&#xff0c;并添加配音 打包链接&#xff1a;夸克网盘分享 升级补丁&#…

Python从0到100(四十六):实现管理员登录及测试功能

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

QT--线程

一、线程QThread QThread 类提供不依赖平台的管理线程的方法&#xff0c;如果要设计多线程程序&#xff0c;一般是从 QThread继承定义一个线程类&#xff0c;在自定义线程类里进行任务处理。qt拥有一个GUI线程,该线程阻塞式监控窗体,来自任何用户的操作都会被gui捕获到,并处理…

BGP选路之AS-PATH

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由。首先要比较的属性是 Preferred Value&#xff0c;然后是Local Preference&#xff0c;再次是路由生成方式&a…

BGP选路之Next Hop

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较,以确定出去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较&#xff0c;从而决定是否将该最优BGP路由放进P路由表中…

【在Linux世界中追寻伟大的One Piece】Linux进程概念

目录 1 -> 冯诺依曼体系结构 2 -> 操作系统(operator System) 2.1 -> 概念 2.2 -> 系统调用和库函数 3 -> 进程 3.1 -> 概念 3.2 -> 进程-PCB 3.3 -> 进程状态 3.3.1 -> Z(Zombie)-僵尸进程 3.3.2 -> 孤儿进程 3.4 -> 进程优先级 …

2024-07-24 buildroot c语言应用获取 kernel kobject_uevent_env 发送的消息,侦测USB口变化。

一、kobject_uevent_env 是 Linux 内核中的一个函数&#xff0c;用于发送内核事件到用户空间。它主要用于生成和发送与内核对象&#xff08;kobject&#xff09;相关的事件通知&#xff0c;这些事件通常用于通知用户空间程序&#xff08;如 udev&#xff09;有关硬件的变化或其…

git的一些使用技巧(git fetch 和 git pull的区别,git merge 和 git rebase的区别)

最近闲来无聊&#xff0c;虽然会使用git操作&#xff0c;但是 git fetch 和 git pull 的区别&#xff0c;git merge 和 git rebase的区别只是一知半解&#xff0c;稍微研究一下&#xff1b; git fetch 和 git pull 的区别 git fetch git fetch 是将远程仓库中的改动拉到本地…

解决vscode+UE5中vscode无法识别头文件,无法函数无法跳转,也无法自动补全的问题。

一、概述 接上一条博客&#xff0c;虽然解决了报错的问题&#xff0c;但是实际上的问题却没有解决&#xff0c;无论我怎么点击&#xff0c;其都无法完成跳转&#xff0c;也无法完成自动补全的问题。 在网络上搜索了很多资料后&#xff0c;发现是在使用vscode时候UE5在vscode中的…

百度秋招提前批C++

1.C++内存模型 堆栈全常代 (1)堆 heap : 由malloc分配的内存块,其释放编译器不去管,由我们程序自己控制(一个malloc对应一个free)。涉及的问题:“缓冲区溢出”、“内存泄露”(new分配的在自由存储区 经常由堆实现) (2)栈 stack : 是那些编译器在需要时分配,在…

手动搭建微型计算机(涉及:CPU、内存、寄存器等)

目录 微型计算机基础元件及作用CPU地址总线数据总线 内存地址总线数据总线内存大小的计算 寄存器先将Z80CPU与TC5517内存相连参考文章 微型计算机基础元件及作用 CPU、内存、I/O CPU 包含地址总线引脚和数据总线引脚。 以Z80CPU为例&#xff1a; 地址总线 地址总线引脚…

【React】条件渲染:深入探讨高效开发技巧与最佳实践

文章目录 一、什么是条件渲染&#xff1f;二、条件渲染的实现方式三、条件渲染的最佳实践四、复杂条件渲染的实现 在现代前端开发中&#xff0c;React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化和状态管理能力&#xff0c;而条件渲染则是 React 开…