一、六大动作标签(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:每次循环遍历多个元素,默认值是1
items:遍历集合|数组 ,前提是需要从域对象获取数据(分割线--------)
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简单说)
省略。。。
未完待续。。。