服务器渲染技术(JSPELJSTL)

目录

前言

一.JSP

1.基本介绍

 3.page指令(常用)

4.JSP三种常用脚本

4.1 声明脚本 <%! code %>

4.2 表达式脚本 <%= code %>

4.3 代码脚本 <% code %>

4.4 注释 <%-- 注释 --%>

5. JSP 内置对象

5.1 基本介绍

5.2 九个内置对象

 6.JSP域对象

二.EL

1.EL表达式介绍

 2.输出形式

3.EL运算操作

4.EL的对象和属性

4.1 11个隐含对象

4.2 EL获取四个特定域的属性

 4.3 pageContex对象的使用

三.Jstl

1.介绍

2.细节

 3.core核心库

3.1 set

 3.2 if

3.3 choose when ohterwise

3.4 forEach


前言

JSP(JavaServer Pages)是一种用于开发动态Web页面的Java技术。它允许开发人员将Java代码嵌入到HTML页面中,从而实现动态生成页面内容的功能。JSP技术在过去曾经非常流行,但随着现代前端技术的发展,其地位已经逐渐被其他技术所取代。

目前,JSP技术仍然在一些传统的企业应用中使用,特别是在大型企业系统中,由于历史原因或者现有系统的复杂性,一些公司仍然在维护和开发JSP页面。然而,随着前端技术的不断发展,越来越多的开发人员转向使用现代的前端框架和库,如React、Angular和Vue.js等,来构建更灵活、交互性更强的Web应用。

本章对JSP技术的介绍旨在对其能基本使用,能看懂并维护相关项目,后续将补充更好的ThymeLeaf技术.

一.JSP

1.基本介绍

  1. JSP全称是Java Server Pages 即Java的服务器页面
  2. JSP最大的特点在于写JSP就像在写HTML
    1.  相对于html,HTML只能为用户提供静态数据,而jsp允许在页面中嵌套Java代码,为用户提供动态数据
    2. 相对于servlet,servlet很难对数据进行排版,反复的write()比较冗余,而且丧失易读性,而jsp可以兼顾Java的动态数据和页面的排版和对标签的使用
  3. jsp技术基于servlet,可以理解为servlet的一层包装(事实上,tomcat会将jsp翻译成servlet文件)
  4. jsp页面事实上是运行tomcat后由其翻译成的servlet产生的页面,故不能像html一样直接使用浏览器解析,而需要启用tomcat后使用浏览器访问

2.运行原理

  1. jsp页面本质是一个servlet程序,其性能和Java关联
  2. 第一次访问jsp页面时,Tomcat服务器会把jsp页面解析成一个Java源文件并且对它进行编译成.class字节码程序
    D:\TomCat-9.02\bin\catalina.bat run
    [2024-04-19 09:03:36,946] Artifact jsp:war exploded: Waiting for server connection to start artifact deployment...
    Using CATALINA_BASE:   "C:\Users\Lenovo\AppData\Local\JetBrains\IntelliJIdea2022.3\tomcat\53ae5d15-0d90-4c2d-99b1-40c581eaf13d"
    Using CATALINA_HOME:   "D:\TomCat-9.02"
    Using CATALINA_TMPDIR: "D:\TomCat-9.02\temp"
    Using JRE_HOME:        "D:\Java_8"
    Using CLASSPATH:       "D:\TomCat-9.02\bin\bootstrap.jar;D:\TomCat-9.02\bin\tomcat-juli.jar"


    index.jsp --> index_jsp.java --> index_jsp.class

  3. jsp继承了servlet

          out.write("\n");
          out.write("\n");
          out.write("<html>\n");
          out.write("<head>\n");
          out.write("    <title>$Title$</title>\n");
          out.write("</head>\n");
          out.write("<body>\n");
          out.write("This is the idx of jsp learning <br>\n");
          out.write("<a href=\"");
          out.print(request.getContextPath());
          out.write("/compute.jsp\">\n");
          out.write("    tick to compute\n");
          out.write("</a>\n");
          out.write("</body>\n");
          out.write("</html>\n");
    

    在源码内部发现通过write输出jsp中编辑好的html语言 

 3.page指令(常用)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  1. language 表示jsp 翻译后是什么语言文件, 只支持 java
  2. content Type表示jsp返回的数据类型,对应源码中的response.setContentType()
  3. pageEncoding 表示当前页面文件本身的字符集
  4. import属性与Java一样,用于导包导类

