学习JavaWeb的第3天(2021-11-09)

1、public interface Servlet

package javax.rtl.servlet;
//javax.rtl.servlet.Servlet
public interface Servlet{
    void service();
}

2、

public class BankServlet implements Servlet

package com.rtl.servlet;

import javax.rtl.servlet.Servlet;
//com.rtl.servlet.BankServlet
public class BankServlet implements Servlet{
    public void service(){
        System.out.println("BankServlet's service.........");
    }
}

3、public class UserListServlet implements Servlet

package com.rtl.servlet;

import javax.rtl.servlet.Servlet;
//com.rtl.servlet.UserListServlet

public class UserListServlet implements Servlet{
    public void service(){
        System.out.println("UserListServlet's service.........");
    }
}

4、public class UserLoginServlet implements Servlet

package com.rtl.servlet;

import javax.rtl.servlet.Servlet;
//com.rtl.servlet.UserLoginServlet
public class UserLoginServlet implements Servlet{
    public void service(){
        System.out.println("UserLoginServlet's service.........");
    }
}

5、public class Tomcat这个类很重要

package org.apache;
import javax.rtl.servlet.Servlet;
import java.io.FileReader;
import java.util.Properties;
import java.util.Scanner;

public class Tomcat{
    public  static void main(String[] args) throws Exception{
        System.out.println("Tomcat服务器启动成功!开始接收用户的访问。");
        System.out.println("请输入您的访问路径:");
        Scanner s = new Scanner(System.in);
        //接收用户输入的请求路径
        String path = s.nextLine();

        //这里就是Tomcat模拟解析配置文件里面请求路径和xxxServlet的映射关系。
        FileReader reader = new FileReader("web.properties");
        Properties pro = new Properties();
        pro.load(reader);
        reader.close();

        //根据用户的请求路径来获取value值,就是具体的Servlet的类名
        String className = pro.getProperty(path);
        Class clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        //拿到这个obj之后,Tomcat服务器的开发者是不知道具体是哪个Servlet的,但是它一定知道这个具体的Servlet的类
        //实现了接口Servlet,所以,我们可以把这个得到的obj强转成Servlet类。
        Servlet servlet = (Servlet) obj;
        servlet.service();

    }
}

现在访问的地址都是显示一些写死再HTML文档里面的静态资源,怎么能将这些静态资源变成动态的呢?
显然需要连接数据库。
连接数据库需要JDBC程序。也就是需要编写java程序连接数据库,查出来有多少条记录,页面上就显示多少条。这种技术称为动态网页技术。
注意:动态网页技术并不是说页面中有flash动画,而是说,动态网页里面的数据是动态的,是根据数据库中的变化而变化的。
画图:
WEB Server 目前使用的是Tomcat服务器。这个Tomcat服务器是纯java语言写的。
在tomcat服务器里面有个东西是webapps。
在这里插入图片描述
在webapps里面有很多个web项目。
其中有一个是oa;办公系统。
计算机里面有很多个服务,其中这台电脑的8080端口就是用来给tomcat服务器的。
oa办公系统里面有很多个资源:index.html,login.html
我们上海的一台用户机使用浏览器这个软件输入URL之后,就可以去访问深圳这台服务器里面的tomcat服务器里面的资源、

浏览器输入:
http://127.0.0.1:8080/oa/index.html
http://127.0.0.1:8080/oa/login.html
输入这些url可以访问oa里面的静态资源。
那,现在怎么访问小java程序呢?
比如:在oa系统里面定义一个java小程序用来获取所有的用户信息的。
和静态资源一样,也是取决于路径,取决于你写的url;
一个路径代表一个资源。
这个资源可能代表静态资源,也可能是动态资源。
但是静态资源访问的时候,前面的路径写的就是我呢见的名字,这个好搞一点。
但是:访问动态资源的路径怎么和这些java小程序对应呢?
比如:在oa办公系统里面,动态资源就是UserServlet.java这个java小程序来获取所有用户的信息列表。
比如:输入http://127.0.0.1:8080/oa/userList。
这个URL就可以访问UserServlet.java小程序来获取用户列表。

需要知道的就是:
你后端需要执行哪个java小程序,是由前端浏览器发送的请求路径是什么。一个路径代表一个servlet程序。

在这里插入图片描述
对于一个动态的web应用来说,一个请求和响应的过程需要多少个角色去参与,角色和角色之间有多少个协议。
在整个BS的系统中,有多少个角色?
浏览器软件的开发商(谷歌,火狐,IE)
WebServer的开发团队(Tomcat,JBoss)
DB Server:Mysql,Oracle
接下来就是webapp项目的开发。这个是作为javaweb程序员来写的。
所以:我们在写这个web应用的时候,不止是能在Tomcat里面部署。
所以,大家必须要解耦合。
大家都要遵循一个规则,规则就是接口,这个接口就是Servlet
Servlet规范的作用是:WebAPP和WebServer解耦合。
http协议:浏览器和WebServer服务器之间有传输协议-超文本传输协议。
JDBC规范:webapp开发团队与DB Server团队需要遵循的协议。
在这里插入图片描述

我们现在准备学习Servlet规范。

模拟Servlet的本质(只是模拟)

前提知识点:
1、浏览器和Tomcat服务之间需要遵循HTTP协议,这个协议是由W3School制定。
2、Tomcat服务器和我们编写web应用需要遵循servlet规范。这个是由sun公司编写。
3、我们编写的web应用里面需要和数据库进行交互(CRUD),需要遵循JDBC规范。

1、制定Servlet规范。
2、充当Tomcat服务器的开发者。
3、充当WebApp的开发者。

