Servlet-1
Servlet介绍
什么是 Servlet?
- Servlet 是 JavaEE 规范之一,规范就是接口。
- Servlet 是 JavaWeb 三大组件之一,三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
- Servlet 是运行在服务器上的一个 java 程序,它可以接收客户端(浏览器)发送过来的请求,并响应数据给客户端。
实现 Servlet接口 实现 servlet 程序
- 编写一个类,实现 Servlet 接口
- 实现 service 方法,处理请求,响应数据
- 在 web.xml 中配置 servlet 程序的访问地址
public class HelloServlet implements Servlet {
/**
* service 方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet 被访问了");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- servlet 标签为 Tomcat 配置 Servlet 程序 -->
<servlet>
<!--servlet-name 标签为 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 标签是 Servlet 程序的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping 标签为 servlet 程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,当前配置的地址给哪个 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern 标签 配置访问地址 <br/>
/ 斜杠被服务器解析时,表示地址为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
Servlet 程序的生命周期
- 执行 Servlet 构造方法
- 执行 init 初始化方法
第1、2步,是在第一次访问程序的时候被调用。 - 执行 service 方法
第3步,每次访问都会调用。 - 执行 destroy 销毁方法
第4步,在 web 工程停止时调用
GET 和 POST 请求的分发处理
package servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 实现servlet
* 1、编写一个类实现 Servlet接口
* 2、实现 service方法,处理请求,并响应数据
* 3、到 web.xml 中去配置 servlet程序的访问地址
* @author MCC
*/
public class ServletDemo implements Servlet{
/**
* 1、执行Servlet构造器方法
* 2、执行init初始化方法
第一、二步是在第一次访问时,即创建Servlet程序时被调用。
* 3、执行service方法
第三步,每次访问都会调用。
* 4、执行destroy销毁方法
第四步,在 web工程停止的时候调用
*/
public ServletDemo() {
//1.首先被调用
}
@Override
public void destroy() {
//4.最后被调用
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
/**
* ServletConfig类的功能:
1、获取 Servlet程序的别名,即servlet-name的值
2、获取初始化参数init-param
3、获取ServletContext对象
有一个Servlet程序,就有一个与其对应的ServletConfig对象
*/
@Override
public void init(ServletConfig config) throws ServletException {
//2.第2个被调用
String servletName = config.getServletName();
String userName = config.getInitParameter("userName");
String url = config.getInitParameter("url");
ServletContext servletContext = config.getServletContext();
System.out.println(servletName);
System.out.println(userName);
System.out.println(url);
System.out.println(servletContext);
}
/**
* service()是专门用于处理请求和响应的方法
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest hreq = (HttpServletRequest)req;
String method = hreq.getMethod();
if(("GET").equals(method)) {
doGet();
} else if(("POST").equals(method)) {
doPost();
}
}
public void doGet() {
System.out.println("实现方式下的get请求");
}
public void doPost() {
System.out.println("实现方式下的post请求");
}
}
继承 HttpServlet类 实现 Servlet 程序
- 编写一个类继承 HttpServlet 类
- 根据业务需要重写 doGet() 或 doPost() 方法
- 在 web.xml 中的配置 Servlet 程序的访问地址
package servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletDemo3
*/
public class ServletDemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletDemo3() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("eclipse自动生成的servlet的get请求");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("eclipse自动生成的servlet的post请求");
}
}
<servlet>
<servlet-name>ServletDemo3</servlet-name>
<servlet-class>servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo3</servlet-name>
<url-pattern>/demo3</url-pattern>
</servlet-mapping>
ServletConfig 类
介绍
- ServletConfig 类是Servlet 程序的配置信息类。
- Servlet 程序和 ServletConfig 对象都是由 Tomcat 创建的。
- Servlet 程序在被第一次访问的时候创建,一个 Servlet 程序有一个ServletConfig 对象。
作用
ServletConfig 类的作用:
- 获取 Servlet 程序的 servlet-name 值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
<!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>url</param-name>
<!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern 标签配置访问地址 <br/>
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
/hello 表示地址为:http://ip:port/工程路径/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
注意:若Servlet程序是继承实现的,则重写init方法时,必须引用父类init()方法;
若Servlet程序是实现接口实现的,则没有上述要求。
实现接口:
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 1、获取 Servlet 程序的 servlet-name 值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
继承:
package servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo2 extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("继承方式下的get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("继承方式下的post请求");
}
/*
* 特别注意:如果重写init()方法,必须引用父类init()方法,否则会报空指针异常
*/
@Override
public void init(ServletConfig config) throws ServletException {
//必须调用父类init()方法
super.init(config);
System.out.println("重写init()方法时必须调用父类init()方法");
}
}
ServletContext 类
介绍
什么是 ServletContext 类?
- ServletContext 是一个接口,表示 Servlet 上下文对象。
- 一个 web 工程,只有一个 ServletContext 对象。
- ServletContext 对象是一个域对象。
- ServletContext 对象在 web 工程启动时创建,在 web 工程停止时销毁。
域对象
什么是域对象?
- 域对象,是可以像 Map 一样存取数据的对象,域指的是存取数据的范围。
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
作用
ServletContext 类的四个作用:
- 获取 web.xml 中配置的上下文参数 context-param
- 获取当前的工程路径,格式为 /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map 一样存取数据
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
package servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ServletContext:
* 1、ServletContext是一个接口,它表示 Servlet的上下文对象
* 2、一个 web工程,只有一个 ServletContext对象。
* 3、ServletContext对象是一个域对象。
* 4、ServletContext对象在 web工程启动时创建,在停止时销毁(重启也会销毁)。
*
* 什么是域对象?
* 域对象,是可以像 Map一样存取数据的对象。
* 这里的域指的是该对象存取的数据的操作范围,是整个 web工程。
*
* 因此,在一个工程中,无论调用多少次getServletContext()方法,都只会得到同一个ServletContext对象,
* 使用setAttribute()设置的属性和值,也是供多个程序共同使用的
*
* 存数据 取数据 删除数据
* Map put() get() remove()
* 域对象 setAttribute() getAttribute() removeAttribute();
*/
public class ServletContextDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletContextDemo() {
super();
// TODO Auto-generated constructor stub
}
/**
* ServletContext类的功能:
* 1、获取 web.xml 中配置的上下文参数 context-param
* 2、获取当前的工程路径,结果的格式: /工程路径
* 3、获取工程部署后,各目录或文件在硬盘上的绝对路径
* 4、像 Map 一样存取数据
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* <servlet>标签中的内容只能由ServletConfig对象获取
* <context-param>中的内容只能由ServletContext对象获取
*/
//1.获取 web.xml 中配置的上下文参数 context-param
//先通过ServletConfig类获取ServletContext对象
ServletContext context = getServletConfig().getServletContext();
Object userName = context.getInitParameter("userName");
Object password = context.getInitParameter("password");
System.out.println(userName);
System.out.println(password);
//2.获取当前工程路径
String path = context.getContextPath();
System.out.println(path);// 结果: /DynamicWeb
//3.获取工程部署后在硬盘上的绝对路径
/**
* 斜杠 / 被服务器解析为:http://ip:port/工程名
* 代表查询当前工程在硬盘上的路径,这个路径对应工程中的WebContent目录
* 如果要查询WebContent下的其他目录或文件,只需要追加路径即可
*/
String realPath = context.getRealPath("/");
System.out.println(realPath);
//获取imgs文件夹下的1.jpg的磁盘路径
System.out.println(context.getRealPath("/imgs/1.jpg"));
//结果:D:\Java\eclipse\workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\DynamicWeb\
//D:\Java\eclipse\workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\DynamicWeb\imgs\1.jpg
//4、像 Map 一样存取数据
context.setAttribute("value", "v1");
Object object = context.getAttribute("value");
//之后在ServletDemo-Demo3等其他程序中获取ServletContext对象之后,获取到的是同一个对象,
//使用getAttribute("value")获取到的属性值也都是v1
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
HTTP协议
请求的 HTTP 协议格式
- 客户端给服务器发送数据叫请求。
- 服务器给客户端回传数据叫响应。
- 请求又分为 GET 请求和 POST 请求两种
GET 请求
- 请求行
(1) 请求的方式 GET
(2) 请求的资源路径[+?+请求参数]
(3) 请求的协议的版本号 - 请求头
key : value 组成 不同的键值对,表示不同的含义。
POST 请求
-
请求行
(1) 请求的方式 POST
(2) 请求的资源路径[+?+请求参数]
(3) 请求的协议的版本号 -
请求头
key : value 不同的请求头,有不同的含义 -
请求体
POST 请求下参数不会在浏览器地址栏显示,都放在请求体中发送给服务器
常用的请求头
Accept:表示客户端可以接收的数据类型
Accpet-Languege:表示客户端可以接收的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求时的服务器 ip 和端口号
Referer:记录浏览器发送请求时,浏览器地址栏中的地址
区分 GET 请求和 POST 请求
GET 请求:
- form 标签 method=get
- a 标签
- link 标签引入 css
- Script 标签引入 js 文件
- img 标签引入图片
- iframe 引入 html 页面
- 在浏览器地址栏中输入地址后敲回车
POST 请求有哪些:
- form 标签 method=post
响应的HTTP 协议格式
格式
- 响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符 - 响应头
(1) key:value 不同的响应头,有其不同含义 - 响应体:回传给客户端的数据
响应状态码
状态码 | 含义 |
---|---|
200 | 请求成功 |
302 | 请求重定向 |
404 | 请求服务器已收到,但数据不存在,即请求地址错误 |
500 | 请求服务器已收到,但服务器内部错误,一般为代码错误 |
MIME类型
MIME 是 HTTP 协议中的数据类型。
MIME(Multipurpose Internet Mail Extensions)多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小
类型”,并与某一种文件的扩展名相对应。