Tomcat与JavaWeb开发技术详解JSP技术第六章

6.1比较HTML,Servlet,JSP

JSP编译产生的的源文件就是Servlet,所以JSP本质也就是Servlet

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声明:

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("属性名",属性值);。。。

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技术的发展趋势

它的发展的总的目标就是使JSP代码变得越来越简洁

                                                                                                                                         2018.07.10
















猜你喜欢

转载自blog.csdn.net/qq_40369435/article/details/80991145
今日推荐