kl800.com省心范文网

Servlet、JSP学习笔记

Servlet/JSP 学习笔记 (1)tomcat 和 eclipse 的安装
由于项目需要,最近不得不开始学习 JSP 和 Struts 了。三年前曾经学过 JSP, 而且还做过一个小程序, 不过现在早已经扔到九霄云外去了。 为了不落后于时代, 决定开始从今天学习 JSP! 虽然我很喜欢用 vim, 但开发 Java 程序首选环境是 eclipse,咱也不能太无知了 啊。 所以安装 eclipse 是第一件事儿。 另外 Web 服务器 Tomcat 也是必不可少的。 下面是各个软件的下载链接。
? ? ?

Tomcat 5.5.25, Tomcat 服务器 eclipse 3.2.2, eclipse tomcatPlugin 3.2.1, eclipse 的 Tomcat 插件

eclipse 我没有使用最新版本的 3.3,而是用了稍老些的 3.2.2。这个旧版本的 还真不好找,你如果是从 eclipse 的主页上进入下载页的话,应当选择右侧的 Browse downloads 中的 By Project,然后选择 Eclipse Platform,才能到达上 述的下载页面。 至于 JDK,大家应该都知道怎么装我就省略了。 不多说了,马上开始安装。首先是 Tomcat 6 的安装,没什么特别的,只是默认 的安装路径太长 (C:\Program Files\Apache Software Foundation\Tomcat 5.5), 我将其改到了 D:\wwwroot\Tomcat 5.5 下,然后设置管理员密码,一路 Next 就 OK 了。安装完毕之后可以直接启动 Tomcat 5,也可以打开命令行输入以下命 令手动启动 Tomcat: net start tomcat5 最后打开 http://localhost:8080/ , 能看到 Tomcat 的猫的形象则安装成功了。 eclipse 不用安装,解压缩即可,我将其放到了 D:\eclipse 下。 最后是 tomcatPlugin 的安装,这个插件可以让你在 elipse 中重启 tomcat,并 提供 JSP 项目的自动发布、调试等功能,做 JSP 开发的首选插件之一。解压之后 直接扔到 D:\eclipse\plugins 目录下即可,不过考虑到卸载的问题,我决定使 用 links 方式安装。 所谓 links 方式就是将插件放到其他目录,再通过一个配置文件来告诉 eclipse 到哪里去找插件的方式。首先在 D:\eclipse 下建立 pluginsdir 用于 保存插件。 再在 pluginsdir 中建立目录 tomcatPlugin, 再在其中建立 eclipse,

再在其中建立 plugins,然后将 tomcatPlugin 解压到这个 plugins 下面。可能 有的同学已经听糊涂了,其实插件的位置就在 D:\eclipse\plugins_dir\tomcatPlugin\eclipse\plugins\com.sysdeo.eclips e.tomcat_3.2.1 然后建立 D:\eclipse\links,在其中新建一个 tomcatPlugin.start 文件,内 容如下: path = plugins_dir/tomcatPluginV321 然后启动 eclipse,你会在工具栏上看到三个猫型按钮,主菜单中也会出现 “Tomcat”菜单,说明插件安装成功了。 接下来是 tomcat 插件的配置。 在 eclipse 中打开 Window->Preferences,从左 侧的树形菜单中选择 Tomcat,即可看到下图的配置界面。选择 Tomcat 版本为 Tomcat 5.x,指定 Tomcat home 到 D:\wwwroot\Tomcat 5.5,最后将 Context declaration mode 设置为 Server.xml 即可。

(2)基础知识
关于 BS 结构(浏览器-服务器结构)、HTTP 基本原理等基础知识相信大家比我清 楚,我就不废话了。不知道的同学去 google 一下。

