一:什么是Servlet
1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
二:手动实现 Servlet 程序
1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址
Servlet 程序的示例代码:
public class ServletTest1 implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println ("Hello Servlet 被访问了呢!" );
}
web.xml 中的配置:
<?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>Hello</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>servlet.ServletTest1</servlet-class>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
<servlet-name>Hello</servlet-name>
<!--url-pattern 标签配置访问地址
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
三种常见错误:
常见的错误 1:url-pattern 中配置的路径没有以斜杠打头。
常见错误 2:servlet-name 配置的值不存在(就是没有对应到)。
常见错误 3:servlet-class 标签的全类名配置错误(最好要用复制,而不是自己去写)。
三:Servlet的生命周期:
1、执行 Servlet 构造器方法
2、执行 init 初始化方法
第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。
3、执行 service 方法 第三步,每次浏览器访问都会调用。
4、执行 destroy 销毁方法 第四步,在 web 工程停止的时候调用。
package com.kk.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletTest2 implements Servlet {
public ServletTest2() {
System.out.println ("1--Servlet构造器" );
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println ("2--Servlet初始化" );
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println ("3--执行service方法 == Hello,被访问" );
}
@Override
public void destroy() {
System.out.println ("4--Servlet被销毁" );
}
四:Get和Post的请求分发处理:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class ServletTest3 implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 类型转换(因为它有 getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
//获取请求方式
String method = httpServletRequest.getMethod ( );
if ("GET".equals (method))
{
doGet();
}
else if ("POST".equals (method))
{
doPost();
}
}
private void doPost() {
System.out.println ("这里是GET请求,宝贝" );
}
private void doGet() {
System.out.println ("这里是POST请求,亲爱的" );
}
五:继承 HttpServlet 实现 Servlet 程序(步骤也和实现Servlet结构几乎一样)
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址
public class ServletTest4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("这里是POST" );
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("这里是GET" );
}
}
六:Servlet继承体系:
七:ServletConfig类:
概述:
1、Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
2、Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对 象
作用:
1、可以获取 Servlet 程序的别名 servlet-name 的值
2、获取初始化参数 init-param
3、获取 ServletContext 对象
在web.xml写入初始化参数:
<!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>Hello</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>com.kk.servlet.ServletTest2</servlet-class>
<!--init-param 初始化参数-->
<init-param>
<!--参数名-->
<param-name>url</param-name>
<!--参数值-->
<param-value>127.0.0.11</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>root giao giao</param-value>
</init-param>
</servlet>
用ServletConfig读取:
package com.kk.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletTest2 implements Servlet {
public ServletTest2() {
System.out.println ("1--Servlet构造器");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println ("2--Servlet初始化");
//1、可以获取 Servlet 程序的别名 servlet -name 的值
System.out.println ("HelloServlet 程序的别名是:" + servletConfig.getServletName ( ));
// 2、获取初始化参数 init-param
System.out.println ("初始化参数 name 的值是;" + servletConfig.getInitParameter ("name"));
System.out.println ("初始化参数 url 的值是;" + servletConfig.getInitParameter ("url"));
// 3、获取 ServletContext 对象
System.out.println (servletConfig.getServletContext ( ));
}
注意点:
//重写init带参ServletConfig类方法,要调用父类init ( servletConfig);
//详情看源码 GenericServlet类
@Override
public void init(ServletConfig servletConfig) throws ServletException {
super.init ( servletConfig);
}
八:ServletContext 类
概述:
1、ServletContext 是一个接口,它表示 Servlet 上下文对象
2、一个 web 工程,只有一个 ServletContext 对象实例。
3、ServletContext 对象是一个域对象。
4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围,整个 web 工程。
无 | 存数据 | 取数据 | 删数据 |
---|---|---|---|
map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
ServletContext 类的四个作用:
1、获取 web.xml 中配置的上下文参数 context-param
2、获取当前的工程路径,格式: /工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、像 Map 一样存取数据
在web.xml 中配置的上下文参数 context-param:
<!--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>kjk hao shuai a </param-value>
</context-param>
作用1-3:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet (req, resp);
//1、获取 web.xml 中配置的上下文参数 context - param
ServletContext context = getServletConfig ( ).getServletContext ( );
System.out.println ("context-param 参数 username 的值是:" + context.getInitParameter ("username"));
System.out.println ("context-param 参数 password 的值是:" + context.getInitParameter ("password"));
// 2、获取当前的工程路径,格式: /工程路径
System.out.println ("当前工程路径:" + context.getContextPath ( ));
// 3、获取工程部署后在服务器硬盘上的绝对路径
// 斜杠被服务器解析地址为:http://ip:port/工程名/
// 映射到 IDEA 代码的 web 目录
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
}
作用4:
测试类1:
public class ServletTest6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext ( );
System.out.println (context);
System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
context.setAttribute ("key1","value1zz");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}
测试类2:
public class ServletTest66 extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext ( );
System.out.println("Context2 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}