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、接着会弹出如下窗口:
( 注意!这里版本选择 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
- 根据请求中的Host头,伙子浏览器访问的是哪个虚拟主机
localhost
- 根据请求行中的资源路径获知浏览器访问的是哪个Web服务
/Hello
- 根据请求行中的资源路径获知浏览器访问的是哪个资源
/HelloServlet
- 到
web.xml
路径中匹配,匹配获得真实路径
∗∗Servlet调用过程图∗∗
<mark>不包括发送给JSP</mark>
-
获取请求
-
生成响应
7.5扩展内容
7.5.1 配置Target runtime(Web项目运行环境) - 【未完】
1、如果在创建Web项目时,Target runtime选项中没有配置可选的服务器,可以点击右面的选项进行配置
7.5.2 修改Servlet模版
- 修改 Eclipse 提示模板 - Templates - https://blog.csdn.net/LawssssCat/article/details/103509831
通过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();