IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JavaWeb技术之Servlet(JavaWeb核心) -> 正文阅读

[Java知识库]JavaWeb技术之Servlet(JavaWeb核心)

一、简介

1.什么是Servlet?

  1. Servlet是JavaEE规范之一。规范就是接口。
  2. Servlet是JavaWeb三大组件之一。三大组件是:Servlet程序、Filter过滤器、Listener监听器。
  3. Servlet是运行在服务器上的一个java小程序,它可以接收客户端发过来的请求,并响应数据给客户端。

2.手动实现Servlet程序

  1. 编写一个类去实现Servlet接口
  2. 实现service方法,处理请求,并响应数据
  3. 到web.xml中去配置servlet程序的访问地址

Servlet程序代码示例:

public class HelloServlet 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>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>hello.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

3.Servlet的生命周期

  1. 执行Servlet构造器方法

  2. 执行init初始化方法

    第一、二步,是在第一次访问的时候创建Servlet程序会调用。

  3. 执行service方法

    第三步,每次访问都会调用。

  4. 执行destroy销毁方法

    在web工程停止的时候调用。

4.GET和POST请求

public class HelloServlet implements Servlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet被访问了");
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        
        if("GET".equals(method)){
            doGet();
        }else if("POST".queals(method)){
            doPost();
        }
    }
    
    public void doGet(){
        System.out.println("get请求");
    }
    public void doPost(){
        System.out.println("post请求");
    }
}

5.通过继承HttpServlet实现Servlet程序

一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序。

  1. 编写一个类去继承HttpServlet程序
  2. 根据业务需要重写doGet或doPost方法
  3. 到web.xml中去配置Servlet程序的访问地址

Servlet类的代码:

public class HelloServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2 的 doGet 方法");
    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2 的 doPost 方法");
    }
}

web.xml中的配置:

    <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>hello.HelloServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

6.使用IDEA创建Servlet程序

  1. 菜单:new -> Servlet

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRkHio04-1629025542964)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210729153508735.png)]

  2. 配置servlet

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZXsSptM-1629025542966)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210729153608299.png)]

如果没有,则File -> ProjectStructe -> face -> SourceRoots,找到后勾上末尾是src的文件。

7.Servlet类的继承体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J1ZqilAb-1629025542968)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210729154958188.png)]

二、ServletConfig类

ServletConfig类从类名上来看,就知道是Servlet程序的配置信息类。

三大作用

  1. 可以获取servlet程序的别名servlet-name的值
  2. 获取初始化参数init-param
  3. 获取ServletContext对象

web.xml中的配置

<servlet>
    <!--别名-->
    <servlet-name>HelloServlet</servlet-name>
    <!--init-param是初始化参数-->
    <servlet-class>hello.HelloServlet</servlet-class>
    
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
</servlet>

Servlet中的代码:

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"));
    //3.获取ServletContext对象
    System.out.println(servletConfig.getServletContext());
}

三、ServletContext类

a)什么是ServletContext?

  1. ServletContext是一个接口,它表示Servlet上下文对象。
  2. 一个web工程,只有一个ServletContext对象实例。
  3. ServletContext对象是一个域对象。
  4. ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。

b)什么是域对象

域对象,是可以像Map一样存储数据的对象,叫做域对象

这里的域指的是存取数据的操作范围,整个web工程

存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

c)ServletContext类的四个作用

  1. 获取web.xml中配置的上下文参数content-param
  2. 获取当前的工程路径,格式:/工程路径
  3. 获取工程部署后台服务器硬盘上的绝对路径
  4. 像Map一样存储数据
public class ContextServlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = getServletContext();
        System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
        context.setAttribute("key1", "value1");
        System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
    }
}

四、Http请求

1.http协议

什么是协议?

协议是指双方或多方相互约定好,大家都需要遵守的规则,叫协议。

什么是http协议?

所谓http协议,就是指客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议。

http协议中的数据又叫报文。

请求http协议的格式

客户端给服务器端发送数据叫请求。

服务器端给客户端回传数据叫响应。

2.GET请求

  1. 请求行

    1. 请求的方式 GET
    2. 请求的资源路径 (+?+请求参数)
    3. 请求的协议版本号 HTTP/1.1
  2. 请求头

    key:value 组成 不同的键值对,表示不同的含义。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUix2VE8-1629025542970)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210730114013347.png)]

3.POST请求

  1. 请求行

    1. 请求的方式 POST
    2. 请求的资源路径 (+?+请求参数)
    3. 请求的协议版本号 HTTP/1.1
  2. 请求头

    key:value 组成 不同的键值对,表示不同的含义。

    空行

  3. 请求体 >>>> 就是发送给服务器的数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uo0fzC1h-1629025542972)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210730114733240.png)]

4.常用请求头的说明

Accept:表示客户端可以接受的数据类型

Accept-Language:表示客户端可以接受的语言类型

User-Agent:表示客户端浏览器的信息

Host:表示请求时的服务器ip和端口号

5.哪些是get请求,哪些是POST请求

GET请求:

  1. form标签method=get
  2. a标签
  3. link标签引入css
  4. Script标签引入js文件
  5. img标签引入图片
  6. iframe引入html页面
  7. 在浏览器地址栏中输入地址后敲回车

