JSP --java server page(服务器脚本语言)
servlet的缺陷
servlet编码,部署和调试任务繁琐。
生成动态网页频繁,不利于项目分工。
jsp页面要被WEB容器翻译成java类,按照servlet规范,所有jsp翻译生成的类,必须实现HttpJspPage
接口。二HttpJspPage是Servlet的子接口。也意味着所有的jsp翻译生产类也会实现Servlet。所以,
从这个意义说,Jsp本质是Servlet。jsp重在于页面显示,而servlet重在于逻辑处理。
JSP引擎:
jsp引擎是WEB容器编写的类,负责将jsp页面翻译成java类。在web容器/conf/web.xml中进行注册。
JSP生命周期:
由JSP引擎将JSP页面翻译成JAVA代码
将JAVA代码编译成class字节码文件
加载到容器
由容器实例化成对象
初始化阶段相关的方法是jspLinit()
请求到达,调用服务阶段相关的方法是_jspService()
销毁阶段相关的方法是jspDestroy()
JSP网页主要由元素(Elemet)和模板数据(TemplateData)两部分组成:
模板数据是JSP的静态部分
web容器不处理
元素则是必须经由web容器解释
元素都是以xml作为语法基础
WEB容器支持两种不同格式的JSP语法
普通格式和XML兼容格式
普通JSP语法是设计给开发者使用的
XML兼容语法是给设计用来容易被开发工具使用的
jsp的脚本元素:
声明:<%!int y=8;%>定义jsp类的成员变量,静态变量和方法
脚本:<% %>丰富_jspService(),在脚本中定义的变量,全部是_jspService()的局部变量。
表达式:<%= %>丰富_jspService(),相当于out.print()向页面输出内容。注意,后面不能加分号。
jsp注释:
<%--jsp--%>容器不翻译,只在源代码中不可见,最为安全。
html注释:
<!--jsp-->html注释会通过out.print输出到客户端,客户端和服务器均可见,最不安全。
java注释:
// /* */ 给java代码书写注释,只在服务器端显示,只用于java代码
jsp隐式对象:jsp引擎翻译的jsp类中,在jspService()中会定义九个变量,并将这些变量做初始化。由于脚本和表达式是在丰富_jspService()方法。
所以可以直接使用这些变量。这些变量称为jsp隐式对象。
jsp隐式对象九个:
四个作用域:
pageContext:只在当前jsp页面有效
request:作用于请求
session:作用于会话
application:作用于全局
两个输出:
response:响应对象
out:打印输出流
page:当前对象
config:配置对象
exception:异常对象
import=""导包,导入多个类,中加以逗号分隔
info="aa"是一个方法,返回aa
page指令:
contentType:设置MIME类型和编码集
pageEncoding:设置编码集,MIME类型默认text/html;
import:导入该jsp类中所用到的类。如果需要导入多个类,中间以逗号分开。
session:访问该jsp页面时是否创建会话对象,默认为true。
errorPage:表示当前jsp页面如果抛出了运行异常,则跳转指定出错页面。
isErrorPage:表示该jsp页面为出错处理页面。定义了exception隐式对象,接受异常对象。
jsp指令包含和动作包含的区别。
答:
指令包含是将本身jsp和包含的jsp放在一起编译,形成一个class文件。所有两个页面不能存放同名变量,指令包含也只能包含文件。
动作包含是本身jsp包含的是另一个jsp执行的结果。形成两个jsp文件,所以两个页面可以存在同名变量。
动作包含可以包含文件,也可以包含servlet输出结果。同时,可以传递参数。
<jsp:include page="URL" flush="true">
<jsp:param value="aaa" name="bbb">
</jsp:include>
<jsp:forward page="relativeURL"/>内部转发至某个页面,相当于内部转发。
过滤器:
一个中间组件,用来拦截源数据和目的数据之间的消息。
过滤二者之间传递的数据
--------------------------------------------------------------------------------------
EL表达式
<%request.setAttribute("aaa", "fff");
session.setAttribute("aaa", "bbb");
%>
${aaa}<br>
<welcome-file-list>
表示欢迎页面集合。表示如果在访问web应用程序时,不输入任何路径,默认所访问的页面列表。
作用范围:先从小作业域中查找,如果小作业域中有该键对应的值,则取出,并忽略其他作业域。如果小作用域中没有改键,那么再去大作用域中查找。
所以,可以通过作用域指定需要查找绑定对象 ${sessionScope.aaa }表示在session会话范围中查找对象,如果没有找到。也不会去其他作用域查找。
同样,支持运算${3+5} ${4>3}
通过EL表达式,从作用域对象中取出属性时,是调用get方法完成的。所以就是该实体类没有属性,但是提供了get方法,同样可以通过EL表达式取出属性值。
另外,实体类的属性必须规范,一般来说,属性名前两个字母都不能是大写字母。
------------------------------------------------------------------------------------
在<filter-mapping>标签中的<url-pattern>子标签,可以加入<url-pattern>标签,表示针对请求路径进行过滤。也可以加入<servlet-name>标签,表示针对某个指定名称的servlet过滤。
过滤器类型:
request:表示直接请求,按请求路径进行过滤。默认方式。
forward:表示通过内部转发到目标资源之前,进行过滤。
include:表示包含指定资源时,进行过滤。
error:表示发生异常时,进行过滤。
过滤器链:
当一个请求到达目标资源时,可能会经过多个过滤器。这就形成了过滤器链。过滤器链执行的顺序是:先经过<url-pattren>标签,在经过<servlet-name>标签。如果一个请求经过多个
<url-pattren>标签,按部署顺序执行。