因为我们写的web app程序遵循servlet规范,所以我们的程序不仅可以部署在tomcat服务器上,还可以部署在其它服务器上。
1、首先我们是sun公司里面的一员,正在写规范。

写接口Servlet:

在这里插入图片描述

在这里插入图片描述
2、写一个java小程序去查询用户信息列表的。后期通过浏览器的访问对应的url才能查到对应的资源。
现在我们是充当web app的开发者去写一些小程序,这些小程序要实现sun公司编写的Servlet接口
例如:BankServlet接口,UserListServlet接口,
UserLoginServlet接口

编写BankServlet类:

在这里插入图片描述

编写UserListServlet.java

在这里插入图片描述

编写UserLoginServlet类

在这里插入图片描述

我们前面写的这几个xxxServlet的类都是继承了sun公司里面编写的Servlet规范。
我们是充当了web app的开发者去写了这几个xxxServlet类。
在这里插入图片描述

3、充当Tomcat服务器的开发者。

Tomcat服务器是使用纯java语言编写的。
实际上,只要启动Tomcat服务器,我i们就会接收来自浏览器端用户写上URL敲回车的访问。

编写Tomcat.class

在这里插入图片描述

实际情况就是:
用户在浏览器上输入不同的URL,它会调用不同的资源。如果是动态资源的话,它就会调用不同的Servlet程序。
那我们模拟Tomcat接收用户不同的请求就是通过用户输入不同的字符串,来调用不同的Servlet程序。
例如:
输入:/userList 调用UserListServlet
输入:/login 调用UserLoginServlet
输入:/bank 调用BankServlet
使用Scanner来模拟。
在这里插入图片描述

写到这里,我们先去编译一下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
首先编译Tomcat.java,但是他在包下org.apache下面。
在这里插入图片描述
使用命令

javac -encoding UTF-8 -d . Tomcat.java

在这里插入图片描述
编译之后,就会多出编译之后的文件来。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为我们写的Tomcat.java的源代码在包org.apache里面。
在这里插入图片描述
执行这个编译好的类:
使用命令:

java org.apache.Tomcat

在这里插入图片描述
Tomcat.java:
在这里插入图片描述
这里模拟的就是到时候,用户在浏览器那里写的请求路径,请求路径写的不同,就会访问不同的XxxServlet.java

在这里插入图片描述

请求路径和Servlet应该是有一个对应关系的:
例如:
输入:/userList 调用UserListServlet
输入:/login 调用UserLoginServlet
输入:/bank 调用BankServlet

那么指定这个请求路径和哪个具体的Servlet的映射关系是由我们自己(WebApp的开发者)来制定的。

问:我们如何指定?
1、配置文件:描述对照关系。
所以我们准备写一个配置文件先把这些映射关系给存储起来,后续,Tomcat服务器启动的时候,需要先去解析这个配置文件。
在这里插入图片描述

/userList=com.rtl.servlet.UserListServlet
/login=com.rtl.servlet.UserLoginServlet
/bank=com.rtl.servlet.BankServlet

2、配置文件写好之后,继续写Tomcat.class,在启动的时候,需要对它进行解析。(IO流)

 //这里就是Tomcat模拟解析配置文件里面请求路径和xxxServlet的映射关系。
        FileReader reader = new FileReader("web.properties");
        Properties pro = new Properties();
        pro.load(reader);
        reader.close();

3、解析之后,我们可以根据前面用户输入的请求路径,再结合这个解析配置文件之后得到的Properties对象,就知道对应的具体待执行的Servlet类了,但是对于Tomcat开发商来说不知道具体的,但是它知道你一定实现了Servlet接口。

//根据用户的请求路径来获取value值,就是具体的Servlet的类名
        String className = pro.get(path);
        Class clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        //拿到这个obj之后,Tomcat服务器的开发者是不知道具体是哪个Servlet的,但是它一定知道这个具体的Servlet的类
        //实现了接口Servlet,所以,我们可以把这个得到的obj强转成Servlet类。
        Servlet servlet = (Servlet) obj;
        servlet.service();

非常重要的Tomcat.java完整版:

package org.apache;
import javax.rtl.servlet;
import java.io.FileReader;
import java.util.Properties;
import java.util.Scanner;

public class Tomcat{
    public  static void main(String[] args) throws Exception{
        System.out.println("Tomcat服务器启动成功!开始接收用户的访问。");
        System.out.println("请输入您的访问路径:");
        Scanner s = new Scanner(System.in);
        //接收用户输入的请求路径
        String path = s.nextLine();

        //这里就是Tomcat模拟解析配置文件里面请求路径和xxxServlet的映射关系。
        FileReader reader = new FileReader("web.properties");
        Properties pro = new Properties();
        pro.load(reader);
        reader.close();

        //根据用户的请求路径来获取value值,就是具体的Servlet的类名
        String className = pro.get(path);
        Class clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        //拿到这个obj之后,Tomcat服务器的开发者是不知道具体是哪个Servlet的,但是它一定知道这个具体的Servlet的类
        //实现了接口Servlet,所以,我们可以把这个得到的obj强转成Servlet类。
        Servlet servlet = (Servlet) obj;
        servlet.service();

    }
}

现在开始i运行程序:

在这里插入图片描述
我们先编译所有的java文件:

javac -encoding UTF-8 -d . *.java

在这里插入图片描述

编译好程序之后,现在开始运行程序:

先是启动Tomcat服务器:

java org.apache.Tomcat

在这里插入图片描述
启动Tomcat之后,就等待我们输入请求路径了。
输入请求路径之后,会执行对应的Servlet方法。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