(三)JSP教程——JSP动作标签
JSP动作标签
用户可以使用JSP动作标签向当前输出流输出数据,进行页面定向,也可以通过动作标签使用、修改和创建对象。
<jsp:include>标签
<jsp:include>标签将同一个Web应用中静态或动态资源包含到当前页面中。资源可以是HTML、JSP页面和文本文件等。通过include动作,可以多次使用同一个页面,增加了代码的可重用性。例如,可以在页面中使用include动作引入头部和底部页面。
<jsp:include>的语法如下:
<jsp:include page="relativeURL | <%=expression%>" flush="true" />
page指定引入页面的路径,flush表示在引入文件前是否刷洗缓冲区,默认为false。
下面以在JSP页面中引入头部页面来说明include的用法。
首先创建一个head.jsp页面,head页面的代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>head页面</title>
</head>
<body>
<p>header页面内容</p>
</body>
</html>

接着编写index.jsp页面,页面内容如下
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>主界面</title>
</head>
<body>
<jsp:include page="head.jsp"></jsp:include>
<p>主界面内容</p>
</body>
</html>

<jsp:forward>标签
<jsp:forward>标签能实时地从当前JSP页面跳转到同一个Web应用中静态资源,JSP页面或者Servlet,同时有效终止当前JSP页面的执行。其语法如下:
<jsp:forward page="url"/>
page属性指定要跳转资源的相对URL,且指定的文件只能十该Web应用中的文件。
下面用示例来说明<jsp:forward>标签的使用。首先我们准备一个login.jsp页面。
login.jsp页面的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<jsp:forward page="index.jsp"></jsp:forward>
</body>
</html>

index.jsp内容如下
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>主界面</title>
</head>
<body>
<p>主界面内容</p>
</body>
</html>

重新启动应用后,打开浏览器,在地址栏中输入:http://localhost:8080/s001/login.jsp
界面展示如下图所示

可以看到,浏览器中地址仍然是跳转前的地址。<jsp:forward>与Servlet中转发类似,客户端不会显示转发后的地址,有较好的隐蔽性。
<jsp:param>标签
<jsp:param>动作用来传递参数信息,经常和其它动作一起使用,例如和<jsp:include> 和 <jsp:forward>一起使用。其语法如下:
<jsp: param name="param_name" value="param_value" />
在<jsp:forward>标签中嵌套<jsp:param>可以将参数传递给要跳转的页面。语法如下:
<jsp:forward page="url">
<jsp: param name="param_name" value="param_value" />
</jsp:forward>
接下来我们修改以下login.jsp页面,代码如下
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<%
String gender = request.getParameter("gender");
if (gender.equals("male")) {
gender = "Mr.";
} else if (gender.equals("female")) {
gender = "Mrs.";
} else {
gender = "";
}
%>
Welcome!<%=gender%><%=request.getParameter("username")%>
</body>
</html>

启动该应用后,在浏览器地址栏中输入:http://localhost:8080/s001/login.jsp
可以看到如下结果

JSP useBean动作
<jsp:useBean>的语法如下:
<jsp:useBean id = "name" class = "package.class" scope= "page | request | session | application" />
属性id设定bean对象的变量名称。属性class设定bean对象对应的类,使用此标签会调用JavaBean不带参数的构造方法。
属性scope设定bean的应用范围,其值有四种:page、request、session、application,默认为page。
scope取值page:JSP引擎分配给每个客户的bean是互不相同的,他们占有不同的内存空间,该bean的有效范围是当前页面,当客户离开这个页面时,JSP取消分配给该客户的bean。
scope取值session:JSP引擎分配给每个客户的bean时互不相同的,该bean的有效范围是客户的会话期间。如果客户在某个页面更改了这个bean的属性,其他页面的这个bean的属性也将会发生同样的变化。
scope取值request:JSP引擎分配给每个客户的bean是互不相同的,该bean的有效范围是request期间。JSP引擎对请求做出响应后,取消分配给客户的这个bean。
scope取值application:所有客户共享这个bean,如果一个客户更改了这个bean的属性,所有客户的这个bean的属性也将发生同样的变化。这个bean直到服务器关闭才被取消。
下面以示例来说明<jsp:useBean>的用法,首先创建一个简答的Test类,Test类代码如下:
package com.example.servlet001;
public class Test {
public String concatStr(String str) {
String str2 = str.concat("Test java bean");
return str2;
}
}

然后创建一个index.jsp页面来使用这个类
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JavaBean示例</title>
</head>
<body>
<jsp:useBean id="test" class="com.example.servlet001.Test" />
<%
String str = "这是";
out.print(test.concatStr(str));
%>
</body>
</html>