4.JSP三种常用脚本

4.1 声明脚本 <%! code %>

定义jsp需要的属性,方法,静态代码块和内部类

<%!
    static String name;
    int age;

    void setAge(int age){
        this.age=age;
    }

    static{
        name="leon";
    }
    
    class dog{
        String dogName;
    }

%>

4.2 表达式脚本 <%= code %>

在jsp页面上输出数据,脚本中表达式不能以分号结束        

<%!
    String name = "leon";
%>
<hr/>
<h1>个人信息</h1>
用户名= <%=name%><br/>
工作是: <%="学生"%><br/>
得到参数= <%=request.getParameter("sex")%>

4.3 代码脚本 <% code %>

可以在 jsp 页面中,编写我们需要的功能(使用 java ),可以由多个代码脚本块组合完成一个完整的 java 语句,可以和表达式脚本一起组合使用,在 jsp 页面上输出数据

<%
    for (int i = 0; i < list.size(); i++) {
        Monster monster = list.get(i);
%>
<tr>
    <td><%=monster.getId()%>
    </td>
    <td><%=monster.getName()%>
    </td>
    <td><%=monster.getSkill()%>
    </td>
</tr>
<%
    }
%>

把for(){

}分割

4.4 注释 <%-- 注释 --%>

5. JSP 内置对象

5.1 基本介绍

JSP内置对象是Tomcat在解析jsp页面后内部提供的九大对象,可以直接使用,不需要手动定义

5.2 九个内置对象

1. out 向客户端输出数据,out.println("");

2. request 客户端的 http 请求

3. response 响应对象

4. session 会话对象

5. application 对应 ServletContext

6. pageContext jsp 页面的上下文,是一个域对象,可以 setAttribue(),作用范围只是本页面 7. exception 异常对象 , getMessage()

8. page 代表 jsp 这个实例本身

9. config 对应 ServletConfig 

 6.JSP域对象

域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存储范围  从存储范围(作用域范围看) pageContext < request <session<application

1.pageContex(存放的数据旨在当前页使用)

2.request(存放的数据在一次request 请求有效)

3.session(存放的数据在一次会话有效)

4.application(存放的数据在整个web应用运行期间有效)

二.EL

1.EL表达式介绍

1. EL 表达式全称:Expression Language,是表达式语言

2. EL 表达式主要是代替 jsp 页面的表达式脚本

3. EL 表达式输出数据的时,比 jsp 的表达式脚本简洁

4. EL 表达式基本语法: ${key1}

 2.输出形式

表达式常用输出 Bean 的普通属性、 数组属性、List 集合属性和Map集合属性

实例:

<h1>el 表达式输出数据演示</h1>
<%
    //创建Book 对象,放入相关的属性
    //private String name;//书名
    //private String[] writer;//作者
    //private List<String> reader;//读者
    //private Map<String, Object> topics;//评讲
    Book book = new Book();
    book.setName("昆虫总动员");
    book.setWriter(new String[]{"jack", "tom"});
    ArrayList<String> readers = new ArrayList<>();
    readers.add("老张");
    readers.add("老李");
    book.setReader(readers);//放入readers

    //创建topics
    HashMap<String, String> topics = new HashMap<>();
    topics.put("topic1", "这是我看过的最好的动画片");
    topics.put("topic2", "不错的电影~~");
    book.setTopics(topics);

    //把book 放入到request域对象
    request.setAttribute("bookkey", book);

%>
book对象: ${bookkey}<br/>
book.name= ${bookkey.name}<br/>
book.writer= ${bookkey.writer}<br/>
book.writer[0]= ${bookkey.writer[0]}<br/>

book.readers= ${bookkey.reader}<br/>
book.readers第2个= ${bookkey.reader.get(1)}<br/>
book.readers第2个= ${bookkey.reader[1]}<br/>

