[Servlet&JSP] 从JSP到Servlet

JSP与Servlet是一体的两面,JSP最后都会被容器转译为Servlet源代码,自动编译为.class文件,载入.class文件然后生成Servlet对象。

由容器转译后的Servlet类具有_jspInit()、_jspDestroy()、_jspService()等方法,名称中有下划线前缀,表示这些方法都是容器转译时维护的,我们不应该从写这些方法。如果想要做些JSP初始化或收尾的工作,则应定义jspInit()或jspDestryoy()方法。

指示元素

JSP指示(Directive)元素的主要目的在于,指示容器将JSP转译为Servlet源代码时,必须遵守的一些信息。指示元素的语法如下:

<%@ 指示类型 [属性="值"]* %>

在JSP中有三种常用的指示类型:page、include和taglib。

  • page指示类型告知容器如何转译当前的JSP网页。
  • include指示类型告知容器将别的JSP页面包括进来进行转译。
  • taglib指示类型告知容器如何转译这个页面中的标签库(Tag Library)。

指示元素中可以有多对属性/值,必要时,同一个指示类型可以用数个指示元素来设置。

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html; utf-8"
    pageEncoding="utf-8"%>

page指示类型中的import告知容器,转译JSP时必须在源代码中包括的import语句。也可以在一个import语句中,使用逗号分隔开数个import的内容;page指示类型中的contentType属性告知容器,在转译JSP时,必须使用HttpServletRequest的setContentType(),调用方法时传入的参数就是contentType的属性值;pageEncoding属性则是告知容器转译和编译时如何处理这个JSP网页中的文字编码,以及内容类型附加的charset设置。如果网页中包含非ASCII编码范围内的字符(如中文),就要指定正确的编码格式,才不会出现乱码。

可以在使用page指示类型时一行一行的编写,也可以编写在同一个元素中。

page指示类型还有一些可以设置的属性,概略说明如下:

  • info属性
    用于设置当前JSP页面的基本信息,这个信息最后会转换为Servlet成U型中使用getServletInfo()所取得的信息。
  • autoFlush属性
    用于设置输出流时候要自动清除,默认为true。如果设置为false,当缓冲区满了又没调用flush()把数据送出到客户端时,就会产生异常。
  • buffer属性
    用于设置到客户端的输出串流缓冲区的大小,设置时必须指定单位,流入buffer=”16kb”,默认是8kb。
  • errorPage属性
    用来设置当JSP运行错误而产生异常时,该转发哪一个页面处理这个异常。
  • extends属性
    用来指定JSP网页转译为Servlet程序之后,应该继承哪一个类。以Tomcat为例,默认是继承至HttpJspBase(它继承至HttpServlet)。这个属性很少会使用到。
  • isErrorPage属性
    设置JSP页面是否为处理异常的页面,这个属性要与errorPage配合使用。
  • language属性
    指定容器使用哪种语言的语法来转译JSP网页,不过事实上目前只能使用Java的语法且是默认的。
  • session属性
    设置在转译后的Servlet源代码中是否具有创建HttpSession对象的语句。默认是true,若有些页面不需作会话管理,设为false可以增加一些性能。
  • isELIgnored
    设置JSP网页中是否忽略表达式语言,默认是false。这个设置会覆盖web.xml中的<el-ignored>设置。
  • isThreadSafe属性
    告诉容器在编写JSP时是否注意到线程安全,默认值为true。如果设置为false,则转译之后的Servlet会实现SingleThreadMOdel接口,每次请求时将创建一个Servlet实例来服务请求,虽然可以避免线程安全问题,但这会影响到性能,极度不建议设置为false。

incude指示类型用来告知容器将包括另一个网页的内容进行转译。

<%@include file="/WEB-INF/header.jsp" %>
<%@include file="/WEB-INF/foot.jsp" %>

使用命令元素include来包括其他网页内容时,由于是在转译时期就决定了转译后的Servlet内容,是一种静态的包含方式。<jsp:include>标签则是在运行时将别的网页动态包括进来进行响应的方式。

声明、Scriptlet与表达式元素

JSP网页会转译为Servlet类,转译后的Servlet类应该包括哪些类成员、方法声明或是哪些语句,在编写JSP时,可以使用声明(Declaration)元素、Scriptlet元素以及表达式(Expression)元素来指定。

声明元素

声明元素的语法如下:

<%! 类成员或方法声明 %>

<%!%>之间声明的程序代码,都将转译为Servlet中的类成员或方法。

在使用<%!%>声明变量时,必须小心数据共享与线程安全的问题。容器默认会使用同一个Servlet实例来服务不同用户的请求,每个请求就是一个线程,而<%!%>之间声明的变量对应至类变量成员,因此会有线程共享访问的问题。

如果有一些初始化操作想要在JSP加载时执行,则可以重写jspInit()方法,也可以用jspDestroy()定义结尾动作。定义这两个方法就是在<%!%>之间进行的,这样转译后的Servlet源代码就会有相对应的片段出现。

Scriptlet元素

Scriptlet元素语法如下:

<% Java语句 %>

在Scriptlet元素中可以编写Java语句,就如同在Java的方法中编写语句一样,事实上,其中所包括的内容将被转译为Servlet源代码的_jspService()方法中的内容。

直接在JSP中编写的HTML,都会变成out对象所输出的内容。Scriptlet出现的顺序,也就是在转译为Servlet后,语句出现在_jspService()中的顺序。

表达式元素

表达式元素语法如下:

<%= Java表达式 %>

表达式运算的结果将直接输出为网页的一部分。在表达式元素中不用加上分好(;)。

隐含对象

隐含对象 说明(转译后对象的对象)
out JspWriter–>PrintWriter
request HttpServletRequest
resposne HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
pageContext pageContext,它提供了JSP页面资源的封装
exception Throwable,它代表JSP页面抛出的异常对象
page this

