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 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> HttpServlet的使用 -> 正文阅读

[系统运维]HttpServlet的使用

get与post请求

get 请求只能发送普通的字符串,并且发送的字符串长度有限。get在请求行上发送数据

Request URL: http://localhost:8081/htt/getservlet?username=sza002415&userpwd=dass

post 请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频,声音,图片。

get请求在W3C中,get请求比较适合从服务器端获取数据

post请求在W3C中,比较适合向服务器端传送数据

大部分的form表单都是post方式,因为form表单中要填写大量的数据,这些数据是收集用户的信息,一般是要传给服务器

表单中有敏感信息,采用post,因为get方式会将信息显示在地址栏上

到目前为止只有一种情况可以发送POST请求:使用form表单,并且在form标签中的method属性值为,method=“post”

<form action="/htt/getservlet" method="get">
    username<input type="text" name="username"/><br>
    password<input type="password" name="userpwd"/><br>
    <input type="submit" value="login">
</form>

而一般情况下都是get请求:

1.在浏览器地址栏上直接输入URL,敲回车

2.在浏览器上直接点击超链接

3.form表单默认method=“get”

httpServlet源码分析

类比servlet的生命周期

public class htmlservlet extends HttpServlet {
    //通过无参数构造方法创建对象
//    public htmlservlet(){
//
//    }
}

没有调用init方法必然调用父类的init方法,而HttpServlet父类并没有提供init方法,因此HttpServlet会继续调用其父类GenericServlet的init方法

    
//GenericServlet类
	public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }

IntelliJ IDEA中查看某个类中的所有方法 -ctrl+F12

调用完init方法,便会调用service方法,没有则在父类HttpServlet里面找

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException(lStrings.getString("http.non_http"));
        }

        this.service(request, response);
    }

其末尾再次调用了向下转型的sevice方法

再调用另一个不同参数的service方法

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();//获取GET POST HEAD PUT....
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/xmm/servlet_0">index</a>
<!--注意浏览器上编写的请求路径还是要带上应用的根路径-->
<h1>get:请求</h1>
<form action="/htt/getservlet" method="get">
    username<input type="text" name="username"/><br>
    password<input type="password" name="userpwd"/><br>
    <input type="submit" value="login">
</form>
<h1>post:请求</h1>
<form action="/htt/postservlet" method="post">
    username<input type="text" name="username"/><br>
    password<input type="password" name="userpwd"/><br>
    <input type="submit" value="login">
</form>
</body>
</html>

报405错误:

当前端发送的请求是get,但是我们没有重写doGet方法,那么便会调用HttpServlet的里面自带的doGet方法:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_get_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }

    private void sendMethodNotAllowed(HttpServletRequest req, HttpServletResponse resp, String msg) throws IOException {
        String protocol = req.getProtocol();
        if (protocol.length() != 0 && !protocol.endsWith("0.9") && !protocol.endsWith("1.0")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }

    }

如上所示,便会提示405异常

子类重写方法 alt+insert +重写方法

最终的servlet类的开发步骤

1.编写一个类直接继承HttpServlet

2.重写doGet或者doPost方法

3.将servlet类配置到xml文件当中

4.准备前端的界面(form表单),form表单中指定请求路径。注意这里的html文件需要在web的目录下

//当我重写了doPost
package sza_htmservlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

public class htmlservlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        super.doPost(req, resp);
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>登录成功!!!!<h1>");
    }
}

//但是form的method却是get
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>学生登录系统</h2>
<form action="/htmm/htmservlet" method="get">
    username<input type="text" name="username"/><br>
    password<input type="password" name="userpwd"/><br>
    <input type="submit" value="login">
</form>
</body>
</html>

那么便会出现下面的报错:

在这里插入图片描述

这便是405错误问题所在。

关于xml的调用:

在这里插入图片描述

通过html的/htmm/htmservlet找到xml文件中的htmservlet,再像如上的方式找到class类调用一系列的方法。

关于一个web站点的欢迎页面

我们一般的访问方式是:http://localhost:8081/htmm/login.html指定了访问的login.html资源

如果我们的访问方式就是这个站点,没有具体的资源路径,便会默认访问设置的欢迎界面。

http://localhost:8081/htmm

只需要在xml文件中添加欢迎界面即可

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

       //欢迎界面      
    <welcome-file-list>
        <welcome-file>welcom.html</welcome-file>
    </welcome-file-list>
             
             
    <servlet>
        <servlet-name>htmlservlet</servlet-name>
        <servlet-class>sza_htmservlet.htmlservlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>htmlservlet</servlet-name>
        <url-pattern>/htmservlet</url-pattern>
    </servlet-mapping>
</web-app>

注意这个路径并不需要加"/",这个路径是默认从webapp的根路径下查找的。

当html的文件名设置为index的时候,不需要配置欢迎界面,index.html就自动为欢迎界面.

动态资源和静态资源都可以成为欢迎界面.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <welcome-file-list>
        <welcome-file>htmservlet</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>htmlservlet</servlet-name>
        <servlet-class>sza_htmservlet.htmlservlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>htmlservlet</servlet-name>
        <url-pattern>/htmservlet</url-pattern>
    </servlet-mapping>
</web-app>

注意当我们使用类的时候依然要遵守welcome-file后面不可以出现/

在这里插入图片描述

并且需要重写doGet方法,否则便会出现405错误.

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:35:20  更:2022-03-06 13:36:00 
 
开发: 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年11日历 -2024/11/16 3:12:50-

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