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:每次循环遍历多个元素,默认值是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简单说)

省略。。。

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值