1月18-Servlet

1月18-Servlet,第1张

1月18-Servlet

今日内容

1.Servlet

2.Request

3.Response

4.案例:

同步请求:实现登录功能(不 *** 作数据库)

异步请求:实现登录功能(不 *** 作数据库)

5.作业: 使用异步请求完成登录功能,并且连接数据库

一.Servlet 1.1 Servlet概述

概述

servlet 是运行在 Web 服务器中的小型 Java 程序(动态资源)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端(浏览器)的请求。

Servlet作用:

    Servlet接收浏览器发送的请求, 接收请求数据

    比如: 小明----请求: 提交5元(data)—>超市

    Servlet对请求处理,然后响应数据给浏览器

    比如: 小明<—响应: 一袋精细盐(data)------超市

1.2 Servlet入门

Servlet是SUN制定的动态资源程序标准,提供的是一个Servlet接口.

我们程序员开发Servlet,自定义一个类,去实现Servlet接口.重写里面方法

Servlet入门程序

步骤一: IDEA创建一个web项目 比如: web02

步骤二: 项目的src目录, 创建一个包(new packge) 比如: cn.tedu.web

步骤三: 在包下面, 自定义一个类, 比如 :Demo1Servlet 实现 Servlet接口,重写接口里面的方法

步骤四: 在自定义的类里面配置访问路径. 比如: “/demo1”

步骤五: 测试

浏览器地址栏: http://localhost:端口/项目名称/servlet访问路径

​ 注意: 动态资源项目.web项目,目录的存放文件的区别

问题一: 实现Servlet接口,并且Servlet接口报红色,

不能导入包import javax.servlet.*

分析问题原因: 创建web项目中,出问题,没有绑定tomcat环境

没有绑定tomcat环境,不能导入包,是因为tomcat环境提供了

servlet-api.jar

问题一: 解决方案

方案二: 在web项目中, 引入tomcat环境(自带servlet-api.jar),相当于项目中引入了servlet-api.jar

方案一: 在web项目中,导入servlet-api.jar

在WEB-INF目录下面,创建一个lib目录(如果有,就不用),把servlet-api.jar放到lib目录里面,同时把servlet-api.jar加载到项目中.

入门代码

package cn.tedu.web;


import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet(urlPatterns ="/demo1" )
public class Demo1Servlet implements Servlet {

    
    public void service(ServletRequest servletRequest, ServletResponse response) throws ServletException, IOException {
         //1.打印模拟:接收到请求了
        System.out.println("hello request");
        //2.响应数据到浏览器: 英文,先不要写中文
        PrintWriter writer = response.getWriter();
        writer.write("hello response");
    }



    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }



    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

1.3 Servlet访问流程

要求: 需要创建一个web项目, 把部署到服务器.通过浏览器去访问servlet资源

在浏览器地址栏输入的servlet访问路径:

http://域名:端口/项目名称/servlet访问路径.

地址一: 输入: http://域名:端口

作用: 访问到主机安装的tomcat服务器

地址二: /项目名称

作用: 访问的tomcat服务器部署的项目

地址三: /servlet访问路径.

作用: 访问tomcat服务器部署的项目里面的servlet资源

如下图:

1.4 Servlet生命周期

生命周期: 指的对象从创建到销毁的完整过程,这个过程就是生命周期

在完整的过程中,涉及到方法的执行,那么这些方法,我们称之为生命周期方法

代码如下

package cn.tedu.web;

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


@WebServlet(urlPatterns ="/demo2" )//配置访问路径
public class Demo2Servlet implements Servlet {

    
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service method ----");
    }
    
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init servlet object--1");
    }
    
    public void destroy() {
        System.out.println("destroy method--------");
    }
	
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    
    public String getServletInfo() {
        return null;
    }

}

1.5 Servlet的体系结构

顶层接口

​ Servlet 里面都是抽象方法

抽象子类,实现Servlet接口

​ GenericServlet 里面有抽象方法,也有普通方法

