服务器渲染技术(JSPELJSTL)

news2024/11/6 9:27:52

目录

前言

一.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>

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

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

相关文章

4-内核开发-第一个块设备模块开发案例

4-内核开发-第一个块设备模块开发案例 目录 4-内核开发-第一个块设备模块开发案例 1.开发原则创建步骤 2. 编译并加载模块 ​3.安装模块 4.检查模块是否加载成功 5.通过设备名称查看 6. 创建一个块设备文件 7. 查看块设备 8.模块卸载 9.总结 课程简介&#xff1a; L…

Qt-饼图示范

1.效果图 2.代码如下 2.1 .h文件 #ifndef PIECHARTWIDGET_H #define PIECHARTWIDGET_H#include <QWidget> #include <QChartView> #include <QPieSeries>#include<QVBoxLayout> #include<QMessageBox> #include <QtCharts>struct PieDat…

电子印章盖骑缝章

电子印章盖骑缝章是指在电子文档&#xff08;如PDF文件&#xff09;中&#xff0c;使用电子印章技术&#xff0c;为文档添加一个跨越多页、连续显示的电子印章图像&#xff0c;以模拟传统纸质文档上的骑缝章效果。以下是实现电子印章盖骑缝章的步骤&#xff1a; 一. 准备电子印…

linux休眠唤醒流程,及示例分析

休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态&#xff0c;给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) …

Linux - Docker 安装 Nacos

拉取 Nacos 镜像 使用以下命令从 Docker Hub 拉取最新版本的 Nacos 镜像&#xff1a; docker pull nacos/nacos-server启动 Nacos 容器 使用以下命令启动 Nacos 容器&#xff1a; docker run -d \--name nacos \--privileged \--cgroupns host \--env JVM_XMX256m \--env M…

【Harmony3.1/4.0】笔记三

概念 网格布局是由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力&#xff0c;子组件占比控制能力&#xff0c;是一种重要自适应布局&#xff0c;其使用场景有九宫格图片展示、日历、计算器等…

Vue2 —— 学习(十)

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

设计模式之访问者模式(下)

3&#xff09;访问者模式与组合模式联用 1.概述 在访问者模式中&#xff0c;包含一个用于存储元素对象集合的对象结构&#xff0c;可以使用迭代器来遍历对象结构&#xff0c;同时具体元素之间可以存在整体与部分关系&#xff0c;有些元素作为容器对象&#xff0c;有些元素作为…

2024年小程序视频下载教程

现在已经是2024年&#xff0c;还是有很多人不知道如何下载小程序视频&#xff0c;这里就教大家如何下载小程序视频&#xff0c;一共有3种方法 1.录屏 2.利用抓包工具(Fiddler&Charles) 3.利用专门的下载资源工具(下载高手) 我介绍其中的第3种方法 工具我已经打包好了 …

【Linux学习】Linux调试器-gdb使用

这里写目录标题 &#x1f302;背景&#x1f302;gdb使用&#x1f302;指令总结&#xff1a; &#x1f302;背景 程序的发布方式有两种&#xff0c;debug模式和 release模式 其中&#xff0c;debug模式是可以被调试的&#xff0c;到那时release模式是不能被调试的&#xff1b; …

股东减持,营收“四连降”,三只松鼠用什么撑起“百亿”野心?

近日&#xff0c;国内零食品牌三只松鼠&#xff08;SZ:300783&#xff09;发布了2023年业绩报告。从规模效益的层面出发&#xff0c;三只松鼠在高端化和高性价比逻辑下对门店进行了集中优化&#xff0c;虽然营收略有下降&#xff0c;但利润端却实现了强势回暖。 不过&#xff…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

4*5的矩阵(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int result 0;//嵌套循环输出&#xff1b;for (i 1; i < 4; i){//列…

冯喜运:4.22黄金蒋继续“消化超买“,原油回落,通胀担忧缓解?

【 黄金消息面解析】&#xff1a;上周五(4月19日)伊朗媒体似乎淡化了以色列袭击的影响&#xff0c;表明地缘政治风险降低&#xff0c;导致避险资产需求放缓&#xff0c;金价回吐涨幅。上周现货黄金价格上涨超2%。美国黄金期货收盘上涨0.7%&#xff0c;至2413.8美元。从长期来看…

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

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

【Linux 进程间通信】管道(三)

文章目录 1.管道的五种特征2.管道的四种情况 1.管道的五种特征 ①&#x1f34e;匿名管道只能用于有血缘关系的进程之间进行通信&#xff08;爷孙进程之间可以进行通信&#xff09;&#xff0c;常用于父子之间进行通信&#xff1b; ②&#x1f34e;管道内部&#xff0c;自带进…

Mysql的【存储引擎】之【InnoDB】与【MyISAM】的区别

目录 1.存储引擎在 MyISAM 和 InnoDB 有什么区别 2.Mysql 5.7 默认的存储引擎是什么 3.一个简单例子&#xff08;如果非要使用【MyISAM】存储引擎 &#xff09; 4.2009年写的留言板程序的数据&#xff08;存储引擎是&#xff1a;【MyISAM】&#xff09; 5.mysql 8.0 可以使…

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

UV胶水能够粘接丙烯腈-丁二烯-苯乙烯共聚物ABS吗?

UV胶水能够粘接丙烯腈-丁二烯-苯乙烯共聚物ABS吗&#xff1f; UV胶水通常能够用于粘接丙烯腈-丁二烯-苯乙烯共聚物&#xff08;ABS&#xff09;。UV胶水的优势之一是其适用于多种材料的粘接&#xff0c;包括ABS。然而&#xff0c;成功的粘接还取决于一些因素&#xff0c;包括表…

ActiveMQ 如果数据处理出现异常会怎么样

我们有一个 Spring 的客户端&#xff0c;在处理消息的时候因为程序的原因出现消息处理异常。 对这种情况&#xff0c;ActiveMQ 会把出现异常的消息放在 DLQ 队列中进行持久化。 因此&#xff0c;在 ActiveMQ 消息处理队列中需要持续关注 DLQ 队列&#xff0c; DLQ 的队列都是无…