Servlet学习总结(2)-jsp

1.如何写一个jsp文件?

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

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

(1)html(css,js)

直接写即可。

(2)java代码

第一种: java代码片断

<%  java代码    %>

第二种: jsp表达式

<%= java表达式 %>

第三种. jsp声明 (a1.jsp)

<%! 声明一个变量或者方法  %>

(3)隐含对象

a.什么是隐含对象?

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

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

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

c.有哪些隐含对象?
out,
request,
response,
session,
application

pageContext:页面上下文 (a2.jsp,a3.jsp)

	  	 容器会为每一个jsp实例创建唯一的一个符合PageContext
		接口要求的对象,该对象会一直存在,除非jsp实例被容器
		删除。
		该对象的作用主要有两个:
			作用1:绑订数据。
				绑订到pageContext上的数据,只有对应的
				jsp实例能够访问到。
			作用2:提供了一些方法,用来获得其它所有的隐含对象。

config: ServletConfig (a4.jsp)

			可以为jsp配置初始化参数,然后通过config去读取。
			 <servlet>
			  	<servlet-name>a4</servlet-name>
			  	<jsp-file>/a4.jsp</jsp-file>
			  	<init-param>
			  		<param-name>company</param-name>
			  		<param-value>IBM</param-value>
			  	</init-param>
			  </servlet>
			 <servlet-mapping>
			  	<servlet-name>a4</servlet-name>
			  	<url-pattern>/abc.html</url-pattern>
			 </servlet-mapping>	

exception: (a5.jsp,a6.jsp)

			 当page指令的isErrorPage属性值设置为true时,
			 可以使用该隐含对象,该隐含对象可以用来获得
			  jsp运行时产生的一些异常的简短的描述。

page(了解): jsp实例本身(jsp对应的servlet实例)。

(4)指令

什么是指令?

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

指令语法

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

page指令

		import属性:指定要导的包名,如果有多个包,用","号隔开。
		pageEncoding属性:指定jsp文件的编码。
		contentType属性:response.setContenType方法的内容。
		errorPage属性:指定一个异常处理页面。当jsp运行发生异常,容器会调用该异常处理页面。
		isErrorPage属性:缺省值是false,如果值为true,就可以使用exception隐含对象。
		session属性 (a7.jsp):缺省值是true,如果值为false,则不能够使用session隐含对象。
         比如:  <%@ page import="java.util.*,java.text.*"%>

include指令

<%@ include file="" %>
注:
	file属性用于指定被包含的文件名。
	该指令用来告诉容器,在将jsp转换成servlet时,将file
	属性指定的文件的内容插入到该指令所在的位置。
	被包含的文件可以是任何文件,包括html,如果是jsp,
	该jsp并不会执行!

taglib指令

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

2、注释

a. <!-- 注释内容 --> 
			如果注释的内容是java代码,java代码
			会执行。

b. <%-- 注释内容 --%>
			如果注释的内容是java代码,java代码
			不会执行。。

3. jsp是如何执行的?

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

html(css,js) ---> 在service方法里面,使用out.write输出。
<%    %> -----> 照搬到service方法里面。
<%=   %> -----> 在service方法里面,使用out.print输出。
<%!   %> -----> 为servlet增加新的属性或者新的方法。

阶段二 容器调用该servlet。

4.jsp标签和el表达式

(1)jsp标签是什么?

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

jsp标签语法类似于html标签(比如说,有开始标记、结束标记、有一
一些属性、有标签体)。

容器遇到jsp标签之后,会调用jsp标签对应的
jsp标签类中的java代码。

使用jsp标签,好处是,jsp文件便于美工去修改,另外,也便于
代码的复用(jsp标签可以重用)。

(2)el表达式是什么?

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

(3)el表达式的使用

1)读取bean的属性值

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

a.方式一 (e1.jsp)

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

b.方式二 (e1.jsp)

${user['username']} 
		a1. 执行过程同上。
		a2. []里面可以出现绑订名。
		a3. []里面可以出现从0开始的下标,用来访问
			数组中的某个元素。

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

a.算术运算:
		+,-,*,/,%
		注意,"+"只能求和。

b.关系运算:
		>,>=,<,<=,==,!=

c.逻辑运算:
		&&,||,!

d.empty运算:
		empty

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

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

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

(4)jstl标签的使用

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

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

2)jstl如何使用?

step1.导包。
	<dependency>
		<groupId>jstl</groupId>
		<artifactId>jstl</artifactId>
		<version>1.2</version>
	</dependency>

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

3)if标签

a.用法   
<c:if test="" var="" scope="">
	标签体
</c:if>
b.当test属性值为true时,容器执行标签体的内容。
c.test属性值可以使用el表达式进行计算。
d.var属性指定绑订名。
e.scope属性指定绑订范围。

if标签演示图
4)choose标签 (choose.jsp)

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

5)forEach标签 (forEach.jsp)

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

5.自定义标签

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

注:
	继承SimpleTagSupport类开发的标签属于
	简单标签技术。

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

/**
 * 	标签类的要求:
 * 		a.继承SimpleTagSupport类。
 *		b.override doTag方法(实现处理逻辑)。
 *		c.标签有哪些属性,标签类也得有对应的属性,
 *		属性名要相同,类型要匹配,并且有对应的set方法。
 *	
 *	标签的执行过程:
 *		step1.容器依据标签的命名空间找到标签的描述文件(.tld文件),
 *	然后依据标签名找到标签类,接下来将标签类实例化。
 *      step2.容器将标签的属性值赋给标签对象(通过调用标签
 *    对象的set方法,如果标签的属性值需要计算,容器会事先计算)。
 *      step3.容器调用标签对象的doTag方法。
 *  
 */
public class HelloTag extends SimpleTagSupport{
	
	private String msg;
	private int qty;
	
	public HelloTag(){
		System.out.println("HelloTag's constructor...");
	}
	
	public void setMsg(String msg) {
		System.out.println("HelloTag's setMsg...");
		this.msg = msg;
	}

	public void setQty(int qty) {
		System.out.println("HelloTag's setQty...");
		this.qty = qty;
	}

	@Override
	public void doTag() throws JspException, IOException {
		System.out.println("HelloTag's dotag...");
		/*
		 * 通过继承自SimpleTagSupport类的方法来
		 * 获得pageContext。该对象提供了获得其它所有
		 * 隐含对象的方法。
		 */
		PageContext pctx = 
				(PageContext)getJspContext();
		JspWriter out = pctx.getOut();
		
		for(int i = 0; i < qty; i ++){
			out.println(msg + "<br/>");
		}
	}
}

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

<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>
        <!-- 
        	如果值为true,表示该属性值可以动态赋值
        	(可以使用el表达式赋值)
         -->
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
    	<name>qty</name>
    	<required>true</required>
    	<rtexprvalue>true</rtexprvalue>
    </attribute>
 </tag>	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值