# jsp是什么?

sun公司制定的一种服务器端的动态页面技术规范。

注:
	因为虽然使用servlet也可以生成动态页面,但是过于繁琐(需要使用out.println语句
	来输出),并且不利于页面的维护(修改页面,就需要修改java代码),所以sun才
	推出了jsp规范。
	jsp是一个以.jsp为后缀的文件(主要内容是html和少量的java代码),容器会将这个
	文件转换成一个对应的servlet,然后执行。也就是说,jsp的本质就是一个servlet。

# 如何写一个jsp文件?

# step1.添加一个以.jsp为后缀的文件。

# step2.在该文件里面,可以添加如下内容:

# 1)html(css,js)

直接写即可。

# 2)Java代码

第一种 :java代码片段 <% java代码 %> 在这里插入图片描述 第二种:jsp表达式 <%= java表达式 %> 在这里插入图片描述

# 3)隐含对象?

什么是隐含对象?

在jsp文件里面,可以直接使用的对象,比如out、request、response。

为什么可以直接使用这些隐含对象?

因为容器会自动添加获得这些对象的代码。

# 4)指令

什么是指令?

可以通过指令告诉容器,在将jsp转换成servlet时,做一些额外的处理,比如导包。

指令的语法(指令名一共有三种)

<%@  指令名  属性=值 属性=值%>
注:
	如果有多个属性,使用空格隔开。

page指令

import属性 指定要导的包名,如果有多个包,用“,”号隔开。
比如:
	<%@ page import="java.util.*,java.text.*'' %>
contentTYpe属性:设置response.setContentType的内容。
pageEncoding属性:告诉容器,在读取jsp文件的内容时,使用指定的字符集来解码。

在这里插入图片描述

# jsp是如何执行的?

# 阶段一 容器将jsp转换成一个servlet。

	1)html(css,js) ---->service方法里面,使用out.write输出。
	2)<%     %>   ----->在service方法里面,照搬。
	3)<%=   %>   ----->在service方法里面,使用out.print输出。

# 阶段二 容器调用servlet。

# jsp标签和el表达式

# jsp标签是什么

jsp标签是sun公司推出的一个规范,目的是为了替换jsp中的java代码。

jsp标签语法类似于html标签(比如说,有开始标记、结束标记、有一些属性、
有标签体)。容器遇到jsp标签之后,会调用jsp标签对应的jsp标签中的
java代码。 
使用jsp标签,好处是,jsp文件便于美工去修改,另外,也便于代码的复用
(jsp标签可以重复使用).

# el表达式是什么?

一套简单的运算规则,用于给jsp标签的属性赋值,也可以脱离jsp标签,直接使用。

# el表达式的使用

1)读取bean的属性值

注(了解):
	javabean是一个规范,满足如下几个条件,就可以称之为一个javabean.
		public 类
		public 构造器
		实现Serializable接口
		实现一些属性及对应的get/set方法

a.方式一

${user.username}
	a1.执行过程:容器依次从pageContext-->request-->session
	-->application中查找绑定名为"user"的对象(getAttribute),
	找到之后,调用对象的“getUsername“的方法,然后输出。
	a2.优点:
		会将null转换成空""输出。
		如果依据绑定名找不到对应的对象,不会报空指针异常。
	a3.指定查找范围:
		可以使用pageScope、requestScope、sessionScope、
		applicationScope来指定查找范围。

b.方式二

${user['username']}
	a1.执行过程同上。
	a2.[]里面可以出现绑定名(不懂就去看代码在day11.e1.jsp)
	a3.[]里面可以出现从0开始的下标,用来访问数组中的某个元素。

2)进行一些简单的运算。(e2.jsp)

a.算术运算:
	+,-,*,/,%
	注意,"+"只能求和。
b.关系运算:
	>,>=,<,<=,==,!=
c.逻辑运算:
	&&,||,!
d.empty运算:
	empty
		集合是否为空:${empty list1 }
		是否是一个空字符串:${empty s2 }
		null值:${empty null }  //true

3)读取请求参数值(e3.jsp)

${param.username}等价于request.getParameter("username");
${paramValues.city}等价于request.getParameterValues("city");

# jstl标签的使用

1)jstl是什么?(jsp standard tag lib)

注:
	apache开发的一套jsp标签,后来捐献给sun,sun将其命名为jstl。

2)jstl如何使用?

step1.导包。
	jstl.jar
	
