【JSP菜鸟教程】

news2024/11/17 3:08:39

简介

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

Scriptlet脚本小程序

如果你想在HTML中写Java代码,就需要将Java代码写入Scriptlet中,有三种写法:

  1. 定义局部变量、编写语句等:<%在这里写Java代码%>。生成的代码在servlet中的service方法体中
  2. 声明,声明全局变量、方法、类等:<%!在这里声明全局变量%>。生成的代码在servlet的类体中
  3. 输出表达式,可以输出变量或字面量:<%=数值%>。生成的代码在servlet中的service方法体中,相当于out.print()输出
<body>
    <%-- 第一种:Java脚本段,可以写Java代码,定义局部变量、编写语句等 --%>
    <%
        // 定义局部变量
        String str = "Hello Jsp";
        // 输出内容到控制台
        System.out.println(str);
        // 输出内容到浏览器
        out.print(str);
        out.write("------");
        // 输出全局变量
        out.write("全局变量:" + num);
        out.write("------");
    %>

    <%-- 第二种:声明,声明全局变量、方法、类等 --%>
    <%!
        // 声明全局变量
        int num = 10;
    %>

    <%-- 第三种:输出表达式,可以输出变量或字面量 --%>
    <%=str %>
</body>

JSP的指令标签

使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。

  1. 方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容
  2. 方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入

很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在 JSP 中如果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用 include 指令即可,动态包含则需要使用 include 动作标
签。

include静态包含

语法:<%@ include file="要包含的文件路径(注意:要写相对路径,不能为空,可以为表达式)" %>
现在我们建一个header.jsp:

<head>
    <title>头部</title>
</head>
<body>
    <h2>头部内容</h2>
    <%
        int num = 1;
    %>
</body>

再建一个footer.jsp:

<head>
    <title>底部</title>
</head>
<body>
    <h2>底部内容</h2>
    <%
        int a = 10;
    %>
</body>

把上面两个文件引入进来

<body>
    <%--
        include静态包含
            格式:
                <%@include file="要包含的页面地址"%>
            特点:
                1. 将内容进行了直接的替换
                2. 静态包含只会生成一个源码文件,最终的内容全部在_jspService方法体中(源码文件中)
                3. 不能出现同名变量
                4. 运行效率高一点点。耦合性较高,不够灵活。
    --%>
    <%@include file="04-header.jsp"%>
    <h2>主体内容</h2>
    <%
        int num = 1;// 在这里还是可以定义num
    %>
    <%@include file="04-footer.jsp"%>
</body>

静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在 servlet 引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起, 全部放到_jspService 方法中),所以只生成了一个 servlet,所以两个
页面不能有同名的变量。

include动态包含

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用,可以传递参数。

不传参

语法:<jsp:include page="要包含的页面路径(注意:要写相对路径,不能为空,可以为表达式)"></jsp:include>
注意:当动态包含不需要传递参数时,include双标签之间不要有任何内容,包括换行和空格:<jsp:include page="要包含的页面路径">这里啥都别写</jsp:include>

<body>
    <%--
        include动态包含不传递参数
            格式:
                <jsp:include page="要包含的页面路径"></jsp:include>
            特点:
                1. 动态包含相当于方法的调用
                2. 动态包含会生成多个源码文件,包含3个会生成4个源码文件(加上自己就是4个嘛)
                3. 可以定义同名变量
                4. 效率高,耦合度低
    --%>
    <jsp:include page="04-header.jsp"></jsp:include>
    <h2>主体内容</h2>
    <%
        int a = 1;
    %>
    <jsp:include page="04-footer.jsp"></jsp:include>
</body>

传参

语法:

<jsp:include page="要包含的页面路径(注意:要写相对路径,不能为空,可以为表达式)">
	<jsp:param name="参数名" value="参数值"/>
</jsp:include>

注意:name属性不支持表达式,value属性支持表达式

<body>
    <%
        String str = "hello";
        String url = "04-footer.jsp";
    %>
    <%--page的值为表达式--%>
    <jsp:include page="<%=url%>">
        <jsp:param name="uname" value="admin"/>
        <%--value属性支持表达式--%>
        <jsp:param name="msg" value="<%=str%>"/>
    </jsp:include>
</body>

获取参数:request.getParameter(name); 通过指定参数名获取参数值,04-footer.jsp:

<body>
    <h2>底部内容</h2>
    <%
        int a = 10;

        // 获取动态包含传递的参数
        String uname = request.getParameter("uname");
        String msg = request.getParameter("msg");
        out.print(uname+","+msg);
    %>
</body>

一个页面可以被重复包含多次:

<body>
    <jsp:include page="04-footer.jsp"></jsp:include>
    <jsp:include page="04-footer.jsp"></jsp:include>
</body>

JSP的四大域对象

四种属性范围

