01_Tomcat&Servlet

2019-09-29  本文已影响0人  渐进逾

软件架构

BS:Browser Server
image.png

浏览器-服务器模式。客户端使用浏览器来访问服务器。
特点:必须在本地电脑安装每一种客户端软件
特点:

  1. 客户端使用的是浏览器,只要有浏览器就可以执行我们程序。
  2. 服务器升级,客户端可以无缝升级,就可以直接使用最新的功能。
CS:Client Server
image.png

客户端-服务器模式。用户需要在本地电脑上安装客户端软件,再来访问服务器。
特点:
必须在本地电脑安装每一种客户端软件
如果服务器器升级,每个客户端也需要升级。服务器会经常升级,导致客户端会经常进⾏升级并且安装。

web资源

web资源——
浏览器能看到的资源都是web资源
资源分类——
静态资源:
浏览器访问的资源是服务器上的物理文件(html,jpg,png,js,css)

动态资源:
浏览器访问的资源是服务器运行的代码(java代码)产生的数据

动态资源技术:
servlet,JSP,asp.net,PHP,Python

web服务器

介绍:
web服务器就是运行在高性能计算机上的一个软件,软件对外提供服务。那么这台电脑统称服务器

作用:
有能力将本地的资源(静态和动态)提供给外界用户使用浏览器访问。

常见web服务器软件的介绍

1.weblogic,oracle公司

2.websphere,ibm公司

3.其他


image.png

4.Tomcat,apache开源组织,免费


image.png

tips:
浏览器与服务器的底层通信原理技术是socket网络编程

tomcat下载与安装

tomcat启动命令:startup.bat

tomcat服务器占用端口号:8080

Tomcat安装常见问题:

1.没有设置环境变量JAVA_HOME
2.tomcat端口8080被占用

tomcat目录结构介绍
image.png

bin:命令目录

conf:配置目录

webapps:发布资源目录

logs:日志

tomcat发布资源方式1-webapps发布

webapps目录发布资源,这个目录也叫服务器资源根目录
webapps是发布资源目录,资源文件必须放在资源目录下,如果希望不写资源目录访问资源,那么必须将资源文件放到ROOT目录下, 否则其他资源文件必须使用资源目录名字才可以访问

tomcat发布资源方式2-server.xml虚拟目录发布

虚拟目录资源发布方式可以将资源发布服务器的外部(不在webapps里面)
步骤——
修改配置文件server.xml,在host标签里面增加Context标签节点

<Context path="虚拟资源目录"  docBase="真实发布资源目录"/>

浏览器访问路径:http://localhost:8080/虚拟资源目录/资源路径


image.png

这种方式改了配置文件,需要重启服务器才有效果

tips:
tomcat服务器全局web.xml文件(tomcat/conf/web.xml)默认欢迎页面的设置

tomcat发布资源方式3-独立xml虚拟目录发布
实现步骤
  1. 准备一个独立xml文件,里面需要配置Context标签节点


    image.png
  2. 将这个配置文件放到apache-tomcat-8.5.27\conf\Catalina\localhost目录下,服务器自动加载配置文件
    将这个配置文件放到apache-tomcat-8.5.27\conf\Catalina\localhost目录下,服务器自动加载配置文件

3.观察服务器是否加载了配置,如果加载了,再进行浏览器访问


image.png

tips:独立xml虚拟目录发布的好处:
不用重启服务器

IDEA绑定tomcat

使用idea操作tomcat启动、关闭、部署项目

Servlet开发体验1-Servlet2.5配置文件方式

servlet介绍

一个 服务端Java的小应用程序,全称server applet ,运行在Web 容器中,处理用户的请求并且做出响应数据给浏览器。

作用分析
image.png

浏览器提交url请求,tomcat服务器根据url路径调用指定的servlet程序处理请求与响应。

作用:处理请求与响应

