Tomcat与JavaWeb开发技术详解JSP技术

比较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指令:

常用的三种指令为pageincludetaglib

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

淘汰

发布了69 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

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