在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以在多少个页面中保存并继续使用

  1. page范围
  2. pageContext : 只在一个页面中保存属性,跳转之后无效
  3. request范围
    request : 只在一次请求中保存,服务器跳转后依然有效,客户端跳转失效
  4. session范围
    session : 在一次会话范围中,无论何种跳转都可以使用,只要session对象不销毁
  5. application范围
    application : 在整个服务器上保存,只要服务器不关闭,他就一直有效
方法类型描述
public void setAttribute(String name, Object o)普通设置属性的名称及内容
public Object getAttribute(String name)普通根据属性名称取属性
public void removeAttribute(String name)普通删除指定的属性

验证属性范围的特点

  1. page:本页面可以取得数据,服务器端跳转(<jsp:forward page="跳转的页面地址"></jsp:forward>)后无效
  2. request:服务器跳转有效,客户端跳转(超链接跳转)无效
    如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。
  3. session:无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得。
    对于服务器而言,每一个连接到它的客户端都是一个session
    如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application
  4. application:所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得。只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置

注意:使用哪个范围在合理范围尽可能小,因为范围越大,损耗的资源越多

测试jsp中服务端跳转,新建06-JSP的四大域对象.jsp,在其中设置域对象:

<body>
    <%
        //  设置page范围的域对象
        pageContext.setAttribute("name1","zhangsan");
        //  设置request范围的域对象
        request.setAttribute("name2","lisi");
        //  设置session范围的域对象
        session.setAttribute("name3","wangwu");
        //  设置application范围的域对象
        application.setAttribute("name4","zhaoliu");
    %>

    <%-- jsp中服务端跳转 --%>
    <%--<jsp:forward page="06-JSP的四大域对象-02.jsp"></jsp:forward>--%>
</body>

在以上页面启动服务器,会自动跳转到06-JSP的四大域对象-02.jsp页面,该页面内容如下:

<body>
    <%
        // 获取域对象中的值
        out.print("page范围:" + pageContext.getAttribute("name1") + "<br>");
        out.print("request范围:" + request.getAttribute("name2") + "<br>");
        out.print("session范围:" + session.getAttribute("name3") + "<br>");
        out.print("application范围:" + application.getAttribute("name4") + "<br>");
    %>
</body>

06-JSP的四大域对象-02.jsp页面获取到的内容如下,因为页面做了跳转,所以page范围的域对象获取不到
在这里插入图片描述
如果使用客户端跳转,06-JSP的四大域对象.jsp中跳转方式改为超链接:

<body>
	<%
        //  设置page范围的域对象
        pageContext.setAttribute("name1","zhangsan");
        //  设置request范围的域对象
        request.setAttribute("name2","lisi");
        //  设置session范围的域对象
        session.setAttribute("name3","wangwu");
        //  设置application范围的域对象
        application.setAttribute("name4","zhaoliu");
    %>
    
    <%-- 超链接跳转--%>
    <a href="06-JSP的四大域对象-02.jsp">跳转</a>
</body>

06-JSP的四大域对象.jsp页面启动服务器,点击页面超链接,会自动跳转到06-JSP的四大域对象-02.jsp页面,获取到的内容如下,因为是超链接跳转,所以获取不到session范围的域对象
在这里插入图片描述
关闭浏览器,然后打开浏览器,在URL中输入地址,得到的数据如下,因为关闭了浏览器嘛,所以获取不到session范围的域对象
在这里插入图片描述

EL表达式

在这里插入图片描述

操作字符串

<body>
    <%--
        EL表达式
        作用:
            简化JSP代码
        格式:
            ${域对象的名称}
        操作对象:
            EL表达式一般操作的是域对象,不能操作局部变量。
        操作范围:
            page范围
                在当前页面
            request范围
                在一次请求
            session范围
                在一次会话
            application范围
                在整个应用程序
        注:
            1. 如果el表达式获取域对象的值为空,默认显示空字符串
            2. el表达式默认从小到大范围去找,找到即可,如果四个范围都未找到,则显示空字符串
    --%>

    <%-- 设置数据 --%>
    <%
        pageContext.setAttribute("uname","zhangsan"); // page作用域
        request.setAttribute("uname","lisi"); // request作用域
        session.setAttribute("uname","wangwu"); // session作用域
        application.setAttribute("uname","zaholiu"); // application

        // 定义局部变量
        String str = "Hello";
    %>
    
    <%-- 获取数据 --%>
    获取局部变量:${str} <br>
    获取域对象:${uname} <br>
</body>

显然获取不到局部变量,显示空字符串。每个域中都定义了uname,但是取的是page作用域的值,因为他是从小到大取:
在这里插入图片描述
查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope,requestScope, sessionScope, applicationScope