Servlet开发体验1-Servlet2.5配置文件方式
创建一个新类继承HttpServlet,重写doGet处理请求方法进行处理请求与响应
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Demo1Servlet extends HttpServlet {

    /**
     * 用来处理get请求与响应
     *      request是请求对象,用来获取所有请求数据的
     *      response是响应对象,用来输出数据给浏览器的
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //给浏览器输出一句“hello servlet2.5”
        //1.获取输出流可以输出数据给浏览器
        PrintWriter out = response.getWriter();
        //2.输出数据
        out.write("hello servlet2.5");
    }

    /*
    * 用来处理post请求与响应
    * */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
配置web.xml让用户访问的路径找到servlet去执行处理请求与响应
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">

    <!--目标:配置用户访问的url与DemoServlet映射关系,目的是访问url就找到DemoServlet处理请求与响应
        1.定义DemoServlet类全名
        2.定义url关联DemoServlet
            url定义格式:/资源名字,  /代表当前项目内,必须有
            浏览器访问:http://localhost:8080/资源目录/资源名字
            例子:http://localhost:8080/资源目录/demo
    -->
    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>com.itheima.servlet.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>

</web-app>

步骤——
配置文件方式:需要手动进行web.xml配置用户访问的路径与servlet进行映射

开发servlet的步骤:

  1. 创建类继承HttpServlet
  2. 重写doGet方法
  3. 配置web.xml
  4. 部署项目

Servlet开发体验2-Servlet3.0注解配置方式

实现步骤
  1. 使用idea创建web应用程序
  2. 创建一个类Demo1Servlet继承HttpServlet重写doGet方法(我们自己的类就是Servlet),处理用户的请求与响应数据给浏览器
  3. 在Demo1Servlet类上面配置注解(配置url路径)
  4. 部署资源到服务器上.(使用idea工具部署项目)

创建Servlet并重写doGet方法——
配置注解进行用户访问的url映射到servlet


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/*
* 注解方式给servlet绑定url
* @WebServlet  注解
*   name = "Demo1Servlet", 功能与web.xml中的<servlet-name>一样,这个属性可有可无
*   urlPatterns = "/demo",功能与web.xml中的<url-pattern>一样,这个属性必须有
* */
@WebServlet(name = "Demo1Servlet",urlPatterns = "/demo")
public class Demo1Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //给浏览器输出一句“hello servlet3.0”
        //1.获取输出流可以输出数据给浏览器
        PrintWriter out = response.getWriter();
        //2.输出数据
        out.write("hello servlet3.0");
    }
}

配置模板操作:


image.png

添加的代码:

,urlPatterns="/${Entity_Name}"
doGet(request,response);
Servlet3.0新特性
  1. 新增了一些注解,简化的 javaweb 代码开发,可以省略 web.xml 配置文件。

  2. 支持异步处理:多线程技术。

  3. 支持可插性特性:书写的代码编译后生成的 class 文件可以直接部署到其他项目自动加载执行。

    servlet2.5写的java代码编译后放到服务器上,需要重启服务器

    servlet3.0不需要,直接服务器识别

tips:
1.servlet2.5与servlet3.0区别——
2.5需要手动配置web.xml
3.0只需要配置注解

2.servlet程序与普通java类的区别
普通java类型需要main方法才能运行
servlet程序是有tomcat服务器调用的运行

Servlet体系结构

体系结构关系

查看某一个类的体系结构,光标放到类的上面使用Ctrl+Alt+U


image.png

Servlet接口都有什么方法


image.png
GenericServlet 类

实现了Servlet接口,重写很多方法

HttpServlet类(重要)

HttpServlet类继承GenericServlet接口,重写service方法,判断是什么请求类型,如果是get请求走子类的doGet方法,如果是post请求,都子类doPost方法。

Servlet映射路径1—配置多个路径

个servlet可以通过多个不同路径访问吗?

可以,给servlet配置多个路径
映射路径匹配方式
  1. 精确匹配
    上面讲的都是属于精确匹配,配置的url与用户访问的url要一模一样才可以访问到对应的servlet.

  2. 模糊匹配
    模糊匹配使用一个通配符“”号,只有这一个通配符。
    通配符匹配使用只有2种方式:
    1.前缀匹配,必须以“/”开头,以“
    ”结尾(前面必须有/)
    例子,/abc/
    ,只要用户访问时/abc/开头都可以匹配到
    2.后缀匹配,必须以“”开头,以“.”扩展名方式结束使用
    例子,
    .do,只要用户访问时以.do结尾都可以匹配到