可以通过pageContext设置四种范围属性,而不用使用个别的pageContext、request、session、application来进行设置。以pageContext提供单一的API来关系属性的作用范围,可以使用以下的方法来进行设置。

getAttribute(String name, int scope)
setAttribute(String name, Object value, int scope)
removeAttribute(String name, int scope)

scope可以使用以下常数来指定:

  • pageContext.PAGE_SCOPE
  • pageContext.REQUEST_SCOPE
  • pageContext.SESSION_SCOPE
  • pageContext.APPLICATION_SCOPE

事实上,很少会使用到pageContext,pageContext主要是在转译JSP为Servlet时,提供给容器一个单一访问的界面。

错误处理

JSP终究会转译为Servlet,所以错误可能发生在以下三个时候:

  1. JSP转换为Servlet源代码时
    语法错误等
  2. Servlet源代码进行编译时
    忘记部署相关的类等
  3. Servlet加载容器进行服务单发生运行时错误
    如NullPointerException等

转载:http://blog.csdn.net/foreverling/article/details/50332865

时间: 2024-11-08 22:23:20

[Servlet&JSP] 从JSP到Servlet的相关文章

[JSP/Servlet入門]JSP錯誤處理

js|servlet 剛開始撰寫JSP時,總是會被JSP的除錯訊息所困擾,如果沒有稍微瞭解JSP與Servlet之間運作關係的初學者,所看到的只是一堆除錯訊息,甚至例外發生的訊息,這些訊息雖然包括詳細的錯誤訊息,但對於初學者而言卻是不友善.不易閱讀理解的.基本上,只要瞭解JSP與Servlet之間的運作關係,並瞭解Java編譯訊息與例外處理,要瞭解在撰寫JSP網頁時,因錯誤而產生的錯誤報告頁面就不是件難事. 我們知道JSP終究會轉換為Servlet,而運行時真正動作的是Servlet類,所以錯誤

jsp如何实现调用servlet后页面不跳转

问题描述 jsp如何实现调用servlet后页面不跳转 想实现这样的功能:在页面点击按键后,servlet向邮箱发个验证码邮件,页面停留在当前页面,之前填写的信息保持不变.大概是异步通信的问题?不知道怎么实现...求解..(现在邮箱验证什么的都没问题,只是调用servlet后页面会跳转,但我希望能就停在当前页面,等输入验证码之后再按键,跳转到其他页面) 解决方案 可以采用AjaX实现 解决方案二: 相关请搜索jquery ajax 解决方案三: 为什么会跳转呢?你的request中是不是重定向了

tomcat各版本和jsp、jstl、servlet的依赖关系(转)

  Servlet / JSP / Tomcat  Version    Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.39 2.2/1.1 3.3.2 (archived)          Servelt / JSP/JSTL / J2EE Version   Servlet JSP JSTL Java EE 2.5 2.1 1.2 5 2.4 2.0 1.1 1.4 2.3 1.2 1.0 1.2    

JSP转译成Servlet详细过程

JSP转译成Servlet详细过程 JSP转译成Servlet详细过程   JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术.Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容.     由于包括大量的HTML标签.大量的静态文本及格式等,导致Servlet的开发效率极为低下.所有的表现逻辑,包括布局.色彩及图像等,都必须耦合在Java代码中,这的确让人不胜其烦.JSP的出现弥补了这种不足,JSP通过在标准的HTM

java servlet 转化成 jsp

问题描述 jsp编译成了servlet.如何将servlet转化成jsP 解决方案 解决方案二:你直接访问这个servlet然后在页面查看源码然后修改后缀jsp再根据servlet改改解决方案三:1楼的办法不错,就这么简单.解决方案四:这个简单,只需要Stringmethod=request.getMethod();if("get".equals(method)){把servlet的doget方法中代码放在这里}else{把servlet的dopost方法中代码放在这里}解决方案五:真

[Servlet&amp;amp;JSP] 从JSP到Servlet

JSP与Servlet是一体的两面,JSP最后都会被容器转译为Servlet源代码,自动编译为.class文件,载入.class文件然后生成Servlet对象. 由容器转译后的Servlet类具有_jspInit()._jspDestroy()._jspService()等方法,名称中有下划线前缀,表示这些方法都是容器转译时维护的,我们不应该从写这些方法.如果想要做些JSP初始化或收尾的工作,则应定义jspInit()或jspDestryoy()方法. 指示元素 JSP指示(Directive)

JSP编译成Servlet(三)JSP编译后的Servlet

JSP编译后的Servlet类会是怎样的呢他们之间有着什么样的映射关系在探讨JSP与Servlet之间的关系时先看一个简单的HelloWorld.jsp编译成HelloWorld.java后会是什么样. ①HelloWorld.jsp <%@ page contentType="text/html; charset=gb2312" language="java" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD

jsp跳转到servlet跳转遇到的一个异常

问题描述 jsp跳转到servlet跳转遇到的一个异常 这个是我在做一个注册登录功能时候遇到的问题,注册是可以的,但是登录就开始报错,在网上查了下没什么头绪,希望那路大神帮帮忙!!!代码我放在百度盘里面 myeclipse的工程,跳转时报这样的错: 严重: Allocate exception for servlet LoginServlet java.lang.IllegalAccessException: Class org.apache.catalina.core.DefaultInsta

jsp中提交到Servlet的表单获取的值为什么都为NULL?

问题描述 jsp中提交到Servlet的表单获取的值为什么都为NULL? ------------------addProduct.jsp--------------- <form action="${pageContext.request.contextPath}/servlet/ManagerServlet?operation=addProduct" method="post""> <table width="80%&quo