book.topics= ${bookkey.topics}<br/>
book.topics第一个评论= ${bookkey.topics["topic1"]}<br/>

3.EL运算操作

EL empty运算 ${empty 表达式}

以下几种情况返回true 

● 值为 null

● 值为空串的时

● 值是 Object 类型数组,长度为零

● list 集合,元素个数为零

● map,集合元素为零

4.EL的对象和属性

4.1 11个隐含对象

4.2 EL获取四个特定域的属性

 当同时存在多个相同Key不同域的数据时,优先获取域范围小的值

 4.3 pageContex对象的使用

协议: ${ pageContext.request.scheme }<br>
服务器 ip:${ pageContext.request.serverName }<br>
服务器端口:${ pageContext.request.serverPort }<br>
工程路径:${ pageContext.request.contextPath }<br>
请求方法:${ pageContext.request.method }<br>
客户端 ip 地址:${ pageContext.request.remoteHost }<br>
会话 id :${ pageContext.session.id }<br>
<h1>使用 jsp 表达式脚本获取如上信息</h1>
ip 地址: <%=request.getRemoteHost() %> <br>
<h1>使用 el 表达式形式获取信息</h1>
<%
    <%-- 简化代码技巧 --%>
    pageContext.setAttribute("req", request);
%>
ip 地址: ${req.remoteHost} <br>
获取请求方法: ${req.method} <br>

三.Jstl

1.介绍

  1. JSTL是指 JSP Standard Tag Library jsp标准标签库
  2. EL表达式是为了替换jsp中的表达式脚本,Jstl则是为了替换代码脚本,使jsp页面更精简易读
  3. JSTL五个标签库
  4. 使用JSTL需要导入相关jar包

2.细节

taglib引入标签,要放在行首

导入jar包后,要重新发布web工程,否则不识别jstl 

 3.core核心库

3.1 set

<c:set /> set 标签可以往域中保存数据

1. 等价域对象.setAttribute(key,value);

2. scope 属性设置保存到哪个域

page 表示 PageContext 域(默认值)

request 表示 Request 域

session 表示 Session 域

application 表示 ServletContext 域

3.var 属性设置 key 是什么

4. value 属性设置值

<c:set scope="request" var="name" value="dog"></c:set>
${name}

 3.2 if

<c:if /> if 标签用来做判断

test 属性表示判断的条件 用el表达式输出

<c:if test="${ 10 > 2 }">
<h1>10 > 2 为真</h1>
</c:if>

3.3 choose when ohterwise

类似于switch case default

<c:choose>
    <c:when test="${requestScope.score > 80}">
        <h1>${score}-成绩优秀</h1>
    </c:when>
    <c:when test="${requestScope.score >= 60}">
        <h1>${score}-成绩一般, 及格了</h1>
    </c:when>
    <c:otherwise>
        <h1>${score}-没有及格,下次努力~</h1>
    </c:otherwise>
</c:choose>

3.4 forEach

遍历输出

● 普通遍历输出 i 到 j

● 遍历数组

● 遍历 Map

● 遍历 List

<h1>c:forEach 标签</h1>
<hr/>
<h1>第1种遍历方式从i到j</h1>
<ul>
    <%--
    1.遍历 1 到 5,
    2. 输出 begin 属性设置开始的索引 end 属性设置结束的索引
    3. var 属性表示循环的变量(也是当前正在遍历到的数据)
    4. 等价 for (int i = 1; i <= 5; i++) {}
    5. 在默认情况下, i 每次会递增1
    --%>
    <c:forEach begin="1" end="5" var="i">
        <li>排名=${i}</li>
    </c:forEach>
</ul>
<hr/>
<h1>第2种遍历方式:遍历数组</h1>
<%
    request.setAttribute("sports", new String[]{"打篮球", "乒乓球"});
%>
<%--
    <c:forEach items="${ requestScope.sports }" var="item"/>
    1. items 遍历的集合/数组
    2. var 遍历到的数据
    3. 等价 for (Object item: arr) {}
--%>
<c:forEach items="${requestScope.sports}" var="sport">
    运动名称= ${sport}<br/>