tips:
注意:/abc/*/abc既不属于前缀也不属于后缀,属于精确匹配

注解方式实现
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/*
*   模糊匹配使用一个通配符“*”号,代表0到多个任意字符,只有这一个通配符。
    通配符匹配使用只有2种方式:
    1.前缀匹配,必须以“/”开头,以“/*”结尾
      例子,/abc/*,只要用户访问时/abc/开头都可以匹配到
    2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用
      例子,*.do,只要用户访问时以.do结尾都可以匹配到

    urlPatterns属性设置有2种方式
        设置一个url:urlPatterns = "/UrlPatternServlet"
        设置多个url:urlPatterns = {"/UrlPatternServlet","xxx","xxx",...}
 */


@WebServlet(name = "UrlPatternServlet", urlPatterns = {
        //精确匹配
        "/UrlPatternServlet","/123/*/123",
        //模糊匹配-前缀匹配
        "/abc/*",
        //模糊匹配-后缀匹配
        "*.do"
})
public class UrlPatternServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("hello UrlPatternServlet");
    }
}
xml配置文件方式实现

1.可以配置多个url-pattern

<servlet-mapping>
    <servlet-name>Demo1Servlet</servlet-name>
    <url-pattern>/demo1</url-pattern>
    <!-- 可以配置多个url-pattern -->
     <url-pattern>/hello</url-pattern>
     <url-pattern>/hello.html</url-pattern>
  </servlet-mapping>

2.可以配置多个servlet-mapping

<servlet-mapping>
    <servlet-name>Demo1Servlet</servlet-name>
    <url-pattern>/demo1</url-pattern>
    <!-- 可以配置多个url-pattern -->
    <url-pattern>/hello</url-pattern>
    <url-pattern>/hello.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Demo1Servlet</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>

tips:
面试题:


image.png
Servlet映射路径2—缺省路径

servlet映射路径配置为“/”和“/*”,会处理什么路径资源的请求?
可以匹配任何资源路径的访问,这个路径会导致静态资源无法访问

缺省路径介绍——
“/”和“/*”`就是缺省路径,缺省路径可以匹配一切资源。该映射路径已经被全局tomcat/conf/web.xml使用了,其中DefaultServlet配置了缺省路径。DefaultServlet是用于处理静态资源响应的。

静态资源访问流程——


image.png

tips:

Servlet生命周期

就是一个对象从创建到销毁的过程
servlet是由服务器创建的

在用户第一次访问servlet的时候服务器创建的servlet对象,只创建了一次,全局唯一。

ServletConfig配置参数

作用:
可以读取web.xml中或注解对当前servlet配置的参数数据

api
image.png
注解方式实现
@WebServlet(name = "UserServlet", urlPatterns = "/UserServlet",
            initParams = { 
                    @WebInitParam(name = "参数名1",value = "参数值1"),
                    @WebInitParam(name = "参数名2",value = "参数值1"),
                }
           )
xml配置文件方式实现【重点】
<!--配置ServletConfigServlet的参数数据-->
    <servlet>
        <servlet-name>ServletConfigServlet</servlet-name>
        <servlet-class>_04ServletConfig读取配置参数数据.ServletConfigServlet</servlet-class>
        <!--配置参数数据-->
        <init-param>
            <param-name>username</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>20</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletConfigServlet</servlet-name>
        <url-pattern>/ServletConfigServlet</url-pattern>
    </servlet-mapping>

读取数代码:

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;


public class ServletConfigServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

        //1.获取参数名称列表,Enumeration是一个古老的迭代器
        Enumeration<String> enumeration = config.getInitParameterNames();
        //2.遍历列表,循环读取每一个参数数据
        while(enumeration.hasMoreElements()){
            //获取当前元素为参数名字
            String paramName = enumeration.nextElement();
            //根据参数名字获取参数值
            String paramValue = config.getInitParameter(paramName);

            System.out.println(paramName+"="+paramValue);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
Servlet运行原理

(时序图)


image.png

服务器根据url找到类全名,通过反射Class.forName(servlet类全名)创建了servlet对象,服务器将所有请求数据封装到request对象中,所有响应数据封装到response中,将request和response传入service方法,是使用反射调用service方法。

案例-显示用户列表

上一篇 下一篇

猜你喜欢

热点阅读