工作原理:
1.翻译阶段:当容器接受到客户端的请求后,先判断被请求的jsp是否存在,若不存在返回404错误,如存在,将该jsp先翻译成一个servlet
2.编译阶段:将servlet的源文件编译成一个字节码文件,然后有容器将其装载进虚拟机并构造出一个实例对象(单例)。
3.执行阶段:按照servlet生命周期(init(),service(),destory())的过程来运行servlet。
补充:如果被请求的jsp已经有对应的servlet实例对象,那么直接运行该servlet。如果jsp的源文件发生变化,那么要重新将jsp翻译成servlet,再编译,装载和实例化,最后运行。
-----------------------------------------------------------------------------------------------------------------------------
MVC
1.M(Model)--------------->JavaBeans
2.V(view)----------------->jsp
3.C(Controllor)---------->servlet
-----------------------------------------------------------------------------------------------------------------------------
JSP中的元素
1.脚本元素
a.声明(declaration)
语法:<%!declaration%>
作用:为servlet声明一些成员变量,成员方法和内部类
注意:声明的内容处于jspService()方法之外。另外,在声明中不能使用表达式和隐含对象。
b.表达式(expression)
语法:<%=expression%>
作用:将expression写入到输出流中,expression的内容最终显示在页面上。
expression可以是变量、(算术、逻辑、关系表达式)、带返回值的方法、9种隐含对象。
表达式中的输出值都一律被转换成字符串后再写到输出流out(JspWriter)中
注意:expression中不能出现(;)
c.脚本(scriptlet)
语法:<%java code%>
作用:在jsp中嵌入java代码
注意:脚本(java代码)被翻译进servlet的jspservice()方法中。
2.指令元素
a.page指令
语法:<%@ page attribute="attributeValue"....%>
作用:利用page指令中的这些属性可以和容器进行通信,这些属性的设置对整个jsp都有影响。
b.include指令
语法:<%@ include file="url"%>
称为静态导入。比如:页面的logo和版权信息。
作用:在当前jsp中导入另一页面的内容(这些内容一般不变化)。
特点:在jsp翻译成servlet时就将被导入的页面内容嵌入到jspService()中,发生在编译阶段。
优点:执行效率高。
缺点:若被导入的页面的内容一旦发生变化,那么jsp必须要重新被翻译。
c.taglib指令
语法:<%@ taglib url="/web-inf/a.tlb" predix="**"%>
作用:用于在jsp中制定要使用的标签库描述文件的(*.tld)路径.
3.动作元素
a.动态导入
语法:<jsp:include page="url" flush="true/false"/>或者
<jsp:include page="url" flush="true/false">
[<jsp:param.../>]*
.......
</jsp:include>
作用:在一个页面导入另外一个页面的内容
特点:动态导入发生在执行阶段,也就是在运行servlet的时候才动态生成被导入页面的内容,然后嵌入到调用页面,最后两个页面的内容一起返回给客户端
注意:在翻译阶段并没有导入
缺点:执行效率没有静态导入高。
优点:如果被导入的页面内容发生变化,不必重新编译。
b.forward
语法:<jsp:forward page="url"/>
--------------------------------------------------------------------------------------------------------------------------------
jsp注释
1.html/xml注释
语法:<!----content------>
特点:被注释的内容会出现在翻译后的servlet中,也会出现在客户端的页面的源文件中,但是不会显示在浏览器中。
注意:只能注释html,xml,不能注释java代码。
2.隐藏注释
语法:<%----content----%>
特点:被注释的内容不会出现在翻译后的servlet中,在客户端也不会出现。
注意:可以注释jsp中所有的内容。
3.脚本注释
语法:<%
//java code
/**java code*/
%>
特点:被注释的内容出现在翻译后的servlet中,但是不会出现在客户端。
------------------------------------------------------------------------------------------------------------------------------
JSP内置对象
名称 类型 注释和范围
request javax.servlet.http.httpRequest request
response javax.servlet.http.httpResponse response
pageContext javax.servlet.jsp.PageContext page
session javax.servlet.http.httpSession session
application javax.servlet.ServletContext ServletContext
out javax.servlet.jsp.JspWriter output stream
config javax.servlet.ServletConfig ServletConfig
page javax.lang.Object page
exception javax.lang.Throwable page
----------------------------------------------------------------------------------------------------------------------------
jsp异常处理
1.jsp中处理异常的方式
a)在有异常出现的jsp中,设置page指令中的属性errorPage="处理异常的目标页面",这样当有异常出现的时候,直接跳转到errorPage指定的目标页面来处理异常。
b)在处理异常的目标页面中,设置page指令中的属性isErrorPage="true",告诉容器自己就是来处理异常的,这样就可以使用隐含对象exception来处理异常。
2.通过容器来处理异常(配置web.xml)
<error-page>
<exception-type>
异常类型
</exception-type>
<location>
处理异常的目标页面
</location>
</error-page>
当系统出现了某种异常,容器会判断这种异常的处理方式是否在web.xml中进行配置,若有就按照指定的处理方式处理;若没有就将异常处理交给虚拟机,虚拟机再抛给用户。
3.对错误代码(如404)的处理,通过容器在web.xml中配置。
<error-page>
<error-code>
404
</error-code>
<location>
404.jsp
</location>
</error-page>