</c:forEach>
<hr/>
<h1>第3种遍历方式:遍历Map</h1>
<%
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "北京");
    map.put("key2", "上海");
    map.put("key3", "天津");
    request.setAttribute("cities", map);
%>
<%--
    1. items 遍历的map集合
    2. var 遍历到的数据
    3. entry.key 取出key
    4. entry.value 取出值
--%>
<c:forEach items="${requestScope.cities}" var="city">
    城市信息: ${city.key}--${city.value}<br/>
</c:forEach>
<hr/>
<h1>第4种遍历方式:遍历List</h1>
<%
    List<Monster> monsters = new ArrayList<>();
    monsters.add(new Monster(100, "小妖怪", "巡山的"));
    monsters.add(new Monster(200, "大妖怪", "做饭的"));
    monsters.add(new Monster(300, "老妖怪", "打扫位置的"));
    request.setAttribute("monsters", monsters);
%>
<%--
    items 表示遍历的集合
    var 表示遍历到的数据
    begin 表示遍历的开始索引值 ,从0开始计算
    end 表示结束的索引值
    step 属性表示遍历的步长值
    varStatus 属性表示当前遍历到的数据的状态,可以得到step,begin,end等属性值
--%>
<c:forEach items="${requestScope.monsters}" var="monster">
    妖怪的信息: ${monster.id}-${monster.name}-${monster.skill}<br/>
</c:forEach>

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

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

相关文章

Python 物联网入门指南(六)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十七章&#xff1a;机器人学 101 一提到机器人&#xff0c;我们就会被科幻小说所包围。我们可能会想起动画片《杰森一家》或者电影《终结…

MySQL如何避免全表扫描?

MySQL如何避免全表扫描&#xff1f; 这篇文章解释了何时以及为什么MySQL会执行全表扫描来解析查询&#xff0c;以及如何避免在大型表上进行不必要的全表扫描。 何时会发生全表扫描 MySQL使用全表扫描&#xff08;在EXPLAIN输出中的type列显示为ALL&#xff09;来解析查询的几…

汇智知了堂晨会聚焦:NAS应用如何赋能网络安全实战

在近期汇智知了堂网络安全75班的晨会上&#xff0c;一场关于NAS应用的深入分享完美展开。学员们以饱满的热情投入到这场安全讨论中&#xff0c;共同探索网络安全的新天地。 此次分享会聚焦于NAS的应用&#xff0c;旨在帮助学员们更好地了解NAS的定义与功能&#xff0c;掌握其在…

Reddit数据API 获取reddit的帖子、评论、按关键字搜索

近期调研发现 iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Reddit数据采集API&#xff0c;是目前用下来最方便简单的API&#xff0c;可以抓取 reddit 公开数据&#xff0c;例如 subreddit 中的帖子、按关键字搜索以及文章评论等&#xff0c;供用户按需调用…

智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)

智慧养老平台目录 基于SprinBootvue的外贸平台系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员功能 老人功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

【计算机组成原理】定点数的乘法运算

定点数的乘法运算 定点乘法运算人工算法和机器的矛盾不带符号的阵列乘法器带符号的阵列乘法器求补电路求补电路的思想 ✨️间接补码乘法运算的步骤 定点乘法运算 在定点计算机中&#xff0c;两个原码表示的数相乘的运算规则是&#xff1a;乘积的符号位 两数的符号位异或&…

python文件 成绩分析

‘’文件score.txt中存储了学生的考试信息,内容如下 小明,98 小刚,90 小红,91 小王,98 小刘,80 请写代码,读取文件数据,并进行如下分析 最高分和最低分分别是多少&#xff1f;得最高分的学生有几个&#xff1f; 得最低分的学生有几个平均分是多少&#xff1f; ‘’’ def rea…

使用Python比较两张人脸图像并获得准确度

使用 Python、OpenCV 和人脸识别模块比较两张图像并获得这些图像之间的准确度水平。 一、原理 使用Face Recognition python 模块来获取两张图像的128 个面部编码&#xff0c;并比较这些编码。比较结果返回 True 或 False。如果结果为True &#xff0c;那么两个图像将是相同的…

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

