服务器渲染技术(JSP&EL&JSTL)

目录

前言

一.JSP

1.基本介绍

3.page指令(常用)

4.JSP三种常用脚本

[4.1 声明脚本 <%! code %>](#4.1 声明脚本 <%! code %>)

[4.2 表达式脚本 <%= code %>](#4.2 表达式脚本 <%= code %>)

[4.3 代码脚本 <% code %>](#4.3 代码脚本 <% code %>)

[4.4 注释 <%-- 注释 --%>](#4.4 注释 <%-- 注释 --%>)

[5. JSP 内置对象](#5. JSP 内置对象)

[5.1 基本介绍](#5.1 基本介绍)

[5.2 九个内置对象](#5.2 九个内置对象)

6.JSP域对象

二.EL

1.EL表达式介绍

2.输出形式

3.EL运算操作

4.EL的对象和属性

[4.1 11个隐含对象](#4.1 11个隐含对象)

[4.2 EL获取四个特定域的属性](#4.2 EL获取四个特定域的属性)

[4.3 pageContex对象的使用](#4.3 pageContex对象的使用)

三.Jstl

1.介绍

2.细节

3.core核心库

[3.1 set](#3.1 set)

[3.2 if](#3.2 if)

[3.3 choose when ohterwise](#3.3 choose when ohterwise)

[3.4 forEach](#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

    java 复制代码
          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指令(常用)

html 复制代码
<%@ 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需要的属性,方法,静态代码块和内部类

java 复制代码
<%!
    static String name;
    int age;

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

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

%>

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

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

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

4.3 代码脚本 <% code %>

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

html 复制代码
<%
    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()

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

  8. 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集合属性

实例:

html 复制代码
<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对象的使用

html 复制代码
协议: ${ 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 是什么

  1. value 属性设置值
html 复制代码
<c:set scope="request" var="name" value="dog"></c:set>
${name}

3.2 if

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

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

html 复制代码
<c:if test="${ 10 > 2 }">
<h1>10 > 2 为真</h1>
</c:if>

3.3 choose when ohterwise

类似于switch case default

html 复制代码
<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

html 复制代码
<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>
相关推荐
骆晨学长3 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
pyliumy5 分钟前
rsync 全网备份
linux·运维·服务器
AskHarries8 分钟前
利用反射实现动态代理
java·后端·reflect
@月落8 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
liuyang-neu14 分钟前
力扣 42.接雨水
java·算法·leetcode
z千鑫18 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
Flying_Fish_roe32 分钟前
Spring Boot-Session管理问题
java·spring boot·后端
赚钱给孩子买茅台喝33 分钟前
智能BI项目第四期
java·spring boot·spring cloud·aigc
ggb199937 分钟前
【python的坑】vpn下,python request报错 check_hostname requires server_hostname
linux·运维·服务器
多多*1 小时前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架