抽象子类,继承了 GenericServlet

​ HttpServlet 里面有抽象方法,也有普通方法

为什么设计Servlet体系结构,这样设计?

    如果开发者定义一个类,实现Servlet接口,这种方式不好.

    缺点: 自定义类重写接口的所有方法,即使方法不需要,也要全部全写.

    如果开发者定义一个类,继承 GenericServlet,这种方式不好

    优点: 解决了(实现Servlet接口全部重写方法)的缺点.

    缺点: 不能明确指定浏览器发送的是什么请求,

    ​ 不能很好的处理请求和响应数据

    如果开发者定义一个类, 继承HttpServlet, 这种方式好,推荐使用

​ 解决上述1, 2中存在的问题了,

​ 明确指定浏览器发送的是http请求,能够很好处理请求数据以及响应数据

​ http协议: 作用规范请求和响应过程的数据交互格式.

结论: 企业开发中,通过继承HttpServlet来定义我们的类,处理请求和响应数据

1.6 实际开发中,Servlet推荐的书写方式

自定义一个类, 继承HttpServlet,重写下面两个方法(重点以及难点)

    doGet(请求对象request, 响应对象response):

    作用: 接收浏览器发送的get请求

    doPost(请求对象request, 响应对象response):

    作用: 接收浏览器发送的post请求

    代码如下

    @WebServlet("/demo5")
    public class Demo5Servlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//处理post数据,不能处理get请求的数据
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//处理get数据,不能处理post请求的数据
        }
    }
    

为什么不重写service方法, 而重写doGet和doPost方法(重点以及难点)

结论就是: service方法内部,不知道浏览器发送的是get请求还是post请求,都会接收, 最终在处理get请求的数据时和处理post请求的数据时,处理方式不一样. 所以不重写service方法

HttpServlet中的service方法和doGet方法和doPost方法有关系吗?

答案肯定有.

什么关系,查询HttpServlet的源代码

快捷方式有两种:

方式一: 在代码中,找到HttpServlet, 安装ctrl键, 鼠标点击HttpServlet

方式二: 在当前项目中, ctrl+n快捷键,在它的输入框: HttpServlet

源码分析:

debug源码调试:

浏览器发送的get请求—>HttpServlet中的service方法:

​ 1.获取浏览器的提交请求方式: method

​ 2.if判断(method.equals(“Get”)){

​ //this指代的就是当前HttpServlet

​ this.doGet(req,response);

​ }else if(method.equals(“Post”)){

​ this.doPost(req,response);

​ }

结论1:(请求方式一共7种,常见的有两种)

结论2:浏览器发送请求时---->service方法: 根据请求方式的不同---->去调用doGet或者doPost方法

结论3:

浏览器发送get请求---------------->doGet方法

浏览器发送post请求---------------->doPost方法

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        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);
        }

    }

1.8 总结

Servlet概述

它是运行在web服务器的一个java程序(动态资源)

作用: 接收浏览器的请求,响应数据给浏览器

自定义servlet类.

方式一: 实现接口Servlet

自定义一个类 实现Servlet接口, 不推荐,重写很多没有用的方法

方式二: 继承GenericServlet

自定义一个类 继承GenericServlet, 不推荐,因为不清楚浏览器发送的http请求

方式三: 继承HttpServlet,重写doGet和doPost方法 推荐使用.

源码分析HttpServlet

结论1:(请求方式一共7种,常见的有两种)

结论2:浏览器发送请求时---->service方法: 根据请求方式的不同---->去调用doGet或者doPost方法

结论3:

浏览器发送get请求---------------->doGet方法

浏览器发送post请求---------------->doPost方法

常见的问题

    404 问题: 表示请求路径找不到, 因为路径写错了.

    500问题: 表示代码出异常了,找代码的问题.

    405问题: 表示请求方式不支持

    浏览器发送get请求------------>只有一个doPost方法

    浏览器发送post请求------------>只有一个doGet方法

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存