7 Servlet



7.1 Servlet概述

7.1.1 什么是 Servlet?

Servlet:Server Applet 服务器端程序
本质上是一段 Java 程序,Servlet 中通常没有 main 函数,
Servlet 必须要放在服务器中,由服务器调用才能执行!
(必须实现一个接口,实现一个service)

Servlet是SUN公司提供的一门<mark>动态Web资源开发</mark>技术
Servlet: Server Applet: 服务器端的Java程序
Servlet本质上就是一段Java程序,和普通的Java程序不同是,Servlet程序无法独立运行,必须将Servlet程序放在服务器中,由服务器调用才可以执行!!

  • <mark>静态Web资源</mark>: 任何人在任何条件下访问的效果都是相同的,这种叫做静态Web资源,
    html、css、js、flash
  • <mark>动态Web资源</mark>: 在不同的条件下访问时,看到的是不同的效果。
    Servlet、JSP、PHP、.NET

7.1.2 Servlet 作用是什么?

运行在服务器端的 Servlet 程序,作用是什么?

  • <mark>Servlet 擅长</mark> - 对服务器收到的请求做出处理!
  • <mark>JSP 擅长</mark> - 处理网页 - 所以Servlet把结果交给JSP

总结:运行在服务器中的Servlet程序的作用是:
在服务器将请求接收过来后,对请求进行处理,即处理请求!


7.2 开发Servlet程序

7.2.1 开发Servlet程序的步骤

  • 第一步: 写一个类,实现一个Servlet接口,并实现其中的方法
    直接实现Servlet接口或者实现该接口的子类。
    {
    MyServlet implements Servlet

    A implements Servlet
    实现A
    B extends A
    }
  • 第二步: 在web应用的web.xml文件中配置Servlet程序对外访问的路径。

7.2.2使用Eclipse创建Web项目


以上是Web项目在工程视图(Project)和包视图(package)下结构,推荐使用包视图!

  • 1、创建一个Web工程: 在左侧窗口中, 点击鼠标右键 —> New —> Dynamic Web Project。
  • 2、接着会弹出如下窗口:
    <mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{注意!} 这里版本选择 2.5,否则后面没有 web.xml
    (这里用 web.xml 方便入门 )

注意:

  • 3.0版本不会创建web.xml文件, 并且创建Servlet时也不会在web.xml文件中生成Servlet相关的配置信息, <mark>记得改为2.5</mark>。
  • Target runtime选项中如果没有可选的服务器,可点击右侧的"New Runtime…"进行配置。

详细操作步骤在《5.2配置Target runtime(Web项目运行环境)》

7.2.3 使用Eclipse创建Servlet

  • 1、选中项目中的src目录,鼠标右键 —> New —> Servlet
  • 2、在弹出的窗口中,根据提示填写内容:
  • 3、点击finish即可完成Servlet创建过程, 创建好的Servlet如下:

通过Eclipse创建Servlet,默认继承HttpServlet。
由于HttpServlet也是Servlet接口的子类,让HelloServlet继承HttpServlet,相当于间接实现了Servlet接口。

<mark>继承HttpServlet类</mark>,<mark>默认会覆盖doGet方法和doPost方法</mark>,
两个方法的作用为:

  • doGet方法:当浏览器发送请求的方式为GET提交时, 将会调用doGet方法来处理请求
  • doPost方法:当浏览器发送请求的方式为POST提交时, 将会调用doPost方法来处理请求

提示:
如果当GET提交和POST提交处理代码相同时,可以将代码写在其中一个方法里
(例如写在doGet中),并在另外一个方法(例如doPost)中调这个方法。
这样一来,不管是GET提交还是POST提交,最终doGet方法都会执行,都会对请求进行处理!!

7.2.4 Servlet在web.xml中的配置

在通过Eclipse创建Servlet时,会自动在web.xml文件中进行Servlet相关信息的配置
(注意:<mark>如果是复制Servlet类文件,但配置信息不会跟着复制,需要自己手动添加配置,否则复制的Servlet将无法访问!</mark>)
(<mark>注意:如果是修改了 Servlet 类的名字,配置信息也不会跟着修改,需要自己手动到 web.xml 文件中进行修改,否则 Servlet 将无妨访问!</mark>)

  <servlet>
  <!-- servlet中的name和servlet-mapping中的name必须一样! -->
    <servlet-name>HelloServlet</servlet-name>
    <!-- Web 程序中的 类(包)路径 -->
    <servlet-class>com.tedu.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <!-- 浏览器中的访问 路径 -->
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

关于上面的配置信息:

  • Eclipse每创建一个Servlet, 就会在 web.xml 文件(<mark>2.5版本</mark>)中<mark>添加两个标签</mark>:

    • <servlet>
    • <servlet-mapping>
    • (可以将这两个标签看成一个组的标签)
  • <servlet><servlet-mapping>标签内都会有一个<servlet-name>标签
    标签的内容可以更改,
    <mark>但要求更改后的这两个<servlet-name>标签的内容也必须一致</mark>。

  • <servlet-class>标签用于配置Servlet类的<mark>全路径名(即包名+类名)</mark>
    <mark>需要注意</mark>:
    <mark>如果在创建Servlet后修改了Servlet类的名称,这个地方也要一起更改,否则将会出现"ClassNotFoundException" 即类找不到异常</mark>

  • <url-pattern>标签用于配置浏览器以什么路径访问当前Servlet
    (即Servlet对外访问的路径),
    默认的路径是:/类名
    例如:
    上面为HelloServlet配置的<url-pattern>为 /HelloServlet,因此我们在浏览器中的访问路径则为:
    http://主机名/web项目访问路径/HelloServlet