<body>
    <%-- 设置数据 --%>
    <%
        pageContext.setAttribute("uname","zhangsan"); // page作用域
        request.setAttribute("uname","lisi"); // request作用域
        session.setAttribute("uname","wangwu"); // session作用域
        application.setAttribute("uname","zaholiu"); // application
    %>
    获取指定范围的域对象:<br>
    &nbsp;&nbsp;page范围:${pageScope.uname}<br>
    &nbsp;&nbsp;request范围:${requestScope.uname}<br>
    &nbsp;&nbsp;session范围:${sessionScope.uname}<br>
    &nbsp;&nbsp;application范围:${applicationScope.uname}<br>
</body>

获取结果:
在这里插入图片描述

操作集合

<body>
    <%--
        EL表达式的使用
            获取List
                获取List的size  ${list.size()}
                获取List的指定下标的值    ${list[下标]}
                注:list代表的是限域变量名,即存在域对象中的一个变量名
            获取Map
                获取Map中指定key的value   ${map.key} 或 ${map["key"]}
                注:map代表的是限域变量名
            获取JavaBean对象
                获取JavaBean中的属性
                    ${javaBean.属性名} 或 ${JavaBean对象.get属性名()}
                注:JavaBean中的属性字段必须提供get方法

    --%>
    <%
        // List
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        request.setAttribute("list", list);

        // Map
        Map map = new HashMap();
        map.put("aaa", "111");
        map.put("bbb", 2222);
        map.put("ccc-a", 333);
        request.setAttribute("map", map);

        // JavaBean对象
        User user = new User();
        user.setUserId(1);
        user.setUname("zhangsan");
        user.setUpwd("123456");
        request.setAttribute("user",user);

    %>
<h4>获取List</h4>
获取List的size:${list.size()} <br>
获取List的指定下标的值:${list[1]} <br>
<h4>获取Map</h4>
获取Map指定key的value值:${map.aaa} -- ${map["bbb"]}
<h4>获取JavaBean对象</h4>
获取JavaBean对象:${user}<br>
获取JavaBean中的属性:${user.uname} -- ${user.getUpwd()}
</body>

在这里插入图片描述

empty

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

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

相关文章

数据库实验一:数据定义与操作语言实验

实验一 数据定义与操作语言实验 实验 1.1 数据库定义实验 1.实验目的 理解和掌握数据库DDL语言&#xff0c;能够熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。 2.实验内容和要求 理解和掌握SQL DDL语句的语法&#xff0c;特别是各种参数的具体含义和使用方…

第十七届D2大会(I)

一、Web Compass-端内Web App解决方案揭秘 增强传统web端内方案&#xff0c;提供更好、更收敛的工程体验 二、自渲染跨端框架在字节跳动的实践与展望 基于Flutter Engine的二次开发 三、Qking&#xff1a;跨端JS引擎的深度探索与突破 常见js引擎&#xff0c;如&#xff1a;v8…

CSC7268

CSC7268概述: CSC7268是一款内置高压MOS的高性能、多工作模式的PWM控制芯片&#xff0c;内置多种保护机制。当系统为空载和轻载时&#xff0c;CSC7268采用Burst和Green控制模式可有效地减少了空载和轻载时的损耗。当系统为中载和重载时&#xff0c;芯片采用QR模式和CCM模式可有…

python基础: filter, lambda 函数表达式

filter(function or None, sequence)&#xff0c;其中sequence 可以是list ,tuple,string。这个函数的功能是过滤出sequence 中所有以元素自身作为参数调用function时返回True或bool(返回值)为True的元素并以列表返回. filter只能接受两个参(function,sequence) &#xff0c;其…

Biotin-PEG-SH,Biotin-PEG-Thiol,生物素PEG巯基PEG衍生物供应

英文名称&#xff1a;Biotin-PEG-Thiol&#xff0c;Biotin-PEG-SH 中文名称&#xff1a;生物素-聚乙二醇-巯基 生物素-PEG-SH通过与链霉亲和素或抗生物素结合进行聚乙二醇化&#xff0c;具有高亲和力和特异性。生物素通过稳定的酰胺连接物与线性PEG结合。它具有与马来酰亚胺选…

java 瑞吉外卖day3 公共字段自动填充 新增分类

公共字段自动填充 代码实现 1. TableField(fill FieldFill.INSERT)//插入时填充字段 private LocalDateTime createTime;TableField(fill FieldFill.INSERT_UPDATE)//插入和更新时填充字段 private LocalDateTime updateTime;TableField(fill FieldFill.INSERT) private Lo…

数据库实验六:存储过程实验

实验六 存储过程实验 实验6.1 存储过程实验 1.实验目的 ​ 掌握数据库PL/SQL编程语言&#xff0c;以及数据库存储过程的设计和使用方法。 2.实验内容和要求 ​ 存储过程定义&#xff0c;存储过程运行&#xff0c;存储过程更名&#xff0c;存储过程删除&#xff0c;存储过程…

