最近老是失眠,还好我灵鸡一动,学习了jsp(得劲)。
Jsp和Servlet的本质是一样的,Jsp最终被编译成Servle才能运行,或者说jsp只是生成Servlet的草稿文件。
Jsp特点就是在HTML中嵌入java代码,或者使用各种Jsp标签,包括自定义标签,动态的提供页面内容,现在发展为表现层技术。
(其他表现层的技术:FreeMarker,Velocity,Tapestry等,其中Jsp应用最为广泛)
Jsp的本质是Servlet。Jsp页面由两部分组成:
静态部分:标准的HTMl标签,静态的页面内容,与HTML页面相同
动态部分:受Java代码控制的内容,这些内容由java脚本动态生成
Jsp变异之后会变成Servletjava代码,比如原本一个叫zpoor.jsp,编译之后就变成了zpoor_jsp.java和zpoor_jsp.class文件,Tomcat的work下的localhost文件夹中编译之后的代码。
Jsp工作原理结论:
Jsp文件必须在jsp服务器内运行。
每个Jsp文件都必须生成Servlet才能执行
每个Jsp页面的第一个访问者速度很慢,因为必须等待Jsp编译成Servlet
Jsp页面的访问者无需安装任何客户端,不需要安装可以运行java的环境,因为Jsp页面输出的标准的HTMl页面
Jsp注释:(源代码看不到)
<%-- 注释内容 --%>
HTML注释:(源代码可以看到)
<!-- 注释内容 -->
Jsp声明:(声明变量和方法:当然他自然会装换成Servlet的成员变量和成员方法,Jsp声明依然符合java语法)
<%! 声明部分 %>
注意:jsp声明定义的方法和变量可以使用private 、public修饰符也可以使用static,将其变成类属性或者类方法,但是不能使用
abstract修饰部分的方法,因为抽象方法会导致Jsp对应Servlet变成抽象类,倒置无法实例化。
(Jsp中声明中独立存在的方法,知识一种假象)
Jsp输出表达式:
<%= 表达式 %>
输出表达式语法后面不能有分号
Jsp的3个编译指令:
page:该指令是针对当前页面的指令
include:用于指定包含另一个页面
taglib:用于定义和访问自定义标签(Jsp新特性)
语法:
<%@ 编译指令名 属性名="属性值"%>
page指令(一般位于Jsp页面的顶端,一个Jsp可以包含多个page指令):
language:声明脚本语言类型,一般是java,只能是java
extends:指定jsp页面编译之后所产生的java类所继承的父类或者接口
import:用来导入包
session:jsp页面是否需要HttpSession
buffer:指定jsp页面的缓冲区的大小,默认值为8kb
autoFlush:缓冲区溢出时,是否强制输出缓冲区的内容
info:设置该jsp程序的信息
errorPage:指定错误处理界面
isErrorPage:设置本jsp程序是否为错误处理程序
pageEncoding:设置生成网页的字符集编码
include指令:
把一个外部文件嵌入当前的jsp页面中,同时解析这个页面的Jsp语句,这是静态include语句,他会把目标页面的其他编译指令也包含进来如果两个页面的编译指令冲突,页面就会出错,但是动态的include则不会。
语法<%@ include file="文件路径/文件名"%>
Jsp的7个动作指令:
编译指令是通知Servlet引擎处理消息
动作指令知识运行时的动作
jsp:forward:执行页面转向,将请求的处理转发到下一个页面
jsp:param:传递参数,必须和其他支持参数的标签一起使用
jsp:include:动态的引入一个jsp页面
jsp:plugin:下载javaBean和Applet到客户端执行
jsp:useBean:创建一个useBean的实例
jsp:setProperty:设置javaBean实例的属性值
jsp:getProperty:输出javaBean实例的属性值
forward指令:
将页面的请求转发到一个新的页面,可以是静态的HTML页面,也可以是动态的jsp页面,或者转发到容器中的Servlet
语法:
对于jsp1.0:
<jsp:forward page="URL">
对于jsp1.1:(用于转发时增加额外的请求参数)
<jsp: forward page="URL">
<jsp:param.../>
</jsp:forward>
注意:
执行forward指令转发请求时,客户端的请求参数不会丢失。表面上他是将用户请求转发到另一个新的页面,实际上知识采用了新的界面来对用户生成相应,所以说,请求还是一次请求,作用请求参数和请求属性都不会改变。
include指令:
他是一种动态的include指令,用于包含某个页面,他不会导入被include页面的编译指令,只导入页面的body内容插入本页面。
语法(常用):
<jsp:include page="URL" flush="true|false">
<jsp:param.../>
</jsp:include>
其中flush属性:指定输出缓存是否转移到被导入的文件中,如果为true,则包含在被导入的文件中,如果为false,则包含在原文件中。
静态导入和动态导入的三个区别:
1、静态导入是将被导入页面的代码完全融合,两个页面融合成一个整体的Servlet;动态导入则在Servlet中使用include方法来引入被导入的页
面的内容。
2、静态导入时,被导入的页面的编译指令会产生作用;动态导入时被导入的编译指令则会失去作用,只是插入被导入页面的body内容
3、动态导入还可以增加额外的参数
forward动作指令和include动作指令的区别:
执行forward时,被forward的页面将完全代替原有页面,执行include时,被include的页面知识插入原有的页面
一句话:forward拿目标页面代替原有页面,include则拿目标页面插入原有的页面。
useBean、setProperty、getProperty指令:
三个指令都是与javaBean相关的指令
useBean语法:
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
id属性就是Javabean的实例名,class属性确定了JavaBean的实现类
scope属性指定javaBean市里的作用范围:
page:该javaBean实例只在该页面有效
request:在本次请求内有效
session:在本次session内有效
application:在本应用内一直有效
(下面的两个标签的底层实现还是基于getter和setter方法实现)
setProperty(语法):
<jsp:setProperty name="BeanName" property="propertyName" value="value"/>
name属性确定了javaBean的实例名;property属性确定需要设置的属性名;value属性则确定需要设置的属性值
getPeoperty(语法) :
<jsp:getProperty name="BeanName" property="propertyName"/>
name属性确定了需要输出的javaBean的实例名;property属性确定需要输出的属性名。
把JavaBean放在指定的scope中:
//放在page范围中
pageContext.setAttribute("p1", p1);
//放在request范围中
request.setAttribute("p1", p1);
//放在session范围中
session.setAttribute("p1", p1);
//放在application范围中
application.setAttribute("p1", p1);
plugin指令:
主要用于下载服务端的javaBean或者Applet到客户端执行,客户端必须装虚拟鸡(嘿嘿嘿)。
当然这玩意用的很少,现在HTML对Applet的支持很好,基本上用不到这个动作指令。
param指令:
用于设置参数值,本身不能单独使用,没有什么意义。
一般都结合下面的三个指令使用:
1、jsp:include
param指令把参数传入被导入的页面
2、jsp:forward
param指令把参数传向被转入的页面
3、jsp:plugin
param指令把参数传入页面中的javabean或者Applet