7.2.5 运行Servlet程序、访问测试

  • 访问Servlet方式一
    若是<mark>第一次运行</mark>,需要先创建tomcat服务器,即在Servers窗口中点击链接可创建一个tomcat服务器,且只需创建一次即可!
    (1)在服务器上右键 --> 点击 “add and remove” 将当前web项目发布到服务器中,并点击完成。
    (2)启动tomcat服务器:在服务器上右键 Start 即可启动服务器
    (3)打开本地浏览器,通过路径访问:http://localhost:8080/项目名称/HelloServlet即可访问Servlet程序

  • 访问Servlet方式二
    (1) 在运行的Servlet上点击右键 —> “Run As” —> “1 Run on Server”

    (2) 在弹出的窗口中,直接点击完成即可!!!

    (3) 运行结果如下:

    或者打开浏览器,复制上图中的路径:
    http://localhost:8080/Hello/HelloServlet,粘贴到浏览器的地址栏中,回车访问:

7.2.6 Eclipse默认发布Web应用的位置

<mark>Tomcat服务器中默认只有一台虚拟主机,叫做localhost主机</mark>
<mark>而localhost主机发布web应用的位置是webapps</mark>。
将day09发布到localhost主机中,<mark>但为什么day09目录没有在webapps目录下</mark>?

  • <mark>默认情况</mark>下,发布一个Web应用到localhost主机中, 只需要将Web应用的目录拷贝到webapps目录下即可完成发布!
  • 而将Eclipse和Tomcat<mark>整合之后</mark>,通过Eclipse发布一个web应用到tomcat服务器中,发布的路径默认被改成了:
    [workspace]\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

如果要修改Eclipse默认发布Web应用的目录位置:

  • <mark>关闭服务器</mark>,将服务器中的<mark>所有应用移除</mark>
  • 在服务器上右键 --> clean
  • 双击tomcat服务器,在弹出窗口中找到 Server location, 选择第二个选项
  • 并将下方的Deploy Path改为: webapps

改完后,Ctrl+s保存配置即可!!

7.2.7 Eclipse如何发布一个Web应用

当通过eclipse将day09项目发布到服务器中,
是直接将day09拷贝到服务器中对应的目录下吗?

发布的过程如下:



7.3 Servlet继承关系

Servlet接口 -- 定义了一个Servlet应该具备哪些功能
	|
	|-- GenericServlet抽象类,实现了Servlet接口,
		并且实现了接口中大部分的方法,
		但是没有实现service,
		service方法是处理请求的核心方法,应该由开发人员自己来实现!
			|
			|-- HttpServlet抽象类,继承了GenericServlet,并且实现了
					service方法,在service方法中,
					判断请求方式,
					根据不同的请求方式,调用不同的doXxx方法。
					|
					|-- ??? extend HttpServlet
						因此在开发中,我们只需要写一个类,继承HttpServlet,
						重写父类中的doGet方法和doPost方法。

当浏览器访问一个Servlet时,
首先调用Servlet类的service方法
(从<mark>HttpServlet类</mark>中继承过来的),
<mark>根据请求方式调用对应的doGet方法或者doPost方法</mark>,
对请求进行处理!



7.4 Servlet 调用过程

通过浏览器访问服务器中的一个Servlet程序,这个Servlet程序是如何执行的?
又是如何被调用的?

localhost/Hello/HelloServlet

  1. 根据请求中的Host头,伙子浏览器访问的是哪个虚拟主机
    localhost
  2. 根据请求行中的资源路径获知浏览器访问的是哪个Web服务
    /Hello
  3. 根据请求行中的资源路径获知浏览器访问的是哪个资源
    /HelloServlet
  4. web.xml路径中匹配,匹配获得真实路径

<mstyle mathcolor="&#35;f01"> S e r v l e t </mstyle> \color{#f01}{**Servlet调用过程图**} Servlet

<mark>不包括发送给JSP</mark>

  1. 获取请求

  2. 生成响应



7.5扩展内容

7.5.1 配置Target runtime(Web项目运行环境) - 【未完】

1、如果在创建Web项目时,Target runtime选项中没有配置可选的服务器,可以点击右面的选项进行配置

7.5.2 修改Servlet模版

通过Eclipse可以直接创建一个Servlet类,这相比通过记事本等文本编辑工具创建Servlet,可以节省配置Servlet的时间,提高了我们的开发效率。
但是通过Eclipse生成的Servlet类中包含了许多我们不需要的注释和默认实现代码,这些每次都删除也非常占用时间。
接下来可以通过添加模版代码的形式,来生成Servlet的内容,以便于提高我们的开发效率。

7.5.3 tomcat右键选项介绍 - 【未完】

7.5.4 FAQ常见问题 - 【未完】



7.6 request和response介绍

当浏览器<mark>请求</mark>服务器
服务器在<mark>接收</mark>请求后,
调用 servelet 实例的 <mark>service 方法</mark>之前,
会创建 <mark>request</mark> 和 <mark>response</mark> 对象。

将解析后的请求信息(请求行、请求头、请求实体)封装到requeset 对象中。
将 request 和 response 传递给 service 方法,用于处理请求

  • request 是代表 Http 请求信息的对象,
    其中封装了浏览器向服务器发送的请求信息,将request传递给service方法,在处理请求的过程中,可以通过request对象获取请求相关的信息。
  • response对象是代表Http响应信息的对象 ,
    其中将会封装服务器向浏览器做出的响应信息,将response传递给service方法,在处理请求的过程中,如果有任何数据要发送给浏览器,可以通过response获取流进行发送。
    response.getWriter();
    response.getOutputStream();