Servlet和JSP

Servlet和JSP,第1张

Servlet和JSP

目录
  • Servlet技术
    • 什么是 Servlet
    • 手动实现 Servlet 程序
      • 原理
      • Servlet 的生命周期
      • GET 和 POST 请求的分发处理
    • 通过继承 HttpServlet 实现 Servlet 程序
    • 使用 IDEA 创建 Servlet 程序
      • Servlet 类的继承体系
    • ServletConfig 类
    • ServletContext 类
    • 请求的 HTTP 协议格式
    • 响应的 HTTP 协议格式
    • base 标签的作用
    • Web 中的相对路径和绝对路径
    • web 中 / 斜杠的不同意义
  • JSP简介
    • 什么是 jsp,它有什么用
    • jsp页面的本质

Servlet技术 什么是 Servlet

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

手动实现 Servlet 程序

1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据

public class HelloServlet implements Servlet {
    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello servlet 被访问了");
    }
... ...

3、到 web.xml 中去配置 servlet 程序的访问地址




    
    
        
        helloservlet

        
        com.javaweb.servlet.HelloServlet
    
    
    
    
        
        helloservlet
        
        /hello
        
    


原理

url 地址到 Servlet 程序的访问

Servlet 的生命周期

1、执行 Servlet 构造器方法
2、执行 init 初始化方法 第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。
3、执行 service 方法, 这一步每次访问都会调用。
4、执行 destroy 销毁方法 第四步,在 web 工程停止的时候调用。

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("1 构造器方法");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init初始化方法");
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service方法");
        System.out.println("hello servlet 被访问了");

    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
        System.out.println("4 . destroy销毁方法");
    }
}

GET 和 POST 请求的分发处理
public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("1 构造器方法");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init初始化方法");

//        1、可以获取Servlet程序的别名servlet-name的值
        System.out.println("HelloServlet程序的别名是:" + servletConfig.getServletName());
//        2、获取初始化参数init-param
        System.out.println("初始化参数username的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数url的值是;" + servletConfig.getInitParameter("url"));
//        3、获取ServletContext对象
        System.out.println(servletConfig.getServletContext());
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service === Hello Servlet 被访问了");
        // 类型转换(因为它有getMethod()方法)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        // 获取请求的方式
        String method = httpServletRequest.getMethod();

        if ("GET".equals(method)) {
            doGet();
        } else if ("POST".equals(method)) {
           doPost();
        }
    }
    
    public void doGet(){
        System.out.println("get请求");
        System.out.println("get请求");
    }
    
    public void doPost(){
        System.out.println("post请求");
        System.out.println("post请求");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
        System.out.println("4 . destroy销毁方法");
    }
}
通过继承 HttpServlet 实现 Servlet 程序

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

1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法

public class HelloServlet2 extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("重写了init初始化方法,做了一些工作");
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int i =  12 / 0;

        System.out.println("HelloServlet2 的doGet方法");
        // 也可以使用.
        ServletConfig servletConfig = getServletConfig();
        System.out.println(servletConfig);

        //        2、获取初始化参数init-param
        System.out.println("初始化参数username的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数url的值是;" + servletConfig.getInitParameter("url"));
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2 的doPost方法");
    }
}

3、到 web.xml 中的配置 Servlet 程序的访问地址
配置方式和上文相同

使用 IDEA 创建 Servlet 程序


Servlet 类的继承体系

ServletConfig 类

ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对 象。

ServletConfig 类的三大作用
1、可以获取 Servlet 程序的别名 servlet-name 的值
2、获取初始化参数 init-param
3、获取 ServletContext 对象

web.xml 中的配置:

 
 
     HelloServlet
        
   com.atguigu.servlet.HelloServlet
    
     
    
     username 
      
     root 
      
      
      
      
     url
       
     jdbc:mysql://localhost:3306/test
     

Servlet 中的代码

@Override public void init(ServletConfig servletConfig) throws ServletException { 
System.out.println("2 init 初始化方法"); 
// 1、可以获取 Servlet 程序的别名 servlet-name 的值
 System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName()); 
 // 2、获取初始化参数 init-param 
 System.out.println("初始化参数 username 的值是;" +servletConfig.getInitParameter("username"));
  System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
   // 3、获取 ServletContext 对象
   System.out.println(servletConfig.getServletContext());
    }

注:

ServletContext 类

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

什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的 *** 作范围,整个 web 工程。

ServletContext 类的四个作用
1、获取 web.xml 中配置的上下文参数 context-param
2、获取当前的工程路径,格式: /工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、像 Map 一样存取数据

web.xml 中的配置

ServletContext 演示代码

ServletContext 像 Map 一样存取数据:

ContextServlet1 代码:

ContextServlet2 代码:

请求的 HTTP 协议格式

客户端给服务器发送数据叫请求。 服务器给客户端回传数据叫响应。
请求又分为 GET 请求,和 POST 请求两种

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

2、请求头
key : value 组成 不同的键值对,表示不同的含义


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

2、请求头

  1. key : value 不同的请求头,有不同的含义

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


常用请求头的说明
Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口号

哪些是 GET 请求,哪些是 POST 请求
GET 请求有哪些:
1、form 标签 method=get
2、a 标签
3、link 标签引入 css
4、script 标签引入 js 文件
5、img 标签引入图片
6、iframe 引入 html 页面
7、在浏览器地址栏中输入地址后敲回车

POST 请求有哪些:
8、form 标签 method=post

响应的 HTTP 协议格式

1、响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符

2、响应头
(1) key : value 不同的响应头,有其不同含义

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

常用的响应码说明
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)

MIME 类型说明
MIME 是 HTTP 协议中数据类型。 MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小 类型”,并与某一种文件的扩展名相对应

常见的 MIME 类型


base 标签的作用


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

在 javaWeb 中,路径分为相对路径和绝对路径两种:

web 中 / 斜杠的不同意义

在 web 中 / 斜杠 是一种绝对路径
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/

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

JSP简介 什么是 jsp,它有什么用

jsp 的全称是 java server pages。Java 的服务器页面。
jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。 因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高

Servlet 回传 html 页面数据的代码:

jsp 回传一个简单 html 页面的代码:

jsp 如何访问:

jsp 页面和 html 页面一样,都是存放在 web 目录下。访问也跟访问 html 页面一样

比如:在 web 目录下有如下的文件
web 目录
a.html 页面 访问地址是 ====== =>>>>>> http://ip:port/工程路径/a.html

b.jsp 页面 访问地址是 =======>>>>>> http://ip:port/工程路径/b.jsp

jsp页面的本质

jsp 页面本质上是一个 Servlet 程序

当我们第一次访问 jsp 页面的时候。Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 java 源文件。并且对它进行编译成 为.class 字节码程序。我们打开 java 源文件不难发现其里面的内容是:

我们跟踪原代码发现,HttpJspbase 类。它直接地继承了 HttpServlet 类。也就是说。jsp 翻译出来的 java 类,它间接了继 承了 HttpServlet 类。也就是说,翻译出来的是一个 Servlet 程序


总结:通过翻译的 java 源代码我们就可以得到结果:jsp 就是 Servlet 程序。
也可以去观察翻译出来的 Servlet 程序的源代码,不难发现。其底层实现,也是通过输出流。把 html 页面数据回传 给客户端。

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

原文地址: https://outofmemory.cn/zaji/5636671.html

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

发表评论

登录后才能评论

评论列表(0条)

保存