文章目录
-
- 第1章 我们为什么需要Servlet?
- 什么是Servlet?
- 如何使用Servlet?
- Servlet生命周期(重要)
- Servlet生命周期的主要过程
- Servlet的两个重要接口
- ServletConfig接口
- ServletContext接口
- Servlet技术体系
- Servlet接口
- GenericServlet抽象类
- HttpServlet抽象类
- request【请求】与response【响应】对象
- 其它几个重要的接口
- 7.2 HttpServletResponse接口
- 请求的转发与重定向
- 请求的转发
- 请求的重定向
- 对比请求的转发与重定向
- 请求与响应中的字符编码设置
- - 解决请求乱码
- - GET请求
- - POST请求
- - 解决响应乱码
- Web应用路径设置
- 基于JavaEE6及以上版本【web3.0】,创建Servlet
第1章 我们为什么需要Servlet?
什么是Servlet?
- 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案。而具体的Servlet容器负责提供标准的实现。
- 从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了Servlet接口的实现类。
- Servlet(Server Applet)作为服务器端的一个组件,它的本意是“服务器端的小程序”。
- Servlet的实例对象由Servlet容器负责创建;
- Servlet的方法由容器在特定情况下调用;
- Servlet容器会在Web应用卸载时销毁Servlet对象的实例。
web.xml:web应用部署描述符,主要用于各种web组件的注册。
如何使用Servlet?
操作步骤
-
复习:使用一个接口的传统方式:
- 创建一个类实现接口
- new 实现类的对象
- 调用类的方法等
-
使用Servlet接口的方式:
① 搭建Web开发环境
② 创建动态Web工程
③ 创建javax.servlet.Servlet接口的实现类:com.atguigu.servlet.MyFirstServlet
④ 在service(ServletRequest, ServletResponse)方法中编写如下代码,输出响应信息:
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//1.编写输出语句,证明当前方法被调用
System.out.println("Servlet worked...");
//2.通过PrintWriter对象向浏览器端发送响应信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response");
writer.close();
}
⑤ 在web.xml配置文件中注册MyFirstServlet
servlet对象是由servlet容器 创建的不是我们创建的所以要给出全类名 交给tomcat去反射创建
<!-- 声明一个Servlet,配置的是Servlet的类信息 -->
<servlet>
<!-- 这是Servlet的别名,一个名字对应一个Servlet。相当于变量名 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- Servlet的全类名,服务器会根据全类名找到这个Servlet -->
<servlet-class>com.atguigu.servlet.MyFirstServlet</servlet-class>
</servlet>
<!-- 建立Servlet的请求映射信息 -->
<servlet-mapping>
<!-- Servlet的别名,说明这个Servlet将会响应下面url-pattern的请求 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- Servlet响应的请求路径。如果访问这个路径,这个Servlet就会响应 -->
<url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>
说明:
:这个url-pattern可以配置多个,这时表示的就是访问这些url都会触发这个Servlet进行响应,运行浏览器,访问刚才配置的url路径,Servlet的service方法就会被调用。
中的文本内容必须以 / 或 *. 开始书写路径。相当于将资源映射到项目根目录下形成虚拟的资源文件。
中的可以声明多个,可以通过任意一个都可以访问。但是开发中一般只会配置一个。
⑥ 在WebContent目录下创建index.html
⑦ 在index.html中加入超链接 <a href=“MyFirstServlet”>To Servlet
⑧ 点击超链接测试Servlet
运行分析(执行原理)
- index.html
Servlet作用总结
-
接收请求 【解析请求报文中的数据:请求参数】
-
处理请求 【DAO和数据库交互】
-
完成响应 【设置响应报文】
Web服务器 如 tomcate
Servlet生命周期(重要)
4.1 Servlet生命周期概述
- 应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同状态和不同行为——这就是对象的生命周期。
- 简单的叙述生命周期,就是对象在容器中从开始创建到销毁的过程。
4.2 Servlet容器
Servlet对象是Servlet容器创建的,生命周期方法都是由容器调用的。这一点和我们之前所编写的代码有很大不同。在今后的学习中我们会看到,越来越多的对象交给容器或框架来创建,越来越多的方法由容器或框架来调用,开发人员要尽可能多的将精力放在业务逻辑的实现上。
Servlet生命周期的主要过程
① Servlet对象的创建:构造器
- 默认情况下,Servlet容器第一次收到HTTP请求时创建对应Servlet对象。
- 容器之所以能做到这一点是由于我们在注册Servlet时提供了全类名,容器使用反射技术创建了Servlet的对象。
② Servlet对象初始化:init()
- Servlet容器**创建Servlet对象之后,会调用init(ServletConfig config)**方法。
- 作用:是在Servlet对象创建后,执行一些初始化操作。例如,读取一些资源文件、配置文件,或建立某种连接(比如:数据库连接)
- init()方法只在创建对象时执行一次,以后再接到请求时,就不执行了
- 在javax.servlet.Servlet接口中,public void init(ServletConfig config)方法要求容器将ServletConfig的实例对象传入,这也是我们获取ServletConfig的实例对象的根本方法。
③ 处理请求:service()
- 在javax.servlet.Servlet接口中,定义了**service(ServletRequest req, ServletResponse res)**方法处理HTTP请求。
- 在每次接到请求后都会执行。
- 上一节提到的Servlet的作用,主要在此方法中体现。
- 同时要求容器将ServletRequest对象和ServletResponse对象传入。
④ Servlet对象销毁:destroy()
- 服务器重启、服务器停止执行或Web应用卸载时会销毁Servlet对象,会调用public void destroy()方法。
- 此方法用于销毁之前执行一些诸如释放缓存、关闭连接、保存内存数据持久化等操作。
Servlet请求过程
- 第一次请求
- 调用构造器,创建对象
- 执行init()方法
- 执行service()方法
- 后面请求
- 执行service()方法
- 对象销毁前
- 执行destroy()方法
当Servlet第一次接收请求时,Servlet容器【web容器|web服务器】创建Servlet【执行构造器】,之后执行init()方法,进行初始化操作。最后执行service()方法,处理请求,做出响应。【以后再次接收请求,只执行service()方法】。当关闭或重启服务器时,执行destroy()方法,销毁Servlet。
<!--设置Servlet创建时机:启动服务器时创建Servlet 不配置的话是第一次访问时创建
index:设置Servlet被创建优先级【int类型且正整数,最小值1】
数值越小,优先级越高
-->
<load-on-startup>1</load-on-startup>
此时,Servlet生命周期,如下调整
- 构造器执行时机为:启动服务后,执行
- init()执行时机为:启动服务器,执行构造器后,执行。
- 其他方法,无变化。
Servlet的两个重要接口
ServletConfig接口
-
ServletConfig接口封装了Servlet配置信息,这一点从接口的名称上就能够看出来。
-
每一个Servlet都有一个唯一对应的ServletConfig对象,代表当前Servlet的配置信息。
-
对象由Servlet容器创建,并传入生命周期方法init(ServletConfig config)中。可以直接获取使用。
-
代表当前Web应用的ServletContext对象也封装到了ServletConfig对象中,使ServletConfig对象成为了获取ServletContext对象的一座桥梁。
-
ServletConfig对象的主要功能
-
获取Servlet名称:getServletName()
-
获取全局上下文ServletContext对象:getServletContext()
-
获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。
-
使用如下:
-
通过String info = config.getInitParameter(“url”);的方式获取value值
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/dbname</param-value>
</init-param>
在 init中 只能测试一次
于是
package com.edu.shengda.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class MyFirstServlet implements Servlet {
//把ServletConfig config 从init方法中的局部变量 变为全局变量
private ServletConfig servletConfig;
@Override
public void init(ServletConfig config) throws ServletException {
/*
//1.获取ServletContext对象
ServletContext context = config.getServletContext();
//2.获取index.html的本地路径
//index.html的虚拟路径是“/index.html”,其中“/”表示当前Web应用的根目录,
//即WebContent目录
String realPath = context.getRealPath("/index.html");
//realPath=D:\DevWorkSpace\MyWorkSpace\.metadata\.plugins\
//org.eclipse.wst.server.core\tmp0\wtpwebapps\MyServlet\index.html
System.out.println("realPath="+realPath);
*/
//赋值给当前类的属性
this.servletConfig = config;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//1.编写输出语句,证明当前方法被调用
System.out.println("Servlet worked...");
//2.通过PrintWriter对象向浏览器端发送响应信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response");
writer.close();
//这样就可以多次调用了
String servle