启动该应用后,在浏览器中输入URL地址:http://localhost:8080/s001/

<jsp:getProperty>标签与<jsp:setProperty>标签
<jsp:getProperty name = "beanName" property = "attributeName">
<jsp:getProperty>标签用来获取JavaBean的属性值,属性name指定bean对象的变量名,属性property为要获取的对象属性名。使用此标签会调用指定属性的get方法,因此在JavaBean类定义中必须有此属性的get方法,且此方法的访问修饰符为public,否则执行此标签会抛出异常。
<jsp:setProperty name = "beanName" property = "attributeName" value = "attributeValue"/>
<jsp:setProperty>标签用来设置JavaBean的属性值,属性name指定bean对象的变量名,属性property为要设置的对象属性名,属性value为设定的属性值。使用此标签会调用指定属性的set方法,因此在JavaBean类定义中必须有此属性的set方法,且此方法的访问修饰符为public,否则执行此标签时会抛出异常。
另外JavaBean在JSP中还有一个很重要的机制——自省机制,即当服务器接收到请求时,它能根据请求的参数名称,自动设定与JavaBean相同属性名称的值。
首先创建一个Site类,Site类的代码如下:
package com.example.servlet001;
public class Site {
private String name;
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
创建一个login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="index.jsp" method="post">
网站名称: <input type="text" name="name"/> <br> <br>
网址: <input type="text" name="url"/> <br> <br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
创建一个index.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JavaBean示例</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="site" class="com.example.servlet001.Site"/>
<jsp:setProperty property="*" name="site"/>
<jsp:getProperty property="name" name="site"/>
<jsp:getProperty property="url" name="site"/>
</body>
</html>
启动该应用后,在浏览器地址栏中输入:http://localhost:8080/s001/login.jsp

点击提交按钮后的界面展示如下图所示

<jsp:plugin>标签
首先创建一个applet小程序,applet小程序代码如下
package com.example.httpservletrequest01;
import java.applet.Applet;
import java.awt.*;
public class MyApplet extends Applet {
@Override
public void init() {
setBackground(Color.gray);
}
@Override
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawString("Hello Word", 25, 50);
}
}

创建一个index.jsp页面,页面代码如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP plugin</title>
</head>
<body>
<jsp:plugin codebase="http://localhost:8686/s01/" type="applet" code="com.example.httpservletrequest01.MyApplet.class" width="800" height="800"></jsp:plugin>
</body>
</html>

Chrome浏览器需要安装CheerpJ Applet Runner 10.6,并启用

