文章目录
比较HTML,Servlet,JSP
- JSP编译产生的的源文件就是Servlet,所以JSP本质也就是Servlet
- Tomcat把由JSP产生的Servlet源文件和类文件放于根目录的work目录下。在开发过程中如果更新了JSP文件,Tomcat会重新编译新生成的文件,编译生成的文件会覆盖掉原本work目录下的文件。
JSP语法
在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声明:
JSP用于声明与JSP对应的Servlet类的成员变量(实例变量)和方法
<%! declaration;[declaration]...%>
<%! int var=0; %>;<%! public String amethod(int i){ .....}%>
Java程序片段:
<% …%>标记之间之间嵌入任何有效的java程序代码(若有变量则为局部变量),这种嵌入的程序片段称为Scriptlet。这些程序段对应Servlet的Service()方法中的代码块。
Java表达式:
Java表达式的标记为<%=…%>。如:<%=hitcount++%>
隐含对象:
九大隐含对象(要掌握):request
,response
,pageContext
,application
,out
,config
,page
(相当于Java的this),session
,exception
例如:
request.getParameter("...");aplication.setAttribute("属性名",属性值);。。。
JSP的生命周期
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()
}
请求转发
JSP采用jsp:forward标签来实现请求转发,jsp:forward的语法为:
<jsp:forward page="转发的目标组件的绝对uri或者url">
例如:
以“<%”开头的称为JSP标记(脚本元素),“<jsp”称为JSP标签(动作元素)
<jsp:forward page="target.jsp"/>
包含
include指令用于静态包含
,include标记用于动态包含
-
静态包含:<%@ include file=“被包含的组件的URL的绝对URL或者相对URL”%>
-
动态包含:<jsp:include page=“content.jsp”/>
注意:
-
静态包含的目标组件可以为HTML文件或者JSP文件,但不允许是Servlet文件,因为目标组件如果是JSP文件,那么该JSP文件可以访问在源组件中定义的局部变量,但实际上,JSP源组件和JSP目标组件对应同一个Servlet(静态包含相当于两段Java代码拼接融合到一块)
-
动态包含的目标组件无法识别源组件的变量,即局部变量,因为目标组件和源组件分别对应不同的Servlet。在动态包含中,Jsp目标组件产生的响应结果会被包含到JSP源组件的响应结果中。
-
混合使用静态包含和动态包含:静态包含通常用来包含不会发生变化的网页内容,而动态包含通常用来包含会发生变化的网页内容。
JSP的异常处理
像普通Java程序一样,JSP在运行时也可能抛出异常,在发生异常的场合,可以通过下面的指令将请求转发给另一个专门处理异常的网页:
- 发生异常的网页可以写:
<%@ page errorPage="errorpage.jsp"%>
- 处理异常的网页可以写:
<%@ page isErrorPage="true" %>
甚至可以打印异常信息:
<%exception.printStackTrace(new PrintWrite(out));%>
再谈发布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>
预编译JSP
如果把请求参数jsp_precompile的值设置为true,则Tomcat仅仅对客户端请求的JSP文件进行预编译,即把JSP内容转变为Servlet,但不会运行Servlet:
http://localhost:8080/helloapp/hello.jsp?jsp_precompile=true
在XML文件中的路径配置可以为org.apache.jsp.hello_jsp
PageContext抽象类
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:forwardjsp:include)来进行请求转发和包含操作,而在自定义的JSP标签的处理类中无法使用JSP标记,此时就需要依赖于PageContext类的相关方法进行请求转发和包含
JSP技术的发展趋势
淘汰