没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
30页
Servlet 是一种服务器端的编程语言,是J2EE 中比较关键的组成部分,Servlet 技术的推出,扩展了 Java 语言在服务器端开发的功能,巩固了Java 语言在服务器端开发中的地位,而且现在使用非常广泛的 JSP 技术也是基于Servlet 的原理,JSP+JavaBeans+Servlet 成为实现MVC 模式的一种有效的选择。在本 章中将介绍Servlet 的基础知识,并通过具体的示例介绍Servlet 的强大功能。
资源推荐
资源详情
资源评论
第 5 章 Servlet 技术基础知识
Servlet 是一种服务器端的编程语言,是 J2EE 中比较关键的组成部分,Servlet 技术的推出,扩展了
Java 语言在服务器端开发的功能,巩固了 Java 语言在服务器端开发中的地位,而且现在使用非常广泛的
JSP 技术也是基于 Servlet 的原理,JSP+JavaBeans+Servlet 成为实现 MVC 模式的一种有效的选择。在本
章中将介绍 Servlet 的基础知识,并通过具体的示例介绍 Servlet 的强大功能。
5.1 Servlet 简介
Servlet 在本质上就是 Java 类,编写 Servlet 需要遵循 Java 的基本语法,但是与一般 Java 类所不同的
是,Servlet 是只能运行在服务器端的 Java 类,而且必需遵循特殊的规范,在运行的过程中有自己的生
命周期,这些特性都是 Servlet 所独有的。另外 Servlet 是和 HTTP 协议是紧密联系的,所以使用 Servlet
几乎可以处理 HTTP 协议各个方面的内容,这也正是 Servlet 收到开发人员青睐的最大原因。
5.1.1 Servlet 的工作原理
Servlet 需要在特定的容器中才能运行,在这里所说的容器即 Servlet 运行的时候所需的运行环境,
一般情况下,市面上常见的 Java Web Server 都可以支持 Servlet,例如 Tomcat、Resin、Weblogic、WebSphere
等,在本书中采用 Tomcat 作为 Servlet 的容器,由 Tomcat 为 Servlet 提供基本的运行环境。
Servlet 容器环境在 HTTP 通信和 web 服务器平台之间实现了一个抽象层。Servlet 容器负责把请求
传递给 Servlet,并把结果返回结客户。容器环境也提供了配置 Servlet 应用的简单方法,并且也提供用
XML 文件配置 Servlet 的方法。当 Servlet 容器收到对用户对 Servlet 请求的时候,Servlet 引擎就会判断
这个 Servlet 是否是第一次被访问,如果是第一次访问,Servlet 引擎就会初始化这个 Servlet,即调用 Servlet
中的 init()方法完成必要的初始化工作,当后续的客户请求 Servlet 服务的时候,就不再调用 init()
方法,而是直接调用 service()方法,也就是说每个 Servlet 只被初始化一次,后续的请求只是新建一
个线程,调用 Servlet 中的 service()方法。
在使用 Servlet 的过程中,并发访问的问题由 Servlet 容器处理,当多个用户请求同一个 Servlet 的时
候,Servlet 容器负责为每个用户启动一个线程,这些线程的运行和销毁由 Servlet 容器负责,而在传统
的 CGI 程序中,是为每一个用户启动一个进程,因此 Servlet 的运行效率就要比 CGI 的高出很多。
5.1.2 Servlet 的生命周期
Servlet 是运行在服务器端的程序,所以 Servlet 的运行状态完全由 Servlet 容器维护,一个 Servlet 的
生命周期一般有三个过程。
1.初始化
当一个 Servlet 被第一请求的时候,Servlet 引擎就初始化这个 Servlet,在这里是调用 init()方法完
成必需的初始化工作。而且这个对象一致在内存中活动,Servlet 为后续的客户请求新建线程,直接调用
Servlet 中的 service()方法提供服务,不再初始化 Servlet。
2.提供服务
当 Servlet 对象被创建以后,就可以调用具体的 service()方法为用户提供服务。
3.销毁
Servlet 被初始化以后一直再内存中保存,后续的访问可以不再进行初始化工作,当服务器遇到问题
需要重新启动的时候,这些对象就需要被销毁,这时候 Servlet 引擎就会调用 Servlet 的 destroy()方法
把内存中的 Servlet 对象销毁。
5.1.3 简单 Servlet 开发配置示例
Java Servlet API 包括两个基本的包,javax.servlet 和 javax.servlet.http,其 中 javax.servlet 提供了用来
控制 Servlet 生命周期所需的类和接口,是编写 Servlet 必需要实现的。javax.servlet.http 提供了处理与HTTP
相关操作的类和接口,每个 Servlet 必需实现 Servlet 接口,但是在实际的开发中,一般情况都是通过继
承 javax.servlet.http.HttpServlet 或者 javax.servlet.GenericServlet 来间接实现 Servlet 接口。
下面这个简单的示例程序就是继承了 javax.servlet.http.HttpServle,从而实现 Servlet 接口,具体的代
码如下。
//--------文件名:HelloWorld.java--------------------
package servlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
在上面这个简单的示例程序中,继承了 HttpServlet,而 HttpServlet 是一个实现了 Servlet 接口的类,
所以这个 Servlet 就间接地实现了 Servlet 的接口,从而可以使用接口提供的服务。
在这个程序中,并没有具体的 init()方法和 destroy()方法,这里使用 Servlet 容器默认的方式对
这个 Servlet 进行初始化和销毁动作,而在这里的 doGet()方法就是具体的功能处理方法,这个方法可
以对以 get 方法发起的请求进行处理,在这里这个方法的功能就是打印出一个 HTML 页面。
上面这个程序编译以后会生成对应的 Servlet 类文件,把编译生成的类文件拷贝到当前应用项目的
WEB-INF/classes 文件夹中,Servlet 引擎会到这个目录下面寻找 Servlet 的类文件。这里需要注意,如果
Servlet 有包名,这时候把需要把整个包拷贝,而不是仅仅拷贝类文件。负责 Servlet 引擎就会找不到 Servlet
类文件
Servlet 引擎需要通过配置文件来找到具体的 Servlet,在一般情况下都需要在当前应用项目的
web.xml 配置文件中对各个 Servlet 进行配置,其中 web.xml 文件的位置在当前项目应用的 WEB-INF 文
件夹下。对于上面这个简单的 Servlet 示例,可以在 web.xml 中进行如下的配置。
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>servlets.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
对于每一个 Servlet 都需要像上面这样的配置信息,这时 Servlet 引擎初始化 Servlet 所必需的信息,
这个配置信息可以分为两个部分,第一部分是配置 Servlet 的名称和类,第二部分是配置 Servlet 的访问
路径,其中<servlet-name>是这个 Servlet 的名称,这个名字可以任意命名,但是要和<servlet-mapping>
节点中的<servlet-name>保持一致,<servlet-class>是 Servlet 对应类的路径,在这里要注意,如果有 Servlet
带有包名,一定要把包路径写全,否则 Servlet 引擎就找不到对应的 Servlet 类。<servlet-mapping>节点是
对 Servlet 的访问路径进行配置,<url-pattern>定义了 Servlet 的访问路径。
经过上面的步骤,就可以使用类似 http://localhost:8080/chapt5/HelloWorld
这样的网址访问这个
Servlet,其中 http://localhost:8080/
是本机 Tomcat 服务器的访问地址,chapt5 是当前应用项目的名称,
HelloWorld 是 Servlet 的访问路径,当 Servlet 引擎接收到这样的请求的时候,就会初始化 HelloWorld 这
个 Servlet,然后调用其中的方法为用户提供服务。
上面这个简单的示例程序的运行效果如图 5.1 所示。
图 5.1 HelloWorld 示例程序运行效果
总之,编写一个 Servlet 要经过以下几个步骤。
(1)编写 Servlet 的功能代码,即实现功能的代码类。
(2)把编译成功的 Servlet 功能代码类文件拷贝到当前应用项目的 WEB-INF/classes 目录下。
(3)在当前应用项目的 web.xml 文件中对 Servlet 进行配置,即在 web.xml 中添加配置信息。
经过这样三个步骤就可以通过浏览器访问这个 Servlet。
注意:Servlet 的配置信息需要添加在<web-app></web-app>标签之间。
5.1.4 使用 Servlet 实现 MVC 开发模式
Java 语言之所以受到开发人员支持,是因为 Java 语言实现科学方便的开发模式,在这些开发模式中,
最出色而且应用最广的就是 MVC 模式,对于 MVC 模式的研究由来已久,但是一直没有得到很好的推
广和应用,随着 J2EE 技术的成熟,MVC 逐渐成为了一种常用而且重要的设计模式。
MVC(Model-View-Controller)把应用程序的开发分为三个层面:视图层、控制层、模型层。其中
视图层负责从用户获取数据和向用户展示数据,在这层中不负责对业务逻辑的处理和数据流程的控制。
而模型层负责处理业务逻辑和数据库的底层操作,其中视图层和模型层之间没有直接的联系。控制层主
要负责处理视图层和模型层的交互,控制层从视图层接收请求,然后从模型层取出对请求的处理结果,
并把结果返回给视图层。在控制层中只负责数据的流向,并不涉及具体的业务逻辑处理。
MVC 三层结构的内部关系如图 5.2 所示。
图 5.2 MVC 三层结构的内部关系
从图 5.2 中可以看出,Servlet 在 MVC 开发模式中承担着重要的角色,在 MVC 结构中,控制层就
是依靠 Servlet 实现,Servlet 可以从浏览器端接收请求,然后从模型层取出处理结果,并且把处理结果
返回给浏览器端的用户。在整个结构中,Servlet 负责数据流向控制的功能。
虽然现在用很多开源框架都很好的实现了 MVC 的开发模式,例如 Struts、WebWork 等,这些开源
框架对 MVC 的实现都是非常出色的,在这些框架中,处理数据控制流向的时候,采用的还是 Servlet,
例如在 Struts 中,对应每一个用户请求都有一个 Action,这个 Action 就是继承了 Servlet 的类,所以在
MVC 架构中,Servlet 是不可替代的。
5.2 JSP 页面调用 Servlet 的方法
在上面 HelloWorld 的示例程序中,我们直接在浏览器中输入具体的地址进行访问,在实际的应用中,
不可能让用户在浏览器中直接输入 Servlet 的地址进行访问,一般情况下,可以通过调用 Servlet 进行访
问,在这里介绍通过提交表单和超链接两种方式调用 Servlet。
5.2.1 通过表单提交调用 Servlet
在通过提交表单调用 Servlet 的时候,只需要把表单的 action 指向对应的 Servlet 即可,下面是一个
简单的表单,通过这个表单可以调用指定的 Servlet。
//--------文件名:form.jsp--------------------
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>Servlet接收表单示例</title>
</head>
<body>
<font size="2">
<form action="AcceptForm" method="post">
姓名:<input type="text" name="name"/><br>
省份:<input type="text" name="province"><br>
<input type="submit" value="提交">
</form>
</font>
</body>
</html>
在上面这个表单中,指明表单的处理程序是 AcceptForm 这个 Servlet,下面是 AcceptForm 这个 Servlet
的具体代码。
//--------文件名:AcceptForm.java--------------------
package servlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AcceptForm extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String province = request.getParameter("province");
out.println("<font size='2'>");
out.print("提交的表单内容为:<br>");
out.print("姓名:" + name + "<br>");
out.print("省份:" + province + "<br>");
out.print("</font>"); }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
}
在上面这个 Servlet 中,只对 doGet()方法进行重写,在 doPost()方法中直接调用 doGet()方
法的具体内容。
下面来介绍这个 Servlet 的关键代码。
response.setContentType("text/html");
上面这行代码设置了服务器响应的内容格式为 HTML 文档格式。
response.setCharacterEncoding("gb2312");
这里设置服务器响应内容的字符编码格式为 gb2312。用来支持中文显示。
PrintWriter out = response.getWriter();
剩余29页未读,继续阅读
资源评论
- tk9811420252014-09-24很基础 很好用
fabbymee
- 粉丝: 44
- 资源: 69
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功