POST请求:

  1. form标签 method=post

6.响应的HTTP协议格式

  1. 响应行

    1. 响应的协议和版本号
    2. 响应状态码
    3. 响应状态描述符
  2. 响应头

    1. key:value 不同的响应头,有其不同含义

      空行

  3. 响应体 ---->>> 就是回传给客户端的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNb3iQCo-1629025542973)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210730115726486.png)]

常用响应码说明

200:表示请求成功

302:表示请求重定向

404:表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)

500:表示服务器已经收到请求,但是服务器内部错误(代码错误)

五、HttpServletRequest类(**)

1.HttpServletRequest类的作用

获取进入Tomcat服务器的请求信息。

2.HttpServletRequest类的常用方法

getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost()获取客户端的ip地址
getHeader()获取请求头
getParameter()获取请求的参数
getParameterValues()获取请求的参数(多个值的时候使用)
getMethod()获取请求的方式GET或POST
setAttributerValues(key, value)设置域数据
getAttribute(key)获取域数据
getRequestDispatcher()获取请求转发对象

3.如何获取请求参数

getParameter()获取请求的参数
getParameterValues()获取请求的参数(多个值的时候使用)

? 表单

<body>    <form action="http://localhost:8080/07_servlet/Servlet" method="get">        用户名:<input type="text" name="username"><br/>        密码:<input type="password" name="password"><br/>        兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++        <input type="checkbox" name="hobby" value="java">Java        <input type="checkbox" name="hobby" value="js">JavaScript<br/>        <input type="submit">    </form></body>

? Java代码:

public class ParameterServlet extends HttpServlet { @Override     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // 获取请求参数         String username = req.getParameter("username");        String password = req.getParameter("password");        String[] hobby = req.getParameterValues("hobby");        System.out.println("用户名:" + username);        System.out.println("密码:" + password);        System.out.println("兴趣爱好:" + Arrays.asList(hobby));    } }

doGET请求的中文乱码解决

String username = req.getParameter("username");//1 先以 iso8859-1 进行编码 //2 再以 utf-8 进行解码 username = new String(username.getBytes("iso-8859-1"), "UTF-8");

POST请求的中文乱码解决

req.setCharacterEncoding("UTF-8");

4. 请求的转发

什么是请求的转发?

请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pPmqiyT-1629025542974)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210812141109093.png)]

Servlet1代码:

public class Servlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username);
        
        // 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
        req.setAttribute("key1","柜台 1 的章");
        
        //Servlet2(柜台 2)怎么走
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
        
        // 走向 Sevlet2(柜台 2)
        requestDispatcher.forward(req,resp);
    }
}

Servlet2代码:

public class Servlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username);
        
        // 查看 柜台 1 是否有盖章
        Object key1 = req.getAttribute("key1");
        System.out.println("柜台 1 是否有章:" + key1);
        
        // 处理自己的业务
        System.out.println("Servlet2 处理自己的业务 ");
    }
}

5.base标签的作用

base标签设置页面相对路径工作时参照的地址

href属性就是参数的地址值

<!DOCTYPE html>
<html lang="zh_CN">
    <head>
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <!--base 标签设置页面相对路径工作时参照的地址 href 属性就是参数的地址值 --> 
        <base href="http://localhost:8080/07_servlet/a/b/"> 
    </head>
    <body> 这是 a 下的 b 下的 c.html 页面<br/> 
        <a href="../../index.html">跳回首页</a><br/> 
    </body>
</html>

6.Web中的路径

Web中的相对路径和绝对路径

相对路径:

. 表示当前目录

… 表示上一级目录

资源名 表示当前目录/资源名

绝对路径

http://ip:port/工程路径/资源路径

在实例开放中,路径都是用绝对路径,而不简单的使用相对路径。

  1. 绝对路径
  2. base+相对

web中/斜杠的不同意义

/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/

<a herf="/">斜杠</a>

/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径

1. <url-pattern>/servlet</url-pattern>
2. servletContext.getRealPath("/");
3. request.getRequestDispatcher("/");

特殊情况:

> response.sendRediect("/");   把斜杠发送给浏览器解析。得到http://ip:port/

六、HttpServletResponse类(**)

1.HttpServletResponse类的作用

HttpServletResponse和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Respnose对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse对象来进行设置.

2.两个输出流的说明

字节流 getOutputStream(); 常用于下载(传递二进制数据)

字符流 getWriter(); 常用于回传字符串(常用)

注意:两个流只能同时一个。使用了字节流,就不能再使用字符流。反之亦然,否则就会报错。

3.如何往客户端回传数据

public class ResponseIOServlet extends HttpServlet {
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("response's content!!!");
    }
}

4. 响应的乱码解决

解决响应中文乱方案一:(不推荐)

// 设置服务器字符集为 UTF-8 
resp.setCharacterEncoding("UTF-8"); 
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");

解决响应中文乱方案二:(推荐使用)

// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头 
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");

5. 请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。

请求重定义向的第一种方法(不推荐)

//设置相应状态,表示重定向(已经搬迁)
resp.setStatus(302);
//设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");

请求重定向的第二种解决方法(推荐)

resp.sendRedirect("http://localhost:8080");
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:15:56  更:2021-08-17 15:16:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 21:41:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码