首页 > 其他分享 >JSP简单详细总结

JSP简单详细总结

时间:2024-06-21 22:00:09浏览次数:15  
标签:总结 Java 标签 jsp 详细 JSP hello 页面

简介

        JSP (全称:Java Server Pages): Java 服务端页面。是一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义 Java代码的动态内容,也就是 JSP = HTML + Java。如下就是jsp代码

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>JSP,Hello World</h1>
        <%
        	System.out.println("hello,jsp~");
        %>
    </body>
</html>

 上面代码 h1 标签内容是展示在页面上,而 Java 的输出语句是输出在 idea 的控制台。

原理

        我们之前说 JSP 就是一个页面,那么在 JSP 中写 html 标签,我们能理解,但是为什么还可以写 Java 代码呢?

        因为 JSP 本质上就是一个 Servlet。接下来我们聊聊访问jsp时的流程

  1. 浏览器第一次访问 hello.jsp 页面

  2. tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet

  3. tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class

  4. tomcat 会执行该字节码文件,向外提供服务

脚本

JSP 脚本有如下三个分类:

  • <%...%>:内容会直接放到_jspService()方法之中

  • <%=…%>:内容会放到out.print()中,作为out.print()的参数

  • <%!…%>:内容会放到_jspService()方法之外,被类直接包含

代码演示:

hello.jsp 中书写

<%
    System.out.println("hello,jsp~");
    int i = 3;
%>

        通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,i 变量定义在了 _jspService() 方法中

hello.jsp 中书写

<%="hello"%>
<%=i%>

        通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,该脚本的内容被放在了 out.print() 中,作为参数

hello.jsp 中书写

<%!
    void  show(){}
	String name = "zhangsan";
%>

        通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,该脚本的内容被放在了成员位置

缺点

由于 JSP页面内,既可以定义 HTML 标签,又可以定义 Java代码,造成了以下问题:

  • 书写麻烦:特别是复杂的页面

    既要写 HTML 标签,还要写 Java 代码

  • 阅读麻烦

    上面案例的代码,相信你后期再看这段代码时还需要花费很长的时间去梳理

  • 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE…

  • 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存

  • 调试困难:出错后,需要找到自动生成的.java文件进行调试

  • 不利于团队协作:前端人员不会 Java,后端人员不精 HTML

EL表达式

概述

EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。

EL 表达式的主要作用是 获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。而 EL 表达式的语法也比较简单,${expression}。例如:${brands} 就是获取域中存储的 key 为 brands 的数据。

代码演示

  • 定义servlet,在 servlet 中封装一些数据并存储到 request 域对象中并转发到 el-demo.jsp 页面。
    @WebServlet("/demo1")
    public class ServletDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1. 准备数据
            List<Brand> brands = new ArrayList<Brand>();
            brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
            brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
            brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
    
            //2. 存储到request域中
            request.setAttribute("brands",brands);
    
            //3. 转发到 el-demo.jsp
            request.getRequestDispatcher("/el-demo.jsp").forward(request,response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }

    注意:此处需要用转发,因为转发才可以使用 request 对象作为域对象进行数据共享

  • el-demo.jsp 中通过 EL表达式 获取数据
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        ${brands}
    </body>
    </html>

  • 在浏览器的地址栏输入 http://localhost:8080/jsp-demo/demo1 ,页面效果如下:

域对象

JavaWeb中有四大域对象,分别是:

  • page:当前页面有效

  • request:当前请求有效

  • session:当前会话有效

  • application:当前应用有效

el 表达式获取数据,会依次从这4个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示

         el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据。

JSTL标签

        JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。如下代码就是JSTL标签

<c:if test="${flag == 1}">
    男
</c:if>
<c:if test="${flag == 2}">
    女
</c:if>

JSTL 提供了很多标签,如下图

我们只对两个最常用的标签进行讲解,<c:forEach> 标签和 <c:if> 标签。

JSTL 使用也是比较简单的,分为如下步骤:

  • 导入坐标
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>

  • 在JSP页面上引入JSTL标签库
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

if 标签

<c:if>:相当于 if 判断

  • 属性:test,用于定义条件表达式
    <c:if test="${flag == 1}">
        男
    </c:if>
    <c:if test="${flag == 2}">
        女
    </c:if>

forEach 标签

<c:forEach>:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的 <c:forEach> 也有两种用法

用法一

类似于 Java 中的增强for循环。涉及到的 <c:forEach> 中的属性如下

  • items:被遍历的容器

  • var:遍历产生的临时变量

  • varStatus:遍历状态对象

        如下代码,是从域对象中获取名为 brands 数据,该数据是一个集合;遍历遍历,并给该集合中的每一个元素起名为 brand,是 Brand对象。在循环里面使用 EL表达式获取每一个Brand对象的属性值

