服务器渲染技术(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//创建topicsHashMap<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 取出key4. 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>

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

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

相关文章

Ubuntu20.04 ISAAC SIM仿真下载使用流程

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

linux 安装openjdk-1.8

安装命令 yum install java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64查看安装路径 find / -name java 默认的安装路径 /usr/lib/jvm 查看到jre 以及java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 配置环境变量 vim /etc/profile 添加的内容 export JAVA_HOME/usr/li…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

基于非线性控制策略的电力电子电路——DC-DC电路的3种滑模控制器【MATLAB/simulink】

第一种&#xff0c;滞环滑模控制器Buck电路 在滑模控制系统中&#xff0c;采用滞环技术&#xff0c;直接将切换函数转换成开关控制信号&#xff0c;滞环技术被看做一种降低系统结构的切换频率的调制方法&#xff0c;业界也把基于滞环滑模技术实现的滑模控制称为直接滑模控制技…

分类网络总结

欢迎大家订阅我的专栏一起学习共同进步&#xff0c;主要针对25届应届毕业生 祝大家早日拿到offer&#xff01; lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

Python基础04-操作系统中的文件与目录操作

在与操作系统交互时&#xff0c;我们经常需要执行文件和目录的操作。Python提供了丰富的库来帮助我们完成这些任务。以下是一些常见的操作&#xff0c;以及如何使用Python代码来实现它们。 1. 导航文件路径 在不同的操作系统中&#xff0c;文件路径的格式可能不同。Python的o…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…

关于实验报告添加题注为0以及页面断层的解决办法

1.事情起源于最近在写实验报告和课设说明书时出现图的题注是图0-1等不遵循设置的章节标号&#xff0c;于是我在查询和个人尝试后发现必须设置多级编号并且自定义设置对应的样式为标题几 另外注意设置后必须题注也要设置对应的样式&#xff0c;否则还是0-1&#xff0c;不用编辑域…

全球30米100%水陆覆盖高程

数据是GIS的血液。 熟悉水经注的朋友都应该知道&#xff0c;我们可以为大家提供全球30米和全球12.5米的高程数据&#xff0c;但这两种数据都无法达到全球覆盖。 你可以从《40TB全球12.5米高程DEM原始数据》与《700G全球30米高程DEM原始数据》等文中了解这两种数据的详细说明。…

git简介及安装

Git | Git简介与安装 文章目录 Git | Git简介与安装一、Git简介二、Git安装Linux-centosLinux-ubuntu 一、Git简介 存在需求&#xff1a;对于一个文档&#xff0c;由于编写思路或者当前文档丢失&#xff0c;可能存在想要历史版本的需求&#xff0c;并且需要知道每个版本都修改了…

忘记宝塔账号密码 如何解决

cd /www/server/panel && btpython tools.py panel testpasswd参考 https://www.bt.cn/bbs/thread-1172-1-1.html

(C++) 树状数组

目录 一、介绍 二、一维树状数组 2.1 区间长度 2.2 前驱和后继 2.3 查询前缀和 2.4 点更新 三、一维数组的实现 3.1 区间长度函数 3.2 前缀和 3.3 插入/更新 3.4 封装成类 一、介绍 树状数组&#xff08;Binary Indexed Tree&#xff0c;BIT&#xff09;&#xff0c;又称为 …

39. UE5 RPG角色释放技能时转向目标方向

在上一篇&#xff0c;我们实现了火球术可以向目标方向发射&#xff0c;并且还可以按住Shift选择方向进行攻击。技能的问题解决&#xff0c;现在人物释放技能时&#xff0c;无法朝向目标方向&#xff0c;接下来我们解决人物的问题。 实现思路&#xff1a; 我们将使用一个官方的…

大一考核题解

在本篇中&#xff0c;将尽力使用多种解法&#xff0c;来达到一题多练的效果。 1&#xff1a; 1.原题链接&#xff1a; 238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 这道题首先一眼肯定想到拿整体的积除以当前元素&#xff0c;将结果作为ans&#xff0c;…

Redis的主从复制

引入&#xff1a;分布是系统涉及到一个非常关键的问题&#xff1a;单点问题&#xff08;如果摸个服务器程序&#xff0c;只有一个节点&#xff08;只搞一个物理服务器&#xff0c;来部署这个服务器程序&#xff09;会出现&#xff1a; 1.可用性问题&#xff0c;如果这个机器挂…

轧铝机液压站比例阀控制器

轧铝机液压站是用于铝材轧制过程中提供动力和控制的系统&#xff0c;它对于确保铝材的质量至关重要。轧铝机液压站通常包含以下几个关键组成部分&#xff1a; 液压泵&#xff1a;为系统提供压力油&#xff0c;是液压系统的动力源。 控制阀组&#xff1a;包括方向控制阀、压力控…

由于磁盘空间不够导致服务无法访问的情况

昨天服务出现了一些“小状况”&#xff0c;这里做下记录&#xff0c;为了以后类似的问题&#xff0c;可以作为参考。 具体情况是&#xff0c;如下&#xff1a; 本来一直访问都好好的服务突然间访问不到了&#xff0c;首先确定了下服务器上的 docker 服务是否正常运行。确认正…

【触摸案例-触摸事件介绍 Objective-C语言】

一、触摸事件 1.接下来,我们来说这个,触摸事件, iOS当中的事件,可以分为三大类: 1)触摸事件 2)加速计事件 3)远程控制事件 事件呢,这个里面呢,使用app的过程当中呢,产生各种各样的事件,事件呢,分为三大类,在iOS里边儿啊,分为三大类,首先,有一个叫做触摸事…

MySQL中的“IS NULL”优化

MySQL中的“IS NULL”优化 在MySQL数据库中&#xff0c;查询性能的优化是保持应用高效运行的关键。一个常见的情况是处理空值&#xff08;NULL&#xff09;&#xff0c;尤其是在查询条件中使用IS NULL时。 理解IS NULL 在MySQL中&#xff0c;IS NULL运算符用于检查列中的值是…

2024年学浪视频怎么保存到本地相册

2024年已至&#xff0c;学浪应用上的视频购买人数持续攀升&#xff0c;然而一些课程已不再提供永久回放&#xff0c;这对那些在学浪购买了课程的人来说确实是一大困扰。在这里&#xff0c;我将为大家提供一种方法&#xff0c;让我们能够将学浪视频中那些非永久回放的内容下载到…