相关文章:
(三)JSP教程——JSP动作标签
JSP动作标签 用户可以使用JSP动作标签向当前输出流输出数据,进行页面定向,也可以通过动作标签使用、修改和创建对象。 <jsp:include>标签 <jsp:include>标签将同一个Web应用中静态或动态资源包含到当前页面中。资源可以是HTML、JSP页面和文…...
centos7安装真的Redmine-5.1.2+ruby-3.0.0
下载redmine-5.1.2.tar.gz,上传到/usr/local/目录下 cd /usr/local/ tar -zxf redmine-5.1.2.tar.gz cd redmine-5.1.2 cp config/database.yml.example config/database.yml 配置数据连接 #编辑配置文件 vi config/database.yml #修改后的内容如下 product…...
方法的重写
方法的重写 概念:子类继承父类之后,就拥有了符合权限的父类的属性和方法,但是当父类的方法不符合子类的要求的时候,子类也可以重新的书写自己想要的方法。所以,方法的重写,即子类继承父类的方法后…...
Terraform局部值
Terraform输入变量用于从外部传递值到Terraform模块内部进行使用,如果把Terraform代码看作是一个函数的话,Terraform输入变量就是函数的输入参数。 Terraform局部值则用于在Terraform模块内部定义反复使用的常量值或表达式,如果把Terraform代…...
vue+element-ui实现横向长箭头,横向线上下可自定义文字(使用after伪元素实现箭头)
项目场景: 需要实现一个长箭头,横向线上下可自定义文字 代码描述 <div><span class"data-model">{{ //上方文字}}</span><el-divider class"q"> </el-divider>//分隔线<span class"data-mod…...
性能监控之prometheus+grafana搭建
前言 Prometheus和Grafana是两个流行的开源工具,用于监控和可视化系统和应用程序的性能指标。它们通常一起使用,提供了强大的监控和数据可视化功能。 Prometheus Prometheus是一种开源的系统监控和警报工具包。它最初由SoundCloud开发,并于…...
25-ESP32-S3 内置的真随机数发生器(RNG)
ESP32-S3 内置的真随机数发生器(RNG)😎 引言 📚 在许多应用中,随机数发生器(RNG)是必不可少的。无论是在密码学🔒、游戏🎮、模拟🧪或其他领域,随…...
万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信
文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …...
2024年4月17日华为春招实习试题【三题】-题目+题解+在线评测,2024.4.17,华为机试
2024年4月17日华为春招实习试题【三题】-题目题解在线评测 🔮题目一描述:扑克牌消消乐输入描述输出描述样例一样例二Limitation解题思路一:模拟,遇到连续3张相同牌号的卡牌,直接删除解题思路二:栈解题思路三…...
展开说说:Android线程池解析
何谓线程池?本人理解是存放和管理线程的一个容器。 线程池存在的意义是什么? 第一:前面博客提到过创建和销毁线程的操作本身是有性能开销的,如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本&a…...
Selenium自动化测试面试题全家桶
🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 …...
Docker 容器日志占用空间过大解决办法
1、vi /etc/docker/daemon.json {"log-driver":"json-file","log-opts": {"max-size":"200m", "max-file":"1"} } 2、重新加载守护进程配置文件 systemctl daemon-reload 3、重启docker systemctl…...
update_min_vruntime()流程图
linux kernel scheduler cfs的update_min_vruntime() 看起来还挺绕的。含义其实也简单,总一句话,将 cfs_rq->min_vruntime 设置为: max( cfs_rq->vruntime, min(leftmost_se->vruntime, cfs_rq->curr->vruntime) )。 画个流…...
十进制转任意进制(以及任意进制来回转换<了解>)
十进制转任意进制: #include <iostream> #include <vector> #include <string> using namespace std; // 将十进制数转换为P进制形式的字符串 string toBase(int num, int base) {string result ""; // 初始化结果字符串为空wh…...
postcss-px-to-viewport 从入坑到放弃 (nuxt3搭建响应式官网解决方案 )
前沿 什么是 postcss-px-to-viewport 将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件。 为什么使用 postcss-px-to-viewport 在pc端盛行的时代 ,如果你不想去适配更多的pc端代码,可以采用它。 由于nuxt3本身已带postcss,所…...
C语言从入门到入门
一、引言 C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归等功能,其设计提供了低级别的存取权限,并且要求程序员管理所有的内存细节。C语言具有高效、灵活和可移植性等特点,因此被广泛应用于系统编程、嵌入式系统开发、游戏开发等领域。 …...
Java基础教程 - 4 流程控制
更好的阅读体验:点这里 ( www.doubibiji.com ) 更好的阅读体验:点这里 ( www.doubibiji.com ) 更好的阅读体验:点这里 ( www.doubibiji.com ) 4 流程控制 4.1 分支结构…...
大厂Java面试题:MyBatis中有几种加载映射器(Mapper.xml)的方式?
大家好,我是王有志。 今天给大家带来的是一道来自京东的 MyBatis 面试题:MyBatis 中有几种加载映射器(Mapper.xml)的方式? 常见加载 MyBatis 映射器的方式有 5 种,可以根据不同的使用方式来进行具体区分&…...
Flutter笔记:Widgets Easier组件库(10)快速处理承若型对话
Flutter笔记 使用Widgets Easier组件库快速处理承若型对话 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…...
10_Linux中的计划任务
10_Linux中的计划任务 常见计划任务 Linux系统中默认在执行的计划任务 日志文件的轮询:logrotate日志文件分析logwatch任务建立locate数据库建立manpage查询数据库RPM软件日志文件删除缓存与网络有关的分析 仅执行一次的计划任务 atd和at [rootnode4 ~]# systemctl start…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...
C++.OpenGL (9/64)摄像机(Camera)
颜色(Color) 颜色理论在OpenGL中的应用 #mermaid-svg-dKNDfS4EKDUmG4Ts {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dKNDfS4EKDUmG4Ts .error-icon{fill:#552222;}#mermaid-svg-dKNDfS4EKDUmG4Ts .error-text…...
分享今天做的力扣SQL题
其实做之前就打算分享的,但是做完又不想分享了。。。结果没几分钟,还是,写一下吧。我就当各位是监督我的。 说一下,这是第一天做SQL题,虽然我也是软件工程专业,但是学的本来就不好,又忘了个差不…...
当前市场环境下,软件行业的突围之道:技术演进与商业模式重构
一、行业背景:软件行业进入结构性调整期 2024年至今,软件行业面临三重挑战: 宏观经济承压:全球经济放缓,企业IT预算趋于谨慎; 资本市场收缩:融资环境收紧,盈利能力成为生死线&…...