[附源码]Python计算机毕业设计Django少儿节目智能推荐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Oracle数据的备份和恢复

Oracle数据的备份和恢复 ​ 当我们使用一个数据库时,总希望数据是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故…

logistic回归的标准化回归系数 计算方式

创建于&#xff1a;2022.12.17 修改于&#xff1a;2022.12.17 文章目录1、未标准化回归系数2、标准化回归系数3、两者的区别4、手动计算5、计算样例6、参考资料1、未标准化回归系数 通常我们在构建多因素回归模型时&#xff0c;方程中呈现的是未标准化回归系数&#xff0c;它是…

【财务】财务分析---管理报告体系搭建

财务分析体系搭建的是一个系统化的功能&#xff0c;涉及的业务面非常广&#xff0c;财务分析也能表现出清晰的数据&#xff0c;以此进行改善&#xff1b;本文作者详细分析了财务分析中的管理报告体系的搭建&#xff0c;我们一起来看一下。 一、理清核算、财报、管报、预算关系 …

java设计模式(下)

文章目录第六章 行为型模式(11种)6.1 观察者模式6.1.1 观察者模式介绍6.1.2 观察者模式原理6.1.3 观察者模式实现6.1.4 观察者模式应用实例6.1.5 观察者模式总结6.2 模板方法模式6.2.1 模板方法模式介绍6.2.2 模板方法模式原理6.2.3 模板方法模式实现6.2.4 模板方法模式应用实例…

计算机网络——PPP协议与HDLC协议

广域网 广域网通常跨接很大的1物理范围&#xff0c;所覆盖的范围从几十公里到几千公里&#xff0c;他能链接多个城市或者国家&#xff0c;并且横跨几个州并能提供远距离通信。 广域网的通信子网使用的分组交换技术&#xff0c;广域网的通信子网可以利用公用分局交换网&#xf…

我也“阳”了

大家好&#xff0c;我是哪吒&#xff0c;我也“阳”了&#xff0c;现在是北京时间2022年12月17日 18:36&#xff0c;这篇文章简单说一下我“阳”了的经历和感受。 昨天下午&#xff0c;发现嗓子疼&#xff0c;不舒服&#xff0c;喝了很多茶水&#xff0c;喝了一瓶蓝芩口服液&a…

【大数据技术Hadoop+Spark】Spark RDD设计、运行原理、运行流程、容错机制讲解(图文解释)

一、RDD的概念 RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff0c;即弹性分布式数据集&#xff0c;是一个容错的、并行的数据结构&#xff0c;可以让用户显式地将数据存储到磁盘和内存中&#xff0c;并且还能控制数据的分区。不同RDD之间可以通过转换操作…

SLAM 几何基础

SLAM 几何基础1. 向量运算及其几何意义1.1 内积1.1.1 内积定义1.1.2 内积几何意义1.1.3 内积微分性质1.2 外积1.2.1 外积定义1.2.2 外积几何意义1.2.3 外积微分性质2. 线面特征运算2.1 点到直线距离2.2 点到平面距离Reference:深蓝学院-多传感器融合 1. 向量运算及其几何意义 …

QT系列第4节 QT包含模块以及常用的数据类型和容器

QT中包含很多模块&#xff0c;这些模块都是建立在常用数据类型和容器基础之上的。本篇简单介绍一下常用模块&#xff0c;常用数据类型&#xff0c;常用容器类。 目录 1.QT模块分类 2.QT基本数据类型 3.QString和QByteArray区别 4.QT中的容器 1.QT模块分类 &#xff08;1&…

jdk11新特性——更简化的编译运行程序

目录一、概述二、注意事项三、注意事项1——代码示例3.1、示例13.2、示例23.3、示例3四、注意事项2——代码示例4.1、示例14.2、示例2一、概述 JEP 330 : 增强java启动器支持运行单个java源代码文件的程序。 在我们的认知里面&#xff0c;要运行一个 Java 源代码必须先编译&am…

CentOS 8:FTP服务器

FTP服务器 vsftpd , 是 CentOS 系统自带的 FTP 服务 其中&#xff0c;d 表示 daemon , 后台、守护进程的意思 FTP文件传递示意图&#xff1a; 检查 vsftpd 是否安装 ls /usr/sbin/vsftpd 安装vsftpd软件包 yum install vsftpd 其中&#xff0c;yum 是 CentOS 下的软件包…

低代码平台丨仪表盘实用技巧—【倒计时】

学生时代&#xff0c;我们经常能够看到所谓的中考倒计时、高考倒计时…… 这些白纸黑字的倒计时看板&#xff0c;不仅贯穿着我们的学生生涯。在步入职场之后&#xff0c;随之而来的项目倒计时、季度倒计时&#xff0c;年度倒计时……各种各样的倒计时看板&#xff0c;充斥着我…