JSP(六)动作标签
一、六大动作标签(JSP标签)
作用:JSP动作标签利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组
件、把用户重定向到另外的页面、为Java插件生成HTML代码。
注意:路径的书写(自动获取,不用手动,项目可能会变!)
特点:
(1)jsp动作元素是用XML语法写成的
<jsp:action_name attribute="value" />
(2)jsp的动作标签,在使用的时候不需要导包(内置了)
(3)所有的动作要素都有两个属性:id属性和scope属性
简要介绍:
id属性:是动作元素的唯一标识,可以在JSP页面中引用,动作元素创建的id值可以通过PageContext对象来调用。
scope属性:用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命,scope属性有四个可能的值:page、request、session和application,这是JSP的四个作用域。
动作元素的展示:
二、动作标签的分类(五类)
第一类(重点掌握)是与JavaBean有关的,包括3个动作元素:
<jsp:useBean> <jsp:getProperty> <jsp:setProperty>
第二类(重点掌握)是JSP1.2就开始有的基本元素,包括6个动作元素:
<jsp:include> <jsp:foward> <jsp:param> <jsp:plugin> <jsp:params> <jsp:fallback>
第三类是JSP2.0新增加的元素,主要与JSP Document有关,包括6个动作元素:
<jsp:root> <jsp:declaration> <jsp:scriptlet> <jsp:expression> <jsp:text> <jsp:output>
第四类是JSP2.0新增加的元素,主要是用来动态生成XML元素标签的值,包括3个动作元素:
<jsp:attribute> <jsp:body> <jsp:element>
第五类是JSP2.0新增加的元素,主要使用在Tag Filter中,包括2个动作元素:
<jsp:invoke> <jsp:dobody>
三、JavaBean
(0)实质
JavaBean就是符合某种特定的规范的普通Java类。
(1)JavaBean的优势
解决代码重复编写,减少代码冗余,功能区分明显,提高了代码的可维护性。
(2)JavaBean设计原则
(3)JSP页面中使用JavaBean
①像使用普通Java类一样,创建JavaBean类实例
JavaBean----User类
package org.wzj.com;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
在JSP中使用脚本获取JavaBean中的数据。
<body><%User user = new User();user.setUsername("zhangsan");user.setPassword("123456");%><!--说明:原来的脚本方式获取(也可以传递到域对象中,然后再获取)--><%=user.getUsername()%><br><%=user.getPassword()%></body>
②在JSP页面中使用 JSP动作元素使用JavaBean类(掌握!)
1)<jsp:useBean>动作元素
作用:在JSP页面中实例化或者在指定范围内使用JavaBean,用来加载一个将在JSP页面中使用的JavaBean,使得我们可以发挥JavaBean组件复用的优势。
语法:
<jsp:useBean id="标识符" class="Java类全路径名" scope="作用范围" ></jsp:useBean>
说明:创建一个由class属性指定的类的实例(反射),然后把它绑定到其名字由id属性给出的变量上
在JavaBean类载入后,我们可以通过<jsp:setProperty>动作元素和<jsp:getProperty>动作元素来修改和获取Bean的属性。
useBean动作元素相关的属性列表:
给出具体实例前,让我们先来看下<jsp:setProperty>动作元素和<jsp:getProperty>动作元素
<body><jsp:useBean id="user" class="org.wzj.com.User"><jsp:setProperty name="user" property="username" value="lisi"></jsp:setProperty><jsp:setProperty name="user" property="password" value="123456"></jsp:setProperty>用户名:<jsp:getProperty name="user" property="username"></jsp:getProperty><br>密码:<jsp:getProperty name="user" property="password"></jsp:getProperty></jsp:useBean></body>
创建JavaBean的说明(可以指定存放域对象):
然而jsp:useBean并非总是意味着创建一个新的Bean实例,如果不指定scope默认值是从page域(找不到不会从其它域中查找)中获取,也即该Bean只在当前页面内可用(保存在当前页面的PageContext内)
scope的属性理解:
scope 指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。 默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。 即当客户使用bean时为每个客户占用不同的空间,简单说bean是不共享的,用户不能互相干涉。当用户离开该访问页时无效。
Scope取 session:即该bean是共享的(会话),表示该Bean对当前HttpSession内的所有页面都有效。所有用户访问时将对同一个bean操作,会 互相干涉。当客户关闭浏览器时无效。
Scope取 request:只当用户访问时有效,且 不是共享的,该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。当客户请求时作出响应,响应完后无效。
Scope取application:共享bean(站点),则表示该Bean对所有具有相同ServletContext的页面都有效,当服务器关闭时该bean无效。
scope重要原因:是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
何时是使用?:如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。但是注意即使是获取也是获取在本JSP页面存储的数据
此时:id的含义是命名引用该对应域Bean的变量
思考:通过JavaBean可以获取从Servlet域中传递过来的数据吗(跨域获取)?
<jsp:setProperty>动作元素
特点:只有在新建Bean类实例时才会执行,如果是使用现有实例则不执行<jsp:setProperty>动作元素。
常用属性:
<jsp:getProperty>动作元素
特点(执行过程):提取指定Bean类属性的值,转换成字符串,然后输出
明白:获取的是表单中的数据还是域对象中的数据?
相关链接:点击打开链接
四、<jsp:forward>动作元素(请求转发--服务器内部转发)
语法:
<jsp:forward page="相对 URL 地址" />
属性说明:
page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,可以是一个JSP页面或者一个Java Servlet. |
五、<jsp:param>动作元素
特点:常用<jsp:forward >动作元素一起使用(携带参数)。
语法:
<jsp:param name="参数名" value="参数值" />
使用(参照get提交方式携带数据)
1、JSP之前的脚本形式的转发:
<% request.getRequestDispatcher("/guess.jsp?name=eric&name=jacky").forward(request, response) ;%>
2、forward:请求转发标签(携带参数)
<jsp:forward page="/03.action.jsp"><jsp:param value="eric" name="name"/><jsp:param value="lucy" name="name"/>
</jsp:forward>
注意:jsp标签的注释一定要使用jsp的注释!
说明:使用forward转发的时候,携带参数数据,用到param参数标签!
六、<jsp:include>动作元素(动态--静态包含)
特点:包含和被包含的Jsp文件都会被翻译成对应的java文件(独立的),然后再合并,并且可以携带参数
语法:
使用:
<jsp:include page="/common/header.jsp"><jsp:param value="eric" name="name"/><!--可以向被包含页面传递参数Parameter-->
</jsp:include>
比较:jsp:include标签是执行时期的包含,也叫动态包含。被包含的页面会在服务器上运行产生响应数据,将响应的数据包含到本JSP响应中。因此这个标签既可以包含Servlet,JSP动态资源,也可以包含HTML等静态资源。如果是包含了JSP或者Servlet,则是包含了被包含页面执行后的输出结果(也就是是被包含页面的out对象输出的结果)。 如果包含的是静态内容,则其效果和使用<%@ page include %>是一样的,这种情况下还是使用include指令比较高效。
补充:
<jsp:include>动作元素包含的是执行结果,而include指令包含的是文件内容。
<jsp:include>动作元素在请求期间被执行,而include指令在编译期页面间被执行。
适用场景:
(1)页面内容经常变化时更适合使用<jsp:include>动作元素。
(2)页面内容不经常变化时更适合使用include指令。
简单理解:
动态包含:先翻译成java文件,然后在进行源码的合并,并且动态包含可以携带参数数据的
静态包含:先合并,再翻译,不可以携带参数数据
图解1:
图解2:
动作标签目的:替换jsp的脚本
相关链接:点击打开链接
---------------------------------------------
七、六大标签(非动作标签)---构建知识谱
2) jsp的jstl核心标签(第三方)在
(0)说明:使用时必须导包并关联
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
uri标签:它是每一个c标签的标识符
prefix:给当前uri的标识符指定一个指定他的前缀和tld文件中的short-name标签的内容一致
(1)JSTL标签的引出:EL表达式有缺陷,它不能赋值、不能遍历、不能迭代,逻辑判断,但是可以通过jsp标签完成这些操作!
特点:在使用的时候需要导包
回顾:用jsp进行几个逻辑练习
(1)单条件选择
说明:
<%--1)单条件判断语句<c:if/> ---->相当于if语句test:如果test中的表达式是true,那么就会执行c:if语句的代码 if(true){语句1}
--%>
练习:
<c:if test="${5>3}"><h1>今天是个好日子,提前祝大家端午节快乐</h1>
</c:if>
(2)多条件选择
语法:
<%--多条件判断语句:<c:choose/>+<c:when/>+<c:otherwise/>--%>
练习:
<c:choose><c:when test="${score>0&&score<60}">${"不及格"}</c:when><c:when test="${score>=60&&score<80}">${"中等"}</c:when><c:when test="${score>=80&&score<=100}">${"优秀"}</c:when><c:otherwise>${"成绩不合法"}</c:otherwise>
</c:choose>
练习2
<%--模拟登录实际开发中,登录成功之后,通过后台一定要将用户数据保存到session对象中--%><c:choose><c:when test="${!empty sessionScope.user }">欢迎回来,你的用户名是:eric,<a href="">[退出登录]</a></c:when><c:otherwise>请<a href="">注册</a>或者<a href="">登录</a></c:otherwise></c:choose>
(3)迭代(一般数组)
<%--重点forearch:用来进行遍历或者迭代几个常用属性:begin:默认值是从0开进行遍历end:到哪个元素位置结束: 如果不写,默认到最后一个step:每次循环遍历多个元素,默认值是1items:遍历集合|数组 ,前提是需要从域对象获取数据(分割线--------)var:表示当前遍历的名称varStatus:当前对象的状态信息.通过当前属性值.count(显示序号),默认从1开始--%>
练习1:数组的遍历
<c:forEach begin="0" end="4" step="1" var="i">${arr[i]}<br>
</c:forEach>
(4)迭代(增强--集合)
注意:使用c:forEach items属性前提是一定要将map集合存储到域对象中
<%ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");session.setAttribute("list",list);
%>
<%--items:你要遍历的容器、var:你当前遍历的元素、varStatus:用来记录循环的状态常用的属性:count:记录次数从1开始(遍历的是第几个元素!)current:当前遍历的内容index: 索引从0开始
--%>
<c:forEach items="${list}" var="ele" varStatus="v">${ele}<br><%--当前遍历的个数 从1开始数--%><%--${v.count}--%><%--当前遍历的元素--%><%--${v.current}--%><%--当前遍历的索引从0开始数--%><%--${v.index} --%>
</c:forEach>
<%Student student = new Student();student.setName("zhangsan");student.setAge(23);Student student2 = new Student();student2.setName("lISI");student2.setAge(24);ArrayList<Student> list2 = new ArrayList<>();list2.add(student);list2.add(student2);session.setAttribute("list2",list2);
%>
<c:forEach items="${list2}" var="ele" varStatus="v">${ele.name}<br>${ele.age}<br><hr>${v.current.name}<br>${v.current.age}
</c:forEach>
<hr>
<%HashMap<String, String> hm = new HashMap<>();hm.put("武大","金莲");hm.put("宝强","蓉蓉");hm.put("陈思成","佟丽娅");hm.put("文章","马伊琍");request.setAttribute("hm",hm);
%><%--map集合中,将其中的属于以一种键值对对象存储到域对象,entry--%>
<c:forEach items="${hm}" var="ele" varStatus="v">${ele.key}<br><!--注意!-->${ele.value}<br>
</c:forEach>
<hr>
<%HashMap<String, Student> hm2 = new HashMap<>();Student student3 = new Student();student3.setName("zhangsanaaaa");student3.setAge(233);Student student4 = new Student();student4.setName("lISIaaa");student4.setAge(241);hm2.put("s001",student3);hm2.put("s002",student4);request.setAttribute("hm2",hm2);
%>
<c:forEach items="${hm2}" var="entry">${entry.key}<br>${entry.value.name}<br>${entry.value.age}<br>
</c:forEach>
(4)域中保存数据
<%--set标签往域中存数据-- var 键 、value值 、scope 域对象--%>
<c:set var="str" value="hehe" scope="request"></c:set>
${str}<!--查看数据-->
说明:
<%--1)给域对象进行赋值<c:set/>var:保存域对象名称value:保存对应的值scope:将当前数据保存到哪个域对象总page-->page域request->request域session->session域application->application域
--%>
原来脚本赋值
<%String name = "eric" ;request.setAttribute("name", name) ;
%>
现在赋值(与上等价)
<c:set var="name" value="eric" scope="request"></c:set>
(5)展示数据
<%--2)从域对象中获取数据(展示数据)value:一定要从保存的域对象中获取数据defalt:默认值,获取当前的域对象的数据为null的时候,默认值就会起作用excapeXml:默认值是true(不转义),会将defalut中的内容(HTML)进行转义,也就是是以文本还是标签
--%><c:out value="${name}" default="<h3>标题3</h3>" escapeXml="false"></c:out>
应用场景:略
注意:JSTL标签是配合EL表达式一起来使用的
(6)特殊字符串的遍历
<%--特殊的字符串遍历<c:forToken/>
--%><c:set var="str" value="平面设计-java-php-python"/><!--保存在page域中--><%--传统方式:String str = (String)pageContext.getAttribute("str") ;String[] strs = str.split("-") ;for(int i = 0 ; i < strs.length ; i ++){out.write(strs[i]+" ") ;}--%><br/>
<%--说明:items:需要遍历的字符串delims:指定的分隔符号(类似正则表达式的条件)var:每个内容名称
--%>
<c:forTokens items="${str}" delims="-" var="s">${s}
</c:forTokens>
(7)重定向
<%--
重定向的核心标签:<c:redirect/>--%>
<%--response.sendRedirect(request.getContextPath()+"/02.action.jsp") ;
--%><c:redirect url="/guess.jsp"></c:redirect>
特点:核心标签库的重定向不需要写上下文路径。
八、自定义标签(ee简单说)
省略。。。
未完待续。。。
JSP(六)动作标签相关推荐
- JSP基础--动作标签
JSP基础--动作标签 JSP动作标签 1 JSP动作标签概述 动作标签的作用是用来简化Java脚本的! JSP动作标签是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用 ...
- jsp usebean_JSP动作标签– jsp useBean,包含,转发
jsp usebean JSP provides a bunch of standard action tags that we can use for specific tasks such as ...
- 003_Jsp动作标签
一. 介绍3个Jsp动作标签 1. <jsp:include page=""></jsp:include> 2. <jsp:param value=& ...
- jsp怎么操作html标签,JSP、HTML标签
JSP 标准标签库(JSTL) JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判 ...
- jsp脚本、jsp标准动作、EL表达式、JSTL标签
https://blog.csdn.net/gx_hxl/article/details/79032331 https://blog.csdn.net/a731604348/article/detai ...
- JavaBean用JSP调用和使用JSP动作标签的区别
javabean的类可以用jsp动作标签实例化并使用. 1 <!-- 下面这句是对Javabean类person的引用,引用的实例是p2 --> 2 <jsp:useBean id= ...
- java学习之服务器第28天( --jsp--三个指令--六个动作标签--PageContext域--EL表达式--)
你想要多大的成功,你愿意为这份成功付出什么? 一.jsp 定义: 每一种技术名称都一定说明他的作用. jsp 的全称: Java Server pages ( Java服务器页面), 既然他是Java ...
- Java虚拟机中的内存模型?JSP常用的动作标签及作用? 如何防止表单重复提交问题? JSP四大作用域及请求范围? 分别说出http,https,ftp,talnet的默认端口?
文章目录 一 ,Java虚拟机中的内存模型JVM? 1,Java堆 2,方法区 3,Java栈 4,本地方法栈 问题扩展: 二 , JSP常用的动作标签及作用 (1)问题分析: (2)核心答案讲解: ...
- jsp中c标签的详细使用
jsp中c标签的使用 JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧, ...
最新文章
- Epson投影仪指示灯信息
- 如何使Git“忘记”已跟踪但现在位于.gitignore中的文件?
- MySQL 索引 :哈希索引、B+树索引、全文索引
- java版的中世纪战争_世界战争英雄设置-火焰纹章英雄英雄地图及AI命令设置
- 一直认为in,exists 不走索引,被同事鄙视了……
- CoreJavaE10V1P3.2 第3章 Java的基本编程结构-3.2 注释
- Auto 和 Decltye 的区别
- 文本匹配开山之作--双塔模型及实战
- 2018年终盘点:“年度爆款”的区块链真的结束了吗?
- CentOS 6.5上安装Confluence 5.4.4
- vue seo关键词设置_网站文章中如何设置关键词才更有利于SEO优化?
- dom块级元素的各种宽高
- 电机转速模糊pid控制
- python练习3 人脸对齐以及dir、inspect的用法
- 如何画五子棋棋盘c语言easyx,大佬们,用c++怎么画五子棋棋盘呢?
- 基于STM32MP1和QT的疫情监控平台
- CSDN写博客——去水印or自定义水印#解密CSDN上传图片生成链接的内容
- 华为 进入和退出Fastboot、eRecovery和Recovery升级模式
- Python编程PTA——三个数比较大小的新解法
- SAP 发布2022年第二季度财报