6.1比较HTML,Servlet,JSP
Tomcat把由JSP产生的Servlet源文件和类文件放于根目录的work目录下。在开发过程中如果更新了JSP文件,Tomcat会重新编译新生成的文件,编译生成的文件会覆盖掉原本work目录下的文件。
6.2JSP语法
在JSP大致包含以下内容:1:JSP指令 2:JSP声明3:Java程序片段4:Java表达式
JSP指令:
常用的三种指令为page,include,taglib
page指令的语法形式:
<% @ page 属性1=“值1” 属性2=“值2”%>
page指令的属性:language,method,import,content_type,session="true|false",errorPage="error_url",isErrorPage="false|true"
include指令的语法形式为:
<%@ include file="目标组件的绝对URL或者相对URL"%>
JSP声明:
<%! int var=0; %>;<%! public String amethod(int i){ .....}%>
Java程序片段:
<% ...%>标记之间之间嵌入任何有效的java程序代码(若有变量则为局部变量),这种嵌入的程序片段称为Scriptlet。这些程序段对应Servlet的Service()方法中的代码块。
Java表达式:
Java表达式的标记为<%=....%>。如:<%=hitcount++%>
隐含对象:
6.3JSP的生命周期
JSP的声明周期包含以下阶段:解析阶段,翻译阶段,编译阶段,初始化阶段,运行阶段,销毁阶段,JSP被客户端首次请求,JSP文件被更新,与JSP对应的Servlet类的类文件被手工删除。
JspPage接口继承自javax.servlet.Servlet接口,JspPage接口中定义了JspInit()和JspDestroy()方法,它们的作用与Servlet的init()和Destroy()相同。
注意:<%!
public void jspInit(){ tempDir=(File)application.getAttribute() }
%>Sertvlet容器在编译该段时会产生编译错误,因为application是在JSP的Service()服务方法中定义的局部变量,在其他任何方法中都无法访问到它,因此可以通过getServletConfig().getServletContext()方法获得ServletContext对象:
ServletContext application=getServletConfig().getServletContext();
public void jspInit(){ tempDir=(File)application.getAttribute() }
6.4请求转发
JSP采用<jsp:forward>标签来实现请求转发,<jsp:forward>的语法为:
<jsp:forward page="转发的目标组件的绝对uri或者url">
例如: <jsp:forward page="target.jsp"/>
以“<%”开头的称为JSP标记(脚本元素),“<jsp”称为JSP标签(动作元素)
6.5包含
include指令用于静态包含,include标记用于动态包含
静态包含:<%@ include file="被包含的组件的URL的绝对URL或者相对URL"%>
动态包含:<jsp:include page="content.jsp"/>
注意:静态包含的目标组件可以为HTML文件或者JSP文件,但不允许是Servlet文件,因为目标组件如果是JSP文件,那么该JSP文件可以访问在源组件中定义的局部变量,但实际上,JSP源组件和JSP目标组件对应同一个Servlet(静态包含相当于两段Java代码拼接融合到一块)
动态包含的目标组件无法识别源组件的变量,即局部变量,因为目标组件和源组件分别对应不同的Servlet。在动态包含中,Jsp目标组件产生的响应结果会被包含到JSP源组件的响应结果中。
混合使用静态包含和动态包含:静态包含通常用来包含不会发生变化的网页内容,而动态包含通常用来包含会发生变化的网页内容。
6.6JSP的异常处理
像普通Java程序一样,JSP在运行时也可能抛出异常,在发生异常的场合,可以通过下面的指令将请求转发给另一个专门处理异常的网页:
发生异常的网页可以写:
<%@ page errorPage="errorpage.jsp"%>
处理异常的网页可以写:
<%@ page isErrorPage="true" %>
甚至可以打印异常信息:<%exception.printStackTrace(new PrintWrite(out));%>
6.7再谈发布JSP
在XML文件中配置JSP文件的信息:
<servlet>
<servlet-name>hi</servlet-name>
<jsp-file>/hello.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>hi</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
6.8预编译JSP
如果把请求参数jsp_precompile的值设置为true,则Tomcat仅仅对客户端请求的JSP文件进行预编译,即把JSP内容转变为Servlet,但不会运行Servlet:
http://localhost:8080/helloapp/hello.jsp?jsp_precompile=true
在XML文件中的路径配置可以为org.apache.jsp.hello_jsp
6.9PageContext抽象类
PageContext来自于javax.servlet.jsp,该类的适用场所包括:JSP文件中的java程序片段,JSP自定义标签的处理类
PageContext的方法可分为以下几种:
用于向各种范围内存取属性的方法。
getAttribute(String name); getAttribute(String name,int scope); setAttribute(String name,Object value,int scope);
removeAttribute(String name,int scope);findAttribute(String name);int getAttributesScope(java.lang.String name)
用于获得由Servlet容器提供的其他对象的引用的方法
getPage();getRequest();getResponse();getServletConfig();getServletContext();getSession();getOut();
用于请求转发和包含的方法
forward(String url);include(String url);
在JSP文件中可以专门用JSP标记(<jsp:forward><jsp:include>)来进行请求转发和包含操作,而在自定义的JSP标签的处理类中无法使用JSP标记,此时就需要依赖于PageContext类的相关方法进行请求转发和包含
6.10 JSP技术的发展趋势
2018.07.10