step2.使用taglib指令导入要使用的jsp标签。
<%@ taglib uri="" prefix=""%>
	uri是要导入的jsp标签的命名空间。
	注:
		命名空间是为了区分同名的元素而在元素前添加的一段说明,
		通常是一个域名(为了避免命名空间也冲突)。
	prefix是命名空间的别名。

3)if 标签

a.用法
<c:if test="">
</c:if>
b.当test属性值为true时,容器执行标签体的内容。
c.test属性值可以使用el表达式进行计算。

4)choose标签 (choose.jsp)

a. 用法
<c:choose>
	<c:when test="">
	</c:when>
	<c:otherwise>
	</c:otherwise>
</c:choose>
b. when可以出现一次或者多次,表示一个分支(相当于一个if语句),
当test属性值为true时,执行标签体的内容。test属性值可以使用el表达式
来进行计算。
c. otherwise可以出现0次或者1次,表示例外(相当于最后那个else语句)

5)forEach标签 (forEach.jsp)

a.用法
<c:forEach items="" var="" varStatus="">
</c:forEach>
b. items属性用来指定要遍历的集合或者数组,可以使用el表达式来赋值。
c. var属性用来指定绑订名。
	注:
		绑订范围固定是pageContext,该标签每次从集合或者数组中取一
		个元素,然后将其绑定到pageContext上。
d.vatStatus属性用来指定绑定名。
	注:
		绑定范围固定是pageContext,绑定值是一个特俗的对象,
		该对象由标签创建,用来获得当前遍历的状态。
		该对象提供了一下方法,用来获得当前遍历的状态:
		getIndex():获得当前正在被遍历的元素的下标(从0开始)。
		getCount():获得当前正在被遍历的元素的序号(从1开始)。

# 自定义标签(mytag.tld)

step1.写一个java类,继承SimpleTagSupport类。

注:
	复杂标签技术(old)
	简单标签技术(new),继承SimpleTagSupport类开发的
	标签属于简单标签技术。

step2. override doTag方法,在该方法里面,编写处理逻辑。

标签类:
	1.继承SimpleTagSupport类
	2.override doTag方法(实现处理逻辑)。
	3.标签有哪些属性,标签类也得有对应的属性,属性名
	要相同,类型要匹配,并且有对应的set方法。

step3.在.tld文件里面描述该标签。

# 标签的执行过程

step1.容器依据标签的命名空间找到标签的描述文件(.tld文件),然后
依据标签名找到标签类,接下来将标签类实例化。

step2.容器将标签的属性值赋值给标签对象(通过调用标签对应的
set方法,如果标签的属性值需要计算,容器会事先计算)。

step3.容器调用标签的doTag方法。

# 在java类中如何获得jsp隐含对象

通过继承自SimpleTagSupport类的方法来获得pageContext. 该对象提供了获得其它所有隐含对象的方法。

PageContext pctx = (PageContext)getJspContext();
JspWriter out = pctx.getOut();

# 如何在.tld中描述标签

	<?xml version="1.0" encoding="UTF-8" ?>
	
	<taglib xmlns="http://java.sun.com/xml/ns/javaee"
	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
	    version="2.1">
	   
	  <tlib-version>1.1</tlib-version>
	  <short-name>d</short-name>
	  <uri>http://tedu.cn/mytag</uri>  
	    
	  <tag>
	    <name>hello</name>
	    <tag-class>tag.HelloTag</tag-class>
	    <!-- 
	    	body-content用来设置该标签是否有标签体,如果有,
	    	标签体的内容容许出现哪些内容。
	    	
	    	empty:该标签没有标签体。
	    	scriptless:该标签有标签体,但是标签体的内容不能够出现
	    			 	Java代码(<% %>,<%= %>,<%! %>)。
	    	JSP:该标签有标签体,并且标签体的内容可以是java代码。
	    		但是,只有负责标签技术才支持该值。
	     -->
	    <body-content>empty</body-content>
	    <attribute>
	        <name>msg</name>
	        <!-- 
	        	如果值为true,表示该属性是必须的,
	         -->
	        <required>true</required>
	        <!-- 
	        	自定义标签属性(Run-time Expression Value)
	        	如果值为true,表示该属性值可以动态赋值
	        	(可以使用el表达式赋值)
	         -->
	        <rtexprvalue>false</rtexprvalue>
	    </attribute>
	    <attribute>
	    	<name>qty</name>
	    	<required>true</required>
	    	<rtexprvalue>true</rtexprvalue>
	    </attribute>
	  </tag>
	</taglib>
Last Updated: 11/14/2024, 2:46:20 PM