useBean>获取保存的Session中的User对象,根据该User对象中的信息显示欢迎信息
动态:
可以跟客户进行交互.
3.开发
1)工程中的位置与html文件存放位置相同
2)扩展名为.jsp
3)语法实现:
将java代码按照一定得规则嵌入html页面中
注:
扩展名决定其类型,即使没有嵌入任何java代码,在服务器进行处理时也将按照jsp的方式进行
4)部署后,在服务器中的位置与html文件存放的位置相同,且不存在任何转换操作.
5)浏览器访问路径
包含协议,服务器地址和端口,web应用和jsp文件
http:
//localhost:
8888/jsp_jd0902/hello.jsp
Servlet的后面的路径是假的路径
Jsp是真路径
6)服务器处理方式
A.Html
访问时直接访问web应用下的html文件,将内容发送给客户端
http:
//localhost:
8888/jsp_jd0902/hello.html
B.Jsp
http:
//localhost:
8888/jsp_jd0902/hello.jsp
E:
\java\tomcat\jakarta-tomcat-5.0.28\work\Catalina\localhost\jsp_jd0902\org\apache\jsp
step1:
服务器将jsp文件转换为Servlet(.java)
step2:
服务器编译转换后的Servlet(.java)
step3:
服务器加载编译后的class文件
step4:
服务器将class文件的响应结果发送给客户端,其实质为调用该Servlet的_jspService()方法,JSP的访问没有Get和Post的区别
注1:
转换和编译后文件存放位置在tomcat根目录\work,
java文件命名为:
JSP文件的文件名_jsp.java
final类不被继承的类
注2:
step1---step3只在jsp文件第一次被访问或jsp文件被修改时执行
一切以结果来说话
4.基本语法
1)指示标记<%@....%>
用于对页面内容进行说明,常用的有<%@page…%>,<%@include...%>
转换后的位置由具体指示决定
2)定义标记<%!
...%>
用于定义Servlet中的属性或方法
转换后位置在Servlet的类中
3)表达式标记<%=…%>
用于将表达式的内容显示在网页中
转换后位置在Servlet的_jspService()的out.print(…);的参数
4)脚本标记<%...%>
用于写入普通java代码
转换后位置在Servlet的_jspService()中
5.指示标记
1)<%@includefile=”相对路径”%>将file参数指定的文件内容包含到当前文件的指定位置
2)<%@page属性名=属性值...%>用于对当前JSP文件的页面特性和访问特性进行指定
主要属性如下:
A.language=”嵌入代码的语言”,默认为java,目前只支持java
B.extends=”转换后的Servlet继承的父类”,默认转换后的父类是org.apache.jasper.runtime.HttpJspBase,不建议重新制定
C.(常用)inport=”导入的包,….”,制定Servlet需要导入的包,导入很多的话中间用逗号隔开
D.session=”是否支持会话”,默认值是true
E.buffer=”缓冲区设置”,默认为8kb,可指定数字表示缓冲区大小,如16表示16k,也可指定none表示没有缓冲区(不建议,会大幅降低效率).该缓冲区用于向客户端响应时保存响应信息
F.autoFlush=”当缓冲区满时是否自动将内容写到客户端”,默认为true,通常不修改该属性值
G.isThreadSafe=”当前JSP文件是否线程安全”,默认为true,表示允许多线程并发访问,效率高.如果代码无法做到线程安全,则应将该属性设置为FALSE,则webserver将以SingleThreadModel方式操作该Servlet,效率影响很大
H.info=”描述信息”,用于指定jsp的信息,可使用getServletInfo()方法获得(没用)
I.(常用)isErrorPage=”当前jsp页面是否为错误处理页面”,默认为FALSE,如果指定为true,在转换为Servlet代码时有附加的内容,用于错误处理
J.(常用)errorPage=”当前页面对应的错误处理页面”,没有默认值,被指定为错误处理页面的jsp文件的isErrorPage属性值必须为true,否则将出错
K.(常用)contentType=”响应的内容类型和编码方式”,默认值为”text/html;charset=环境默认值”
L.(常用)pageEncoding=”jsp文件页面(内容)的编码方式”,默认值决定于系统的开发工具,中文编码方式为”GBK”
gb2312是gbk的子集
M.(常用)isELIgnored=”是否忽略EL语言”,默认值决定于web.xml的版本
注:
EL为1种表达式语言
6.JSP的访问模型
与Servlet相同,采用单实例多线程模型,即无论有多小个客户端访问,只创建1个Servlet实例,每个客户端以线程方式调用_jspService()
7.Servlet的SingleThreadModel模型
Servlet可以实现SingleThreadModel接口使其变为单实例单线程的操作模式,可以保证线程安全性,但执行效率将会明显下降…peprecated不赞成使用的
8.Jsp解决线程安全
目的:
isThreadModel的值必须为true
方法:
不使用实例变量,如果必须使用,在合理的位置对最少的代码使用synchronized进行并发访问控制,使对效率的影响降到最低
9.常用Jsp标记
1)include>
用于执行文件包含,在包含时可以选择是否需要传入参数
该操作相当于Servlet中的RequestDispatcher的include()
注:
<%@includefile=”...”%>无法传入参数
语法—不传参
includepage=”被包含的文件”/>
语法—传参,每个参数对应1个param>标记
includepage=”被包含的文件”>
param…/>
…
include>
如果被包含的是jsp文件,则被包含文件的<%@page%>操作应独立指定,与包含文件无关;对于html结构,包含文件和被包含文件是整体结构,被包含文件允许为html代码片段
Jsp是命名空间的前缀
Include标记
Page标记值
2)forward>
用于执行资源跳转,在跳转时可以选择是否需要传入参数
该操作相当于Servlet中的RequestDispatcher的forward()
语法---不传参
forwardpage=”跳转的目标文件”/>
语法---传参,每个参数对应1个param>标记
forwardpage=”跳转的目标文件”>
param…/>
…
forward>
3)param>
用于在include>和Forward>操作时传递参数
语法:
paramname=”参数名”value=”参数值”/>
获取参数的方式为request.getParameter(“参数名”)
4)useBean>
用于创建JavaBean对象
语法:
useBeanid=”引用名称”scope=”对象范围”class=”对象类型”type=”引用类型”/>
Class和type必须指定全名,与jsp文件是否执行import无关
对象范围默认值为page,可用值为page,request,session和application,其中application相当于ServletContext
引用类型如果不指定,默认与对象类型一致
Useru=newUser();
Mapm=newHashMap();
5)setProperty>
用于为对象赋值,相当于调用set方法
语法(形式1):
setPropertyname=”对象引用”property=”property名称”param=”参数名称”/>
操作:
对象引用.setProperty名称(request.getParameter(参数名称));
语法(形式2):
setPropertyname=”对象引用”property=”property名称”value=”需要赋的值”/>
操作:
对象引用.setProperty名称(需要赋的值);
注:
需要赋的值可以使用表达式标记
语法(形式3):
智能匹配
setPropertyname=”对象引用”property=”*”/>
操作:
对象引用的所有property都可以执行set方法,前提是存在同名的parameter,就是提交的参数的名称和property的名称一样
6)getProperty>
用于取出对象的property值并输出到浏览器
语法:
getPropertyname=”对象引用”property=”property名称”/>
操作:
对象引用.getProperty名称(),将返回结果输出到浏览器
10.Jsp文件中的注释
1)Html注释
语法:
—注释内容-->
注:
在注释内容中可以使用jsp的表达式
作用范围:
存在于jsp源文件,转换后的Servlet源文件,编译后的Class文件并被发送到客户端
用途:
需要给客户端阅读的注释内容
2)Jsp注释
语法:
<%--注释内容--%>
作用范围:
只存在于jsp源文件
用途:
对jsp文件本身的说明
3)Java注释
语法:
在定义标记和脚本标记中使用
<%!
/*注释内容*/%>,<%//注释内容%>等
作用范围:
存在于jsp源文件,转换后的Servlet源文件
用途:
对嵌入的java代码的说明
11.Javabean
1)定义:
规范化得java类,有一定的实现规则
2)标准化规则
A.实现序列化接口(需要被序列化/反序列化时必须实现)
B.所有属性为private权限
C.规范化属性命名(第一个单词小写,从第二个单词起首字母大些)
D.根据逻辑要求提供public权限的get和set方法,方法命名规范化,如name实行对应的方法为getName()和setName()
E.存在无参构造器
注意:
其中D和E在任何情况下必须实现
3)Property的概念:
通常与属性混淆,其本质与属性有区别,但如果使用标准化命名方式,在使用时是相同的
命名规则为:
get和set方法去除get/set的部分,并将首字母变为小写
/*该类存在一个property,名为id可读可写,age只能读取*/
publicclassUser{
privateintid;
privateintage;
publicUser(){}
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
PublicintgetAge(){
Returnage;
}
}
4)存放位置:
与Servlet相同,在工程的src目录中
5)在jsp中的使用
方式1:
在脚本标记中使用java代码的方式创建对象,调用get和set方法进行操作等,在使用时应保证已进行import
方式2(推荐):
使用jsp标记实现创建,get,set行为
useBean>,setProperty>,getProperty>
useBean>的操作逻辑:
根据scope决定是否需要创建对象,步骤如下:
A.判断指定范围中是否存在有效可用的对象
判断标准:
对象类型,对象引用,
范围.getAttribute(“对象引用名”)
如果返回对象存在且可用,则认为存在有效可用的对象
如:
useBeanid=”u”class=”com.briup.User”scope=”session”/>
则判断Session.getAttribute(“u”)返回的是否为User对象,是就直接使用,不是则创建对象并使用
B1.如果存在有效可用对象,直接使用该对象(不创建对象)
B2.如果不存在有效可用的对象,创建对象
12.Jsp的异常处理
1)对于jsp中产生的异常(包含jsp使用的javabean产生的异常),如果没有进行处理将会在客户端浏览器显示错误信息
2)浏览器中显示的错误信息对开发者有一定价值,可以参照进行代码调试,所以在开发阶段可以不进行异常处理;但正式运行后,应显示给客户端更友好的错误信息,应对可能产生的异常进行处理
3)处理方式(c和d是在正式运行后较常用的处理方式)
A.在jsp的定义标记和脚本标记中使用try…catch进行处理
B.在javabean的代码中使用try…catch进行处理
C.在jsp中定义错误处理页面进行处理
示例:
Index.jsp需要在产生异常时由error.jsp进行处理
Index.jsp
<%pageerrorPage=”Index.jsp”%>
Error.jsp
<%pageisErrorPage=”true”%>
操作:
当Index.jsp中产生任类型的异常时,跳转到error.jsp进行处理
定义isErrorPage=”true”的页面存在1个名为exception的对象,该对象保存产生异常的页面所产生的异常对象
在jsp页面中,可在表达式标记和脚本标记中使用该对象
在jsp页面中产生的异常,exception对象将保存真正的异常类型;在javabean中产生的异常,exception对象将保存jsp中的异常包装类org.apache.jasper.JasperException对象,该对象的实现原理与ServletException类似
跳转方式为服务器内部跳转,错误处理页面可以使用产生异常的页面的所有Request或更大范围的所有信息
如果是内部跳转的话地址栏的不变,外部跳转就变
D.在web.xml中配置错误处理页面进行处理
原理:
在web.xml的配置信息指定根据错误类型或异常类型分别跳转到不同的错误处理页面
错误类型:
浏览器的错误分类,常用的有404(页面没有找到)和500(服务器内部错误,所有运行时产生的异常都属于该类型)等
异常类型:
java异常类型
如java.lang.NumberFormatException
配置方式:
在下配置,每个对应1个错误处理页面
根据错误类型跳转包含以下子标记
浏览器错误号
错误处理页面(绝对路径)
注:
绝对路径以”/”开头,表示web应用的根
根据异常类型跳转包含以下子标记
异常类型全名
错误处理页面(绝对路径)
注意事项:
A.如果两种配置都存在且都符合,异常类型方式优先
B.Javabean中产生的异常被包装处理,所以无法匹配定义的真正的异常类型
C.与errorPage方式不重复使用
D.跳转方式为服务器内部跳转
E.对web应用中的所有jsp页面都有效,且本身具有根据错误类型和异常类型分别处理的功能,在应用中使用最广
13.Jsp内建对象
1)定义:
在jsp的脚本标记和表达式标记中,存在8+1个不需要定义即可直接使用的对象,称为jsp的内建对象
2)本质:
内建对象是_jspService()的局部变量,在方法中定义
3)列表
a.pageContext表示page范围,类型为PageContext
b.request(常用)表示Request范围,也表示客户端发起的请求,类型为HttpServletRequest
c.session(常用)表示Session范围,类型为HttpSession
d.application(常用)表示web应用范围,类型为ServletContext
e.response(常用)表示对客户端的响应,类型为HttpServletResponse
f.out(常用)用于向客户端输出内容,类型为JspWriter
g.config与Servlet(由jsp转换生成的Servlet)对应,保存Servlet的部分信息,类型为ServletConfig
h.page值为this,表示当前Servlet对象,类型为Object
i.exception(只有isErrorPage=”true”的jsp存在该变量)表示页面中产生的异常,类型为Throwable
14.环境
1)开发环境:
用于开发的文件框架结构,通常由开发工具决定,不同的开发工具的开发环境的文件结构不同,jsp,Servlet,Html等内容的实现都在开发环境下进行
2)运行环境:
在运行时的文件框架结构,由运行的服务器决定,不同的服务器的运行环境的文件结构不同,其文件结构与开发环境没有必然的联系
3)部署:
将开发环境中的内容按运行环境的要求放入运行环境中,通常使用开发环境工具中的部署工具进行
15.4个范围
1)Application表示web应用,文件结构上对应webapps下的1个文件件,该文件夹中的所有内容共同组成1个web应用,该对象在整个web应用的使用中只存在1个,在web应用启动时创建
2)Session表示会话,也就是1个客户端对1个web应用中资源的若干次访问.关系:
1个application对应多个Session
客户端的判断决定于浏览器
IE浏览器---使用普通方式打开,每个浏览器表示1个客户端;
使用1个浏览器中的连接打开另一个浏览器,两个浏览器表示相同的客户端
FireFox-------在1台机器上打开任意数量的浏览器都表示相同的客户端
注:
关于客户端的判断可随浏览器版本更新而改变
3)Request表示请求,也就是从客户端发起请求开始到获得服务器响应为止的一个过程,在该过程中操作的所有资源都属于1个请求
关系:
1个session对应多个Request
4)Page表示资源,也就是当前正在访问的jsp或Servlet
关系:
1个Request对应多个page
5)范围内信息的传递媒介-----Attribute
A.4种范围都存在1个可读可写的信息传递机制(Attribute)
B.操作方式
创建/修改信息
范围.setAttribute(“信息名”,信息内容);
获取信息
范围.getAttribute(“信息名”);
返回对应的信息内容,如不存在该信息名返回null
删除信息
范围.removeAttribute(“信息名”);
删除指定的信息名和其对应的信息内容
C.范围之间存在包含关系,范围的信息之间互相独立,没有任何关系
D.应用示例
在购物系统中的购物车应在什么时候执行初始化操作?
初始化后怎么操作才能使所有需要使用购物车的页面都能使用?
解决方法:
在Session创建时创建购物车,并将购物车对象存入Session范围的Attribute中,需要使用时可以调用getAttribute()获取购物车对象
代码实现:
创建对Session的Listener,监听Session的创建和销毁,创建时执行上述解决方案,销毁时执行创建时的反操作
16.Jsp标记
1)基本概念:
在jsp页面中,可以按照一定的语法要求,以xml的格式使用特定的功能,称为使用标记进行jsp操作
2)本质:
每个标记都是1个独立的java类,通过配置文件(.tld文件)定义使用规则,按照规则使用即可执行对应类的功能
3)分类:
A.预定义标记:
在web组建使用时可以直接使用的标记,其类的定义和配置操作在webserver中已完成
如:
useBean>,Forward>
B.自定义标记:
先实现java类并对配置文件进行配置,然后才能在jsp页面中使用
a.完全自定义:
复杂程度很高,通常开发人员不使用该方法定义标记
b.使用专业人员定义好的标记库,最常用的标记库为jstl
使用方法: