Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议

Posted DQ_CODING

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议相关的知识,希望对你有一定的参考价值。

创建项目

新建项目

Java Enterprise
JDK1.8
Web Application
Tomcat
JAVA

默认

过程需要联网

Maven的配置

IDEA内置Maven

修改本地仓库位置,因为以后会越来越大
替换配置文件:
阿里云镜像下载

Servlet基础

1.动态Web资源开发

2.Servlet是使用Java语言编写的运行在服务器端的程序,Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet 功能的服务器(本书中指Tomcat),Servlet容器将Servlet动态的加载到服务器上。

3.Servlet是指任何实现了这个Servlet接口的类,Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。

请求静态资源(图片,文档等):读出来后直接返回响应

请求Servlet:
Servlet的请求首先会被HTTP服务器接收,HTTP服务器只负责静态html页面的解析,对于Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet,Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。

Servlet容器:一段内存空间

Servlet技术特点

Servlet技术具有如下特点:
1.方便:Servlet提供了大量的实用工具例程,如处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话等。
2.跨平台:Servlet用Java类编写,可以在不同操作系统平台和不同应用服务器平台下运行。
3.灵活性和可扩展性:采用Servlet开发的Web应用程序,由于Java类的继承性及构造函数等特点,使得应用灵活,可随意扩展。
4.除了上述几点外,Servlet还具有功能强大、能够在各个程序之间共享数据、安全性强等特点。

抽象类与接口

抽象类与接口:抽象类只能单继承,接口可以多继承。

相同点

(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

Servlet抽象方法

SUN公司提供了一系列接口和类,其中最重要的接口是javax.servlet.Servlet。在Servlet接口中定义了5个抽象方法

1.servlet生命周期:由servlet容器自动调用,所以返回值为void
init(),service(),destory()

2.servletCofig():一个servlet类对应一个servlet实例,有一个servletCofig(),所以每个servletCofig()都不同

3.void service():servletRequest请求对象,serveltResponse()请求响应

其中init()、service()和destroy()这三个方法可以表现Servlet的生命周期,它们会在某个特定的时刻被调用。另外,getServletInfo()方法用于返回Servlet的相关信息。getServletConfig()方法用于返回ServletConfig对象,该对象包含Servlet的初始化信息。需要注意的是,表中提及的Servlet容器指的是Web服务器。

service()被具体化为其他不同需要的调用方法,如GenericServlet(),HttpServlet()

servlet接口实现类

针对Servlet的接口,SUN公司提供了两个默认的接口实现类:GenericServlet和HttpServlet。
GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,它并没有实现HTTP请求处理。

HttpServlet是GenericServlet的子类,它继承了GenericServlet的所有方法,并且为HTTP请求中的POST、GET等类型【总共8种,常用两种】提供了具体的操作方法。【编程直接使用!! !】

HttpServlet的常用方法及其说明如下表所示:

HttpServlet示例:

IDEA中创建Servlet

1.新建servlet:
new-servlet

2.
虚拟地址映射,java servlet–》URL
1)基于注解的方式

2)使用webapp-WEB-INF-web.xml中配置,[xml文件方式]


注意:使用新建servlet的方式,会在web.xml中创建servlet

3.写好之后,启动Tomcat
http://localhost:端口号/当前工程根路径/

http://localhost:8082/WebServletProject_war_exploded/

要访问的具体servlet:
http://localhost:8082/WebServletProject_war_exploded/servlet_1

http://localhost:端口号/当前工程根路径/value的值

修改样式后要重启Tomcat

报错:servlet不能映射为一个url模式

Caused by: java.lang.IllegalArgumentException: 名为 [servlet_2]和 [Servlet_1] 的servlet不能映射为一个url模式(url-pattern) [/servle]

注意:注解配置的value和web.xml中的配置

servlet请求的分发处理-get()和post()

get_post.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--get方法-->
<form action="http://localhost:8082/WebServletProject_war_exploded/servlet_2" method="get">
    <input type="submit">
</form>
<!--post方法-->
<form action="http://localhost:8082/WebServletProject_war_exploded/servlet_2" method="post">
    <input type="submit">
</form>
</body>
</html>

Servlet_2.java:

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3.访问");
        //类型转换,使用ServletRequest 子类 HttpServletRequest的getMethod()方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求的方式:GET POST
        String method = httpServletRequest.getMethod();
        //打印
        System.out.println(method);
        if (method.equals("GET")) {
            System.out.println("get方式");
        } else if (method.equals("POST")) {
            System.out.println("post方式");
        }
    }

使用:

通过继承HttpServlet实现Servlet程序

案例:

package nsu.edu.cn.WebServletProject;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

// value = "/servlet_1"[类名,首字母小写]--URL路径
// name不重要,可以省略value【默认】,如:@WebServlet("/servlet_1")
@WebServlet(name = "Servlet_1", value = "/servlet_1")
//响应实体内容-展示在客户端,所有的响应使用HttpServletResponse response
//获取用户请求--HttpServletRequest request
public class Servlet_1 extends HttpServlet {
    //用户敲回车--是get方式
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //输出一个字符串
        //response.getWriter().write("hello world!");
        // html5标签
        response.getWriter().write("<h2>hello world!!!!!!!</h2>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用dogGet,在post时也输出字符串
        doGet(request, response);
    }
}
//虚拟地址映射,java servlet--》URL
//1.基于注解的方式
//2.使用webapp-WEB-INF-web.xml中配置

Servlet常见错误

Servlet-url定位servlet程序访问

servlet生命周期

将Servlet的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。

第一次访问,才会创建实例和初始化【3,4】
如果不是第一次访问,则没有3,4步骤

ServletConfig使用1:

public class Servlet_2 implements Servlet {
    public Servlet_2() {
        System.out.println("1.构造器");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2.初始化");
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3.访问");
    }
    @Override
    public void destroy() {
        System.out.println("4.销毁");
    }

在Tomcat运行时,可以把工程移除;但服务器没关闭,工程一直在容器中

1.初始化阶段
当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有直接使用该Servlet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。

2.运行阶段
这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次。

3.销毁阶段
当服务器关闭或web应用被移除出容器时,Servlet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。

Servlet类的继承体系

ServletConfig类的使用

  @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2.初始化");
        //1.获取servlet程序的别名servlet-name的值: <servlet-name>servlet_1</servlet-name>
        System.out.println("别名:"+servletConfig.getServletName());
//2.获取初始化参数init-param <init-param>中的参数名和参数值
        System.out.println("参数:"+servletConfig.getInitParameter("username"));
        System.out.println("参数:"+servletConfig.getInitParameter("userport"));
        System.out.println("参数:"+servletConfig.getInitParameterNames());


        //3.获取servletContext对象
        System.out.println("对象:"+servletConfig.getServletContext());
    }

ServletConfig使用2:

重写了init()方法,一定要调用super.init(config),调用父类的init()方法

ServletContext类的使用

介绍:
操作范围:整个web工程

作用:
存取数据:先存入,否则为null;

示例:
web.xml

<!--SerletContext的上下文参数,属于整个工程,可以配置多组-->
    <context-param>
        <param-name>name</param-name>
        <param-value>dq</param-value>
    </context-param>
    <context-param>
        <param-name>age</param-name>
        <param-value>20</param-value>
    </context-param>
    <!--不同的url映射在同一个xml上-->

Servlet_3.java

public class Servlet_3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取web.xml中配置的上下文参数
        //获取上下文对象
       //写法2: getServletConfig().getServletContext();
        ServletContext servletContext = getServletContext();
        //获取上下文参数
        String name = servletContext.getInitParameter("name");
        String age = servletContext.getInitParameter("age");
        System.out.println("context:name=" + name + " age=" + age);

        //2.获取当前的工程名路径:/工程路径
        System.out.println("当前工程路径:"+servletContext.getContextPath());

       //3.获取工程部署后在服务器硬盘上的绝对路径
        /*
        /被服务器解析地址为:http://ip:port/工程名/
        映射到IDEA代码的web目录
        * */
        System.out.println("工程部署的路径:"+servletContext.getRealPath("/"));
        System.out.println("工程下css目录的绝对路径:"+servletContext.getRealPath("/css"));
        System.out.println("工程下jsp1目录的绝对路径:"+servletContext.getRealPath("/jsp/jsp1.js"));

//        context:name=dq age=20
//        当前工程路径:/WebServletProject_war_exploded
//        工程部署的路径:D:\\CodeProject\\JavaWeb_DQ\\WebServletProject\\target\\WebServletProject-1.0-SNAPSHOT\\
//        工程下css目录的绝对路径:D:\\CodeProject\\JavaWeb_DQ\\WebServletProject\\target\\WebServletProject-1.0-SNAPSHOT\\css
//        工程下jsp1目录的绝对路径:D:\\CodeProject\\JavaWeb_DQ\\WebServletProject\\target\\WebServletProject-1.0-SNAPSHOT\\jsp\\jsp1.js

    //4.像Map一样存取数据
        servletContext.setAttribute("key1","v1");
        servletContext.setAttribute("key2","u");
        //唯一的上下文对象
        System.out.println(servletContext);
        System.out.println("v1="+servletContext.getAttribute("key1"));
        System.out.println("v2="+servletContext.getAttribute("key2"));

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

Servlet_4.java

public class Servlet_4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //所有工程类都可以获取Context的存取数据
        ServletContext context=getServletContext();
        //唯一的上下文对象
        System.out.println(context);
        System.out.println("v1="+context.getAttribute("key1"));
        System.out.println("v2="+context.getAttribute("key2"));

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

HTTP协议

介绍

请求的HTTP协议格式:
1)GET请求:
【】表示可选

GET请求的HTTP协议内容:

2)POST请求

POST请求的HTTP协议内容:

HTTP常用请求头说明

HTTP的GET与POST请求

响应的HTTP协议格式


常见的响应码:

MIME类型说明

RTF:文本

浏览器中查看HTTP协议

谷歌:
检查-网络-Headers

MricoSoft Edge浏览器:
检查-网络-全部-标头

IE浏览器:
在IE浏览器-查看源-网络

以上是关于Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章

eclipse-maven安装配置java-web-servlet

java web开发(maven创建servlet程序)

java web开发(maven创建servlet程序)

使用Eclipse + Maven 构建Java Web 项目

Maven 实战 - maven新建web项目提示"javax.servlet.http.HttpServlet" was not found on the Java Build

maven构建web项目,cannot be cast to javax.servlet.Servlet