什么是 Servlet 和 JSP
用 Java 开发 Web 应用程序时用到的技术主要有两种, 即 Servlet 和 JSP。Servlet 是在服务器端执行的 Java 程序,一个被称为 Servlet 容器的程序(其实就是服 务器)负责执行 Java 程序。而 JSP(Java Server Page)则是一个页面,由 JSP 容器负责执行。 Servlet 和 JSP 两者最大的区别就是,Servlet 以 Java 程序为主,输出 HTML 代 码时需要使用 out.println 函数, 也就是说 Java 中内嵌 HTML; 而 JSP 则以 HTML 页面为主,需要写 Java 代码时则在页面中直接插入 Java 代码,即 HTML 中内嵌 Java。典型的例子如下: JSP 文件 <html> <body> <h1> <% out.println("JSP"); %> </h1> </body> </html> Servlet public class MyServlet ... { ... out.println("<html>"); out.println("<body>"); out.println("<h1>"); out.println("Servlet); out.println("</h1>"); out.println("</body>"); out.println("</html>"); }

可见,JSP 便于输出,而 Servlet 便于进行逻辑处理。因此实际应用中两者常常 结合使用,各司其职。 而 Tomcat 就是上面提到的 Servlet 容器和 JSP 容器。各个版本对 Servlet/JSP 协议支持的情况如下: Tomcat 版本 支持 Servlet 支持 JSP 6.0.x 5.5.x 4.1.x 3.3.x 2.5 2.4 2.3 2.2 2.1 2.0 1.2 1.1

Web 应用程序的结构
Tomcat 安装好以后,可以去看看 tomcat 目录下的 webapps 目录。这个目录就是 用来保存 Web 应用程序的。

上图的根目录就是应当放置在 webapps 目录下的目录。WEB-INF 目录无法从浏 览器中访问。WEB-INF/classes 下保存的是编译后的 Java 程序(主要是 Servlet), WEB-INF/lib 下保存的是运行时使用的库文件(.jar 文件), web.xml 则是整个应 用程序的配置信息。 其他文件例如 .jsp、图片、Javascript 脚本等,都可以直接放到 Web 应用程序 的根目录下。

MVC 模型
所谓 MVC 模型就是将数据、逻辑处理、用户界面分离的一种方法。

? ? ?

M(Model, 模型):用于数据处理、逻辑处理。 V(View,视图):用于显示用户界面。 C(Controller,控制器):根据客户端的请求控制逻辑走向和画面。

而在 Java 中,MVC 这三个部分则分别对应于 JavaBeans、JSP 和 Servlet。
? ? ?

M = JavaBeans:用于传递数据,拥有与数据相关的逻辑处理。 V = JSP:从 Model 接收数据并生成 HTML C = Servlet:接收 HTTP 请求并控制 Model 和 View

画成图则如下所示:

(3)Lomboz 介绍+安装方法
在 Servlet/JSP 学习笔记(1)-tomcat 和 eclipse 的安装中,我介绍了 eclipse 和 tomcatPlugin 的安装和配置方法。但今天发现,使用 tomcatPlugin 创建项目 时,不会自动生成 web.xml,需要手工编辑,这多少有些不方便。 (关于 web.xml 的简单介绍参考这里。) 实际上,开发和调试 Servlet/JSP 程序时,一个叫做 Lomboz 的插件更为强大、 更好用。 Lomboz 其实是一个开发 J2EE 程序的强大插件,Servlet/JSP 只是小菜 一碟而已。 下面就来介绍一下 Lomboz 的安装方法。 关于 eclipse 和 Tomcat 的安装请参考 前一篇文章。

安装
Lomboz 可以从官方主页上下载。选择对应于你的 eclipse 版本的 lomboz,我用 的是 eclipse 3.2.2,所以安装了 Lomboz for Eclipse 3.2。

点击下载链接进入后会发现有多个文件,应该下哪一个呢?最原始的形如 org.objectweb.lomboz-R-3.2.2-200706042126.zip 的,是仅有 lomboz 的独立 安装包;带有 all-in-one 的是连 eclipse 都包含在内的一站式文件;带有 prereqs 字样的是 lomboz 和它依赖的包。Lomboz 运行时需要另外一些插件的支 持, 因此仅安装原始版本的 lomboz 是不能运行的。 推荐新手下载 prereqs 版本, 只要安装就能用了。再懒一些的可以直接用 all-in-one。 安装很简单, 可以将其直接解压缩到 eclipse 目录下,也可以通过 links 目录安 装。关于 links 目录的安装方法,上一篇文章 已经提到过,这里不再重述。只 说一点,lomboz 内的文件层次结构很深,如果直接解压到 D:\eclipse\plugins-dir 下,WinRAR 和 7-zip 都会报错,说目录名太长。因此 只能先将其解压到根目录下,再移动到 D:\eclipse\plugins-dir 中。 装完 Lomboz 之后,tomcatPlugin 就可以卸载了。只要删掉 links 目录下的相关 文件即可。 启动 eclipse, 在 Window->Preferences 中看到左侧树形目录中多出了 “Web and XML”、 “Web Services”、“XDocklet”等菜单,说明安装成功了。

配置
在 Window->Preferences 中打开 Server->Installed Runtimes 项,如果右边列 表是空的,则单击 Add?,选择服务器为 Tomcat,版本为你安装的版本, Next 之后设置好服务器路径。

(4)Servlet 入门
介绍完工具和基本概念, 现在终于开始介绍 Servlet 的编写方法了。为了便于理 解,我们将采用 eclipse+Lomboz 作为开发环境,一切的操作都可以在 eclipse 中完成。如果你还没有安装好 Lomboz,请参考前几篇文章配置好环境。
? ? ?

tomcat 和 eclipse 的安装 基础知识 Lomboz 介绍+安装方法

我们将建立一个名为 com.idv2.learnjsp 的包,用于容纳所有的示例程序。下 面我们就看看最基本的 Servlet 的创建方法。

创建项目
启动 eclipse,然后选择菜单 File->New->Project?,在新建项目向导中选择 Web->Dynamic Web Project。该项目即为使用 Servlet、JSP 等技术开发动态网

站的项目。(如果你找不到这一项,说明 Lomboz 没有配置好,请参阅文章开头 的链接进行配置。)

下一步,输入项目名 LearnJSP。下面的 Target Runtime 指定运行这个项目的服 务器,如果你已经在配置 Lomboz 的一节中配置好了 Tomcat 服务器,那么在这 里你可以看到相应的服务器配置,选择它即可。如果选择框中只有<none>,说明 你还没有配置服务器,可以单击右侧的 New?按钮新建。 Configurations 项选择<none>即可。

下一步选择项目所需的特性,默认的 Dynamic Web Module 和 Java 就足够了。

下一步是输入相关的目录,这里也直接使用默认值即可。图略。 最后单击 Finish,完成项目创建。创建途中可能会有一个用户使用协议需要你 同意,单击 I Agree 即可。创建完成后会询问是否要切换到 J2EE 视图(下图), 选择 Yes,完成项目创建。

项目建立完成后,请在左侧的 Project Explorer 中打开 LearnJSP 项目,看看 它各个部分的构成。

从基础知识一节中我们知道,应用程序由三部分组成,即 Servlet、JSP 及静态 内容、配置文件 web.xml。项目视图中的 src 目录用来保存 Servlet 源代码, WebContent 目录用来保存 JSP 及静态内容, web.xml 则位于 WebContent/WEB-INF/web.xml。 但手工编辑 web.xml 比较麻烦, 因此 Lomboz 提 供了一套可视化工具用于编辑 web.xml,即最上方的 Depolyment Descriptor , 里面包含的内容以后会陆续讲解。

理解 Servlet
在 Project Explorer 中打开 Java Resources: src -> Libraries -> Apache Tomcat 5.5 -> servlet-api.jar 文件,可以看到其中包含两个包: javax.servlet 和 javax.servlet.http,与 Servlet 有关的类和接口都位于这 两个包里面。

Servlet 是一个接口,位于 javax.servlet.Servlet,它规定了每个 Servlet 所 必须实现的方法。实际应用时我们需要从 javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet 两个抽象类继承出自己的 Servlet 类,并实 现所需的功能。这几个类的关系如下(绿色斜体字为抽象类):

上图中,Servlet 依赖于 ServletRequest 和 ServletResponse 接口,这两个接 口负责为 Servlet 接受和发送信息。 HttpServlet 也类似。

Servlet 接口

javax.servlet.Servlet 接口包含以下的方法: init() void init(ServletConfig config) throws ServletException init 方法用于初始化,在 Servlet 启动时调用。 service() void service(ServletRequest req, ServiceResponse res) throws ServletException, IOException Servlet 通过这个方法,从 req 获得客户端请求,处理并生成结果,再通过 res 发送给客户端。 destroy() void destroy() Servlet 销毁时执行的方法。 getServletInfo() String getServletInfo() 将 Servlet 的信息通过字符串返回。 getServletConfig() ServletConfig getServletConfig() 获取包含 Servlet 各种信息的 ServletConfig 对象。 当某个 Servlet 第一次被请求时,服务器(Servlet 容器)会生成该 Servlet 并 调用它的 init()方法, 再调用其 service()方法处理请求。 处理结束后该 Servlet 会常驻于容器中,下一个请求则不再重新生成 Servlet,而是直接调用常驻的 Servlet 对象的 service()方法。 服务器停止时, 会调用该 Servlet 的 destroy() 方法。 因此,在 Servlet 的一个生命周期中,init()和 destroy()仅会被调用一次,而 service()则会被调用多次。

GenericServlet 抽象类
javax.servlet.GenericServlet 为我们实现了 Servlet 接口的大部分方法,除 了 service()方法之外。因此,我们在制作自己的 Servlet 时,只需要继承 GenericServlet 并重载 service()方法即可。

典型的 Servlet 示例
下面我们来做一个典型的 Servlet。

在 eclipse 左侧的 Project Explorer 中,右键单击 Java Resources: src 目录 (以后简称 src 目录),选择 New->Class,建立如下所示的类。

包名输入我们要建立的 com.idv2.learnjsp,类名为 HelloServlet,父类为 javax.servlet.http.GenericServlet。在输入父类名时,你会看到输入框左侧 有个小灯泡的图标,这说明可以通过 Alt-/键自动补齐,因此你只需输入 GenericSer 几个字母,然后按 Alt-/ 组合键,系统会自动查找开头为 GenericSer 的类并补齐剩余部分。 Finish 之后 eclipse 会为我们生成代码框架,我们只需填入实际的处理代码即 可。代码可以从这里下载。 helloservlet.zip

上述代码是 UTF-8 编码, 如果你直接放到 src 目录中有可能出现乱码,这时请选 择 Windows->Preferences?菜单, 选择左侧的 General->Workspace, 然后将 Text file encoding 设置为 UTF-8 即可。 代码写好后, 从 Project Explorer 中打开项目的 build 目录, 可以看到 eclipse 自动编译了 HelloServlet.java 并生成了 com/idv2/learnjsp/HelloServlet.class 文件。 那么如何在服务器上运行它呢?首先必须要做的就是在配置文件 web.xml 中登 记这个 Servlet。刚才我们在建立 HelloServlet 类时,并没有声明它是一个 Servlet,这样服务器就无法将它作为 Servlet 执行,因此必须先登记,并为它 指定一个 URL(即 Servlet Mapping)。 右键单击 Depolyment Descriptor 中的 Servlets,选择 New->Servlet,出现下 面的画面。

因为我们已经写好了 HelloServlet 类, 因此选中 Use existing Servlet class, 然后单击右侧的 Browse?按钮,选择 HelloServlet 类。下一步。

URL 映射是指,浏览器通过哪个 URL 能访问到这个 Servlet。默认与 Servlet 名 称相同,为了演示,我们这里将他修改为小写的 /helloservlet 。实际的 URL 格式为 http://主机名/应用程序名/Servlet 的 URL 映射,我们这个 Servlet 的 URL 就应当是 http://localhost:8080/LearnJSP/helloservlet。 单击 Finish 完成添加 Servlet。如果你有兴趣可以打开 WebContent/WEB-INF/web.xml, 可以看到刚才的修改在 web.xml 中是怎样的结果。 下一步我们需要将它部署到服务器上。打开 eclipse 下方的 Servet 栏,可以看 到系统中的服务器列表。

如果你找不到 Server 栏, 请通过主菜单 Window->Show View->Others 添加 Server 栏;如果你的 Server 栏中什么都没有,请在 Server 栏中单击右键然后 New->Server。

右键单击服务器,选择 Add and Remove Projects?,将 LearnJSP 项目添加到 服务器上。添加之后的结果如下:

最后右键单击服务器,选择 Start,片刻即可看到在 Console 栏中输出大量的信 息,服务器启动了。打开浏览器,访问 http://localhost:8080/LearnJSP/helloservlet。 如果能看到 “Hello Servlet” 的输出,则恭喜你,第一个 Servlet 成功运行了! 刷新浏览器页面几次, 然后回到 eclipse 下侧的 Console 栏,可以看到下面的字 样: init() was called. service() was called. service() was called. service() was called. 这是我们加入的调试信息。这些信息说明了 Servlet 的一个生命周期中 init、 service 和 destroy 函数的执行过程。如果在 Server 栏中停止服务器,那么你 可以在 Console 栏中的信息中找到 destroy() 函数的执行。

结语
这一节重点结合 Lomboz 的用法, 讲述了 Servlet 的基本原理和最简单的 Servlet 的编写方法。以后的内容可能就不会这么详细地说明 Lomboz 的用法了。

(5)HttpServlet
上一节我们介绍了 javax.servlet.Servlet 接口和继承 javax.servlet.GenericServlet 抽象类生成 Servlet 的方法。而实际上,直接 继承 GenericServlet 并不方便也不实用,更多的情况下是继承 javax.servlet.http.HttpServlet 来生成 Servlet。

HttpServlet
先来复习一下上一节提到的类结构图:

可以看到,HttpServlet 继承了 GenericServlet,不过它也是一个抽象类,不能 直接使用,只能继承它。 HttpServlet 中常用的方法有两个: doGet void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 当浏览器用 GET 方式访问时,该方法被调用。 doPost void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 当浏览器用 POST 方式访问时,该方法被调用。 这两个函数内部的处理方法基本上与上一节介绍的 GenericServlet.service() 函数相同。 另外其他的 HTTP 请求也都有相应的方法: HTTP 请求类别 HttpServlet 的方法 GET POST HEAD PUT DELETE doGet() doPost() doHead() doPut() doDelete()

HttpServletRequest
doGet()和 doPost()函数的两个参数为 HttpServletRequest 和 HttpServletResponse 对象。 HttpServletRequest 接口表示浏览器请求,你可以通过这个类获取浏览器发送 到服务器的任何信息。 对于 PHP 程序员来说, 这个类有点类似于 $_GET、 $_POST、 $_SERVER 等几个变量的内容。它的常用方法如下: getParameter String getParameter(String name) 获取指定变量名 name 所对应的参数值。该方法实际上为父接口 javax.servlet.ServletRequest 的方法。如果是 GET 请求则获取查询字符串后 的参数,POST 请求则获取<form>表单中的参数。类似于 PHP 的$_GET 和$_POST 数组。 getParameterValues String[] getParameterValues(String name) 这个方法与 getParameter()类似。当你要获取<input type=”check”>这类会 返回多个值的表单属性时,就应当用这个方法。 getMethod String getMethod() 返回字符串"GET"或"POST"。 getRequestURI String getRequestURI() 获取请求的 URI (不包括查询字符串) 。 相当于 PHP 的$_SERVER['REQUEST_URI']。 getServletPath String getServletPath() 获取 Servlet 的路径。相当于 PHP 的$_SERVER['PHP_SELF']。 getPathInfo String getPathInfo() 获取 PathInfo。相当于 PHP 的$_SERVER['PATH_INFO']。 setCharacterEncoding void setCharacterEncoding(String new) 设置请求的编码。 需要处理汉字时务必要通过该方法设置正确的字符编码,否则 将无法正确读取浏览器发过来的文字。 还有好多有用的方法大家可以自己去参考接口文档。

HttpServletResponse
HttpServletResponse 接口则用于控制服务器发送给客户端的内容,相当于 PHP 的 echo、header 等函数。 setContentType void setContentType(String type) 设置返回值的类型。 通常的 HTML 内容可设置为"text/html; charset=UTF-8"等, 而动态生成的图片则可以设置为"image/gif"等。输出汉字之前,务必要通过该 方法指定输出的字符编码。相当于在 PHP 中写 header("Content-Type: image/gif")。 ServletOutputStream ServletOutputStream getOutputStream() throws IOException 向客户端发送二进制数据时,需要通过此方法获取输出流。 getWriter PrintWriter getWriter() throws IOException 向客户端发送文本数据时,需要通过此方法获取输出流。

示例程序
上一节建立 Servlet 时,我们先生成了 Java 代码,再将其添加到 web.xml 的 Servlet 节中。 实际上可以直接在 web.xml 的 Servlet 节中建立 Servlet, Lomboz 会自动帮我们生成 Java 代码。 我们这次将建立一个表单提交程序,通过一个 HTML 表单提交数据,然后在 Servlet 中读出数据并显示出来。 首先右键单击 WebContent 目录,选择 New->HTML,新建一个 HTML 文档,命名为 htmlpost.html。下一步是选择 HTML 模板,直接用默认值即可。 然后编辑 htmlpost.html,可参考本节的源代码。源代码下载: httppost.zip 右键单击 Deployment Descriptor 中的 Servlets,选择 New->Servlet。

按照下图的样子,在 Java package 处输入包名 com.idv2.learnjsp,在 Class name 处输入类名 HttpPost,单击 Next。

出现 Servlet 映射的配置界面,输入适当的 Description。注意下方的 URL Mappings,这个就是从浏览器访问该 Servlet 时使用的 URL。

下一步选择新建的类的属性, 通常选择默认即可。不过我们的 Servlet 只需要处 理 POST 方法,所以下方的重载列表中只需选择 doPost 即可。

最后单击 Finish,即可完成 Servlet 的建立,并且 Lomboz 会自动在 Java 代码 的 src 目录中生成 HttpPost.java 文件的框架。 编辑 java 代码,可以参考下面的源代码下载。 httppost.zip 其实这段代码的主要内容就是通过 getParameter 或者 getParameterValues 方法来获取客户端提交的数据。其代码片段如下; // 字符集 request.setCharacterEncoding("UTF-8"); // 从表单中获得数据 out.println(" <li>用户名: " + request.getParameter("username")); out.println(" <li>密码: " + request.getParameter("password")); out.println(" <li>确认密码: " + request.getParameter("confpass")); // 获取复选框的表单选项 String interests[] = request.getParameterValues("interests");

out.println(" <li>兴趣爱好: <br/>"); if (interests != null) { for (int i = 0; i < interests.length; i++) { out.println(interests[i] + "<br/>"); } } 编辑好代码之后,在 Server 视图中启动 Tomcat,打开浏览器,输入 http://localhost:8080/LearnJSP/httppost.html, 输入信息之后单击 “注册” , 即可看到输入的注册信息。

(6)从配置文件获取参数
前两节(1, 2) 分别介绍了 GenericServlet 和 HttpServlet 的用法。这一节将 介绍 ServletContext 和 ServletConfig 这两个接口。通过这两个接口,我们 可以在 web.xml 中设置一些参数, 如数据库地址、 用户名密码等, 供 Servlet 使 用,这样每次参数值变动时,不用重新编译 Servlet 了。 javax.servlet.ServletContext 接口(上下文参数)是针对整个项目的全局设置, 而 javax.servlet.ServletConfig 接口(初始化参数)是针对当前 Servlet 的设置。 两者的设置内容都写在 web.xml 中。在 Lomboz 中新建 Servlet 时,可以看到设 置初始化参数的位置,如下图:

而上下文参数就没这么方便, 只能通过手工编辑 web.xml 来添加了。 好在 Lomboz 提供了方便的 XML 编辑器, 打开 web.xml 之后即可看到各个 Servlet 的配置情况, 右键单击最顶层的“web-app”元素,选择 Add Child->context-param,然后分 别修改 param-name 和 param-value 即可。

那么在程序中如何取得这两类参数?请看这几个方法: javax.servlet.GenericServlet.getServletConfig 返回当前 Servlet 的 ServletConfig 对象。 javax.servlet.ServletConfig.getServletContext 返回当前应用程序的 ServletContext 对象。 通过这两个方法, 我们就可以获得当前 Servlet 的初始化参数对象和上下文参数 对象。 ServletContext 的主要方法: String getInitParameter(String name) 获取指定上下文参数的值。 ServletConfig 的主要方法: String getInitParameter(String name) 获取指定初始化参数的值。

java.util.Enumeration getInitParameterNames() 获取所有的初始化参数的名称。 示例程序分别通过 ServletContext 和 ServletContent 读出值并显示出来。 因为 参数值在 Servlet 的生命周期中是不变的,仅需读取一次即可,所以将取得参数 的代码写在了 init() 方法而不是 doGet()方法中。 其他没什么特别需要说明的 地方,参数追加的方法参考前文即可。 initparam.zip

(7)Session 和作用域
几乎所有的 Web 开发语言都支持 Session 功能, Servlet 也不例外。Servlet/JSP 中的 Session 功能是通过作用域(scope)这个概念来实现的。 作用域分为四种,分别为: page request session 在当前页面有效(仅用于 JSP 中) 在当前请求中有效 在当前会话中有效

application 在所有应用程序中有效 是不是看不太明白?page 因为仅用于 JSP 中,这里只讲述其他三种作用域。首 先要声明的一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息 能够在多大的范围内有效。 话说武松一日来到景阳岗, 见一旗帜迎风飘扬, 旗子上书五个大字 “三碗不过岗” 。 武松叫道:“店家,拿三碗酒来,再切两斤熟牛肉!”店小二应声道:“三碗好 酒,二斤熟牛肉啰~~”里面厨师赶忙当当当当切好牛肉,店小二倒上三碗酒, 店小二端上前来。 武松咕咚咕咚连干三碗,叫一声“好酒!店家,再来三碗!”小二忙又倒上三碗 好酒,武松一饮而尽。就这样前前后后武松一共喝了十八大腕。付了帐刚要走, 店小二道: “客官, 这前面山上有大虫, 客官刚刚喝完十八碗酒恐怕过不得岗, 不如在小店暂住一夜,待明天和猎户一同过岗岂不是好?” 之后武松说什么就留待各位看官自己去回忆啦。在这段武松打虎中,大家有没有 看到些熟悉的东西?
? ? ? ? ?

武松: 浏览器。 酒馆: 服务器。 店小二、厨师: Servlet 或者 JSP。 来三碗好酒!: 浏览器向服务器发出 HTTP 请求。 店小二上酒: 服务器的响应。

?

武松从进店到离开: 一个 HTTP 对话。

我们可以看到,Web 交互的最基本单位为 HTTP 请求(‘武松点菜‘)。每个用户 从进入网站到离开网站这段过程称为一个 HTTP 会话 (‘武松进店到出店‘),一 个服务器的运行过程中会有多个用户访问, 就是多个 HTTP 会话( ‘酒馆当然不可 能只接待武松一个客人‘)。那么作用域就可以理解为: request session HTTP 请求开始到结束这段时间 HTTP 会话开始到结束这段时间

application 服务器启动到停止这段时间 request 一个 HTTP 请求的处理可能需要多个 Servlet 合作( ‘武松点菜时店小二就要吩咐 厨房做菜‘),几个 Servlet 之间可以通过某种方式传递信息(‘店小二就用吆喝 的方式通知厨房‘),但这个信息在请求结束后就无效了(‘厨房在做完菜之后就 不用再管这道菜的事儿了‘)。 Servlet 之间的信息共享是通过 HttpServletRequest 接口的两个方法来实现的: void setAttribute(String name, Object value) 将对象 value 以 name 为名称保存到 request 作用域中。 Object getAttribute(String name) 从 request 作用域中取得指定名字的信息。 doGet()、doPost()函数的第一个参数就是 HttpServletRequest 对象,使用这 个对象的 setAttribute 即可传递信息。 那么设置好信息之后,如何将信息传给其他 Servlet?这就要用到 RequestDispatcher 接口的 forward 方法,将请求转发给其他 Servlet。 RequestDispatcher ServletContext.getRequestDispatcher(String path) 取得 Dispatcher 以便转发。path 为转发的目的 Servlet。 void RequestDispatcher.forward(ServletRequest request, ServletResponse response) 将 request 和 response 转发。 因此,只要在当前 Servlet 中先 setAttribute,然后 forward,最后在 forward 到的 Servlet 中 getAttribute 即可实现信息传递。 PHP 的程序员可能不太好理解这一段,因为 PHP 中没有转发的概念,一个请求只 能由一个 PHP 文件来处理,所以 PHP 中根本没有 request 作用域的概念。而

Servlet 则不同,请求可以在应用程序中任意转发,所以用 request 作用域在不 同 Servlet 之间传递信息。需要注意两点: 1. 转发不是重定向,转发是在 Web 应用内部进行的。PHP 支持重定向但没有 转发。 2. 转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地 址栏中显示的仍然是最初那个 Servlet 的地址。

session
session 作用域比较容易理解,同一浏览器访问多次,在这多次访问之间传递信 息,就是 session 作用域。 (武松每次点菜帐房先生都要记一笔账,等武松走之 前结帐用。这笔帐在武松吃饭过程中始终有效,即位于 session 作用域中) session 是通过 HttpSession 接口实现的。 Object HttpSession.getAttribute(String name) 从 session 中获取信息 void HttpSession.setAttribute(String name, Object value) 向 session 中保存信息 而通过 HttpServletRequest.getSession()方法可以获得 HttpSession 对象。 HttpSession HttpServletRequest.getSession() 获取当前请求所在的 session 的对象。 session 的开始容易判断(浏览器发出第一个 HTTP 请求即可认为会话开始),但 结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束 了”),所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认 为会话结束。 Tomcat 的默认值为 120 分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval 方法来设置。 void setMaxInactiveInterval(int interval) 设置会话的超时值。 如果想主动让会话结束, 如用户单击 “注销” 的时候, 可以使用 HttpSession 的 invalidate 方法: void invalidate() 强制结束当前 session。

application

application 作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的 信息可以被所有应用程序使用。 (餐馆打烊后结帐, 用到的即是开张到打烊之间 的所有信息。) 还记得上一节提到的 ServetContext 吗? application 作用域上的信息传递就 是通过 ServetContext 实现的。 Object getAttribute(String name) 从 application 中获取信息。 void setAttribute(String name, Object value) 向 application 作用域中设置信息。

总结
可以看到,每个作用域除了实现接口不同、意义不同之外,它们的使用方法和作 用都是相同的,都是通过 getAttribute 和 setAttribute 方法进行信息传递。 作用域 request session 意义 HTTP 请求内 HTTP 会话内 实现接口 HttpServletRequest HttpSession

application 服务器生命周期内 ServletContext

示例程序
这一节的示例程序是一个用户登录的模拟程序。文件较多。
? ? ? ? ?

login.html 登录表单 DoLogin.java 处理登录动作的 Servlet LoginSuccess.java 用于显示登录成功信息的 Servlet SessionTest.java 登录后的处理程序 DoLogout.java 注销的处理程序

为了演示 request、application、session 各个作用域的使用方法, Servlet 之间进行了数据传递,数据传递方式如下: 数据产生 数据接受 数据内容 作用域 request session

DoLogin LoginSuccess 登录时间 DoLogin SessionTest 登录用户名

DoLogin SessionTest 系统登录次数 application

访问 http://localhost:8080/LearnJSP/sessiontest,登录时输入用户名 charlee 和密码 123456 即可。 session-test.zip

(8)Filter 的应用
Servlet 有一个很有意思也很有用的功能,就是 Filter。所谓 Filter,就是在 用户请求到达 Servlet 之前、或者 Servlet 执行之后,执行的一段小程序,这 段程序可以对用户请求做预处理, 或者对 Servlet 返回的结果进行一些公用处理。 Filter 可以在请求到达 Servlet 之前执行,甚至即使请求一个静态页面或图片 等,Filter 也会被优先执行。这样我们可以通过 Filter 对应用程序内的所有对 象(包括 Java 程序和静态内容)进行预处理。(这个功能恐怕 PHP 程序就无法 做到了。) Filter 通常可用于以下几种情况:
? ? ? ? ?

认证 记录访问日志 加密解密 字符编码转换 数据压缩

如上面最常用的“认证”,可以在 Filter 中书写认证代码,这样不仅省却了在 Servlet 中认证的麻烦,而且还能控制网站中静态内容的访问。 Filter 是个接口,位于 javax.servlet.Filter。它与其他接口的关系如下:

我们在书写自己的 Filter 时,只需写一个类实现 Filter 接口即可。 实现 Filter 接口需要实现以下几个方法:

void init(FilterConfig filterConfig) throws ServletException Filter 的初始化方法。 void destroy() Filter 结束之前执行的方法。 void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException Filter 的执行内容。 参数 request 和 response 分别为输入和输出参数, 而 chain 则为 Filter 链对象。 所谓 FilterChain,一个应用程序内的 Filter 可以有多个,它们像链子一样串 在一起,其中的某个 Filter 执行之后,可以调用 chain.doFilter(request, response)将执行权转给下一个 Filter,直到所有的 Filter 都执行完毕。 这次的示例程序我们修改了上一节的登录程序,为它增加了一个下载链接(详见 SessionTest.java)。 这个下载链接指向 img/sample.jpg。我们希望能通过一个 Filter,在用户试图下载 img/sample.jpg 时验证用户身份,如果验证失败,则 禁止用户下载,并跳转到登录页面。 创建 Filter 时可惜不能像 Servlet 那样,直接从右键菜单中选择新建,而只能 先写好源代码然后手工添加到 web.xml 中。如下图,在新建类时注意要实现 javax.servlet.Filter 接口。

写完代码之后,打开 web.xml 文件,手工添加 Filter。与 Servlet 类似,你需 要添加 和 两个标记。这里我们要对 /img/ 下的所有文件进行登录验证,因此 的 url-pattern 处我们填写了 /img/* 。

最后执行,访问 /LearnJSP/img/sample.jpg ,就会跳转到登录页面。登录之后 再次访问上面的链接,才能看到正确的图片。 servlet-filter.zip


Servlet、JSP学习笔记.doc

ServletJSP学习笔记 - JSP,JAVA,入门教程~~~... ServletJSP学习笔记_互联网_IT/计算机_专业资料。JSP,JAVA,入门教程~~~ Servlet/JSP 学习笔记 (1)tomcat 和...

head first servlet&jsp学习笔记.doc

head first servlet&jsp学习笔记_IT/计算机_专业资料。head first servlet&jsp个人学习笔记。 一、 为什么使用 Servlet&JSP:简介 简介 1、 web 服务器做些什么? ...

韩顺平jsp学习笔记.doc

韩顺平jsp学习笔记 - 韩顺平 jsp 学习笔记 jsp u j2ee 核心 13 种技术: 程序员必须掌握的技术:java,servlet,jsp。 13 种技术规范. u j2ee 程序...

jsp学习笔记.doc

jsp学习笔记 - java之jsp学习笔记,隐藏对象详解... jsp学习笔记_计算机软件及应用_IT/计算机_专业资料。java...</servlet> execption Throwable 只有当页面 <%@ page...

学习JSP和servlet程序设计心得体会.doc

学习JSPservlet程序设计心得体会 - 学习 JSP 程序设计和 Servlet 心得体会 JSP 这门课是教我们怎么做网站的,学习了许多 枯燥的语言知识,总算是可以自己做网站了 ...

jsp学习笔记(初级).doc

jsp学习笔记(初级) - MVC: JSP + servlet + javab

Jsp学习心得体会.txt

Jsp学习心得体会 - Jsp学习心得体会 杨双燕 JSP的工作原理 在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet。(Se...

蓝桥班servlet_jsp笔记心得.doc

蓝桥班servlet_jsp笔记心得_计算机软件及应用_IT/计算机_专业资料。帮助自学软件...JSP Servlet学习笔记 146页 2下载券 servlet_jsp笔记综合 20页 免费 servlet...

servlet+jsp笔记.doc

servlet+jsp笔记_IT/计算机_专业资料。servlet+jsp学习基础知道介绍 1. tomcat 配置 a) 在 server.xml 下面 改端口号,80 默认可以在浏览器中不用写 b) 在 ...

Servlet_Jsp笔记_图文.doc

Servlet_Jsp笔记 - Servlet_JSP 笔记 1servlet 1.1 第一个 servlet 1.普通的 java 类 2.继承 javax.servlet.http 包中的...

Servlet&JSP课后练习题解析.doc

Servlet&JSP课后练习题解析 - Servlet&JSP 课后练习题解析 第 1 章课后练习 ? 选择题 1. 以下何者适合使用 GET 请求来发送? (A) 使用者名称、密码 (B)...

ServletJSP笔记.doc

ServletJSP笔记 - Servlets JSP 动态页面技术:Cgi,Asp,php Servlet 就是 java 用来接收 http 请求和返回响应的接口,静态页面直接就用 Web ...

JSP学习心得.doc

JSP学习心得_学习总结_总结/汇报_实用文档。JSP 学习心得计科:1301 学号:...JSP 根据 Servlet API 规范提供了 某些内置对象, 开发者不用事先声明就可以...

韩顺平servlet笔记(必看完整版).doc

韩顺平servlet笔记(必看完整版)_工学_高等教育_教育专区。韩顺平老师2011年Servlet...在服务端 ④ serlvet 功能强大,几乎可以完成网站的所有功能 ⑤ 是学习 jsp ...

韩顺平 细说servlet 笔记 完整版.doc

韩顺平 细说servlet 笔记 完整版_计算机软件及应用_IT/计算机_专业资料。韩顺平...在服务端 ④ serlvet 功能强大,几乎可以完成网站的所有功能 ⑤ 是学习 jsp ...

jsp与Servlet结合案例详解.pdf

jspServlet结合案例详解 - 1.案例创建步骤 (1)创建web应用,

理论_Servlet+JSP+MVC笔记.doc

理论_Servlet+JSP+MVC笔记 - 成 绩 批阅教师 日期 Taren

07_Servlet(JSP J2ee学习课件 自学教程)_图文.pdf

07_Servlet(JSP J2ee学习课件 自学教程)_计算机软件及应用_IT/计算机_专业资料...韩顺平 课件 笔记 j2ee视... 31页 2下载券 2017 Baidu 使用百度前必读 ...

JSP学习心得.pdf

JSP 学习心得 下面是本人在学习 JSP 时的一些心得: 一、JSP 工作原理 在一个 JSP 文件第一次被请求时,JSP 引擎把该 JSP 文件转换成为一个 servlet。而这个...

ServletJSP深入详解:基于Tomcat的Web开发 第一章(全)(....doc

ServletJSP深入详解:基于Tomcat的Web开发 第一章(全)(格式已整理)_IT/计算机_专业资料。ServletJSP深入详解:基于Tomcat的Web开发 第一章(全) 格式经过整理。 ...