<c:forEach items="${brands}" var="brand">
    <tr align="center">
        <td>${brand.id}</td>
        <td>${brand.brandName}</td>
        <td>${brand.companyName}</td>
        <td>${brand.description}</td>
    </tr>
</c:forEach>

用法二

类似于 Java 中的普通for循环。涉及到的 <c:forEach> 中的属性如下

  • begin:开始数

  • end:结束数

  • step:步长

实例代码:从0循环到10,变量名是 i ,每次自增1

<c:forEach begin="0" end="10" step="1" var="i">
    ${i}
</c:forEach>

标签:总结,Java,标签,jsp,详细,JSP,hello,页面
From: https://blog.csdn.net/qq_62636650/article/details/139856598

相关文章

  • java周测总结(2)
    1.什么是I0流.  是一串流动的字符从先进先出的方式发送信息的通道。2.IO流共有多少种划分方式,分别都包含哪些流三种   按流分   输出输入流   按处理单元分字节和节符按流的角色方节点流和处理流3.如何把字荐串交量str转换为字节数组,并且存入bytes数......
  • 初识Python----“三剑客“之matplotlib(个人总结,一些简单的图形使用,适用于初学者)
            Matplotlib是Python中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是Python常用的2D绘图库,同时它也提供了一部分3D绘图接口,Matplotlib通常与NumPy、Pandas一起使用,是数据分析中不可或缺的重要工具之一。        在数据分析中,我们......
  • 寄存器详细介绍:底层原理、物理组成、应用方法及使用场景
    1.寄存器的基本概念在计算机体系结构中,寄存器是一种高速的存储设备,用于暂时存储和快速访问CPU所需的数据。它们位于CPU内部,并直接参与到指令执行和数据处理过程中。寄存器是计算机硬件中最快速的存储单元,其存取时间通常在纳秒级别,远远快于主存(RAM)和硬盘(HDD/SSD)。2.物理......
  • 最详细的JS学习笔记(连载)第二章、数组方法(删除)
    数组删除(1)数组.pop() 移除最后一个元素,并返回移除该元素值  参数:无        返回值:被删除的那个元素           原有的数组改变letary=[10,20,30]varres=ary.pop();console.log(res,ary)   //res=>30  ary=>[10,20]基于原......
  • Qt 文件模型(QFileSystemModel)详细介绍
    一.定义Qt提供了QFileSystemModel类,用于在Qt应用程序中展示文件系统的数据。QFileSystemModel类是QAbstractItemModel的子类,可以方便地将文件系统的文件和文件夹结构作为数据模型,供Qt的视图类(比如QTreeView、QListView等)使用。二.功能设置根路径:使用setRootPath()方法设置......
  • webshell总结
    一、webshell概况1.webshell概念:经常有客户的网站碰到被上传小马和大马,这里的“马”是木马的意思,可不是真实的马。通常,攻击者利用文件上传漏洞,上传一个可执行并且能被解析的脚本文件,通过这个脚本来获得服务器端执行命令的能力,也就是我们经常听到的WebShell,而这个脚本文件就......
  • JAVA每日总结day6.21
    ok了家人们,今天我们学习了面向对象中关键字的使用和抽象类,话不多说,我们一起看看吧,(今天终于星期五了,芜湖!!!)一,this和super关键字1,this关键字的三种用法1.1this的意义 this:表示当前对象this可以访问:本类的成员属性、成员方法、构造方法;1.2 this.成员变量(第一种)......
  • 【计算机网络】第四章.网络层 网络层重点知识总结(2)
    ......
  • C/C++ 缓冲区溢出问题总结
    缓冲区溢出(BufferOverflow)是一种常见的安全漏洞,它发生在当程序试图将更多的数据放入一个固定大小的内存区域(即缓冲区)时,超过了该区域所能容纳的数据量。这可能导致未定义的行为,包括数据损坏、程序崩溃,甚至更糟糕的是,攻击者可以利用这种漏洞执行恶意代码。一、缓冲区溢出概述缓冲......
  • 大模型技术及趋势总结
    本篇文章旨在希望大家对大模型的本质、技术和发展趋势有简单的了解。由于近期大模型技术发展很快,这里对大模型的技术、本质及未来趋势进行总结和探讨时,因为水平有限,疏漏在所难免。请大家谅解。引言大模型将成为通用人工智能的重要途径。在这个由0和1编织的数字时代,人工智能的腾......