前端开发攻略---合并表格单元格,表格内嵌套表格实现手风琴效果。

1、演示 2、思路 1、用传统的 <table></table> 表格标签来实现比较麻烦。因此通过模拟 表格标签 的写法用<div></div>来实现 2、表头和表格列数是相同的&#xff0c;因此可以确定代码结构 <div class"table"><div class"head…

【开发篇】本章包括消息订阅、客服配置与使用实战(小程序之云函数开发入门到使用发布上线实操)

客服回复效果图展示 消息订阅效果图展示 一、客服配置 客服消息使用指南传送门 <button open-type="contact" class="fab" ><view class="item"

Vue2 —— 学习(十)

一、vue-resource 库 了解即可 在之前的 vue 版本中经常使用 这个库发送 ajax 请求 现在建议使用 axios 我们可以通过使用 vue-resource 库 来实现发送 ajax 请求 它是 vue 的一个插件库 Vue.use() 就能使用我们的插件了 我们引入后去 我们的实例对象 vc 中查看 发现出现…

【论文笔记】RS-Mamba for Large Remote Sensing Image Dense Prediction(附Code)

论文作者提出了RS-Mamba(RSM)用于高分辨率遥感图像遥感的密集预测任务。RSM设计用于模拟具有线性复杂性的遥感图像的全局特征&#xff0c;使其能够有效地处理大型VHR图像。它采用全向选择性扫描模块&#xff0c;从多个方向对图像进行全局建模&#xff0c;从多个方向捕捉大的空间…

大模型系列课程学习-大预言模型微调方法介绍

1.大语言模型相关基本概念综述 语言模型指对语言进行建模&#xff0c;其起源于语音识别(speech recognition)&#xff0c;输入一段音频数据&#xff0c;语音识别系统通常会生成多个句子作为候选&#xff0c;究竟哪个句子更合理&#xff1f; 学术上表达为&#xff1a;描述一段自…

GitHub登录收不到邮箱验证码

由于长时间没有登录GitHub&#xff0c;浏览器可能清除了相应的cookie信息&#xff0c;所以需要对应绑定邮箱进行验证&#xff0c;但因为邮箱长时间没有收到验证码&#xff0c;所以给到以下一种可能解决的方法&#xff1a; 需要输入验证码进行验证 我们可以打开QQ邮箱&#xff0…

Linux——网络管理nmcli

nmcli 不能独立使用&#xff0c;需要对应的服务启动 1. NetworkManager.service 2. 网络配置和服务不相关 3. 通过 nmcl &#xff49; 建立网络配置和网卡之前的映射关系 网卡 简称&#xff1a;nmcli d DEVICE &#xff1a;物理设备 TYPE: 物理设备类型 ethernet 以太网…

【Java基础】25.包(package)

文章目录 前言一、包的作用二、创建包三、import 关键字四、package 的目录结构五、设置 CLASSPATH 系统变量 前言 为了更好地组织类&#xff0c;Java 提供了包机制&#xff0c;用于区别类名的命名空间。 一、包的作用 把功能相似或相关的类或接口组织在同一个包中&#xff…

Android 性能优化之黑科技开道(二)

3. 其它可以黑科技优化的方向 3.1 核心线程绑定大核 3.1.1 定义 核心线程绑定大核的思路也很容易理解&#xff0c;现在的 CPU 都是多核的&#xff0c;大核的频率比小核要高不少&#xff0c;如果我们的核心线程固定运行在大核上&#xff0c;那么应用性能自然会有所提升。 核…

C++相关概念和易错语法(8)(匿名对象、构造+拷贝构造优化、构造析构顺序)

1.匿名对象 当我们实例化对象后&#xff0c;有的对象可能只使用一次&#xff0c;之后就没用了。这个时候我们往往要主动去析构它&#xff0c;否则会占着浪费空间。但是如果遇到大量的这种情况&#xff0c;我们并不想每次都去创建对象、调用、析构&#xff0c;这样会写出很多重…

软考 系统架构设计师系列知识点之大数据设计理论与实践(15)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;14&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.5 常见Kappa架构变型 1. Kappa架构 Kappa是Uber提出的流式数据处理架构&#xff0…