JavaWeb - Tomcat&Http&Servlet

JavaWeb - Tomcat&Http&Servlet

1 Tomcat

1.1 软件架构

  • C/S架构 - client/server

    • 优点:体验好
    • 缺点:对客户端和服务器都进行维护
  • B/S架构 - browser/server

    • 特殊的c/s架构
    • 优点:维护简单,因为通过浏览器直接访问不需要下载客户端
    • 体验稍差

1.2 资源的分类

  • 静态资源:

    • 同一资源不同用户看到同样内容
    • html,js,css
  • 动态资源:

    • 浏览器只能解析静态资源,响应前需要转换(tomcat)
    • 同一资源不同用户看到不同内容
    • jsp,aspx,php

1.3 URL请求路径

Uniform Resource Locator 统一资源定位符,互联网上资源有唯一URL

格式:

协议://域名:端口号/资源位置?参数=值

  • 协议:http,https,ftp
  • 域名或IP地址,访问web资源
  • 端口号:程序需要端口让另一台计算机访问,http默认端口80
  • 资源位置:web资源在服务器上的位置
  • 参数=值:浏览器和服务器交互传递的数据

常见web服务器:

  • Tomcat - 58%
  • JBoss/WildFly - 20%
  • Jetty - 10%
  • Glassfish - 5.55%
  • Weblogic - 2.8%

1.4 Tomcat的内容目录

1.4.1 内容目录
1.4.2 启动关闭Tomcat脚本
1.4.3 Tomcat启动报错
  • 1 窗口弹出一闪而过

    • 需配置好Java环境变量 - JAVA_HOME
  • 2 8080端口被占用

    • 2.1 找到占用端口相关进程并杀死进程
  • 2.2 修改Tomcat端口号
  • 3 如需启动两个tomcat除了设置该位置两个不同的端口
  • 还需修改关闭端口
  • 4 启动日志乱码问题

1.5 Tomcat项目发布三种方式

1.5.1 webapps部署
  • 热部署,不需要重启Tomcat即可更新资源
  • 更新需要在该目录下使用更新后的项目替换
1.5.2 server.xml 部署
  • 在该文件中标签中添加标签
  • 配置文件修改完成后,需要重启生效
1.5.3 独立xml部署
  • 在tomcat/Catalina/localhost 目录下创建xml文件并添加标签
  • 支持热部署

1.6 IDE配置Tomcat

1.6.1 项目结构
1.6.2 页面资源热更新

2 Http

2.1 Http协议
2.1.1 特点:
  • 基础协议:TCP协议
  • 默认端口号:80端口
  • 基于请求/响应模型:请求和响应成对出现,先请求后响应
  • 无状态协议:各请求间相互独立,不能交互数据
2.1.2 版本
  • Http/1.0 发送请求,创建一次连接,获得一个web资源,连接断开
    • 每次请求都是一个新的连接,根据TCP建立
  • Http/1.1 发送请求,创建一次连接,获得多个web资源,连接断开
    • 长连接,多个请求可以复用同一个连接
2.1.3 报文格式

请求报文:客户端发送给服务器端的报文

响应报文:服务器端返回给客户端的报文

2.1.3.1 请求报文

格式:请求行,请求头,空行,请求体

请求行:

  • 请求方式
    • 协议规定7种,常用2种(get和post)
    • get 请求参数拼接在URL后不安全
    • URL长度限制get请求数据的大小
    • 无请求体
    • post请求数据大小没有限制,且请求参数安全
  • URL
  • 协议版本

请求头:key:value对

  • http协议类型,编码,发送内容长度等

  • Referer:直接访问没有,转发则告诉请求来自何处

  • Cookie:存放浏览器缓存cookie信息

  • User-Agent:浏览器与操作系统信息

空行

请求体:表单 POST方式提交的数据(请求参数)

  • 多值使用&连接
2.1.3.2 响应报文

格式:响应行,响应头,空行,响应体

响应行:

  • 协议/版本
  • 状态码
    • 200:请求成功
    • 302:请求重定向
    • 304:访问本地缓存
    • 404:请求资源不存在
    • 500:服务器内部错误,通常程序抛异常
  • 状态码描述

响应头:

  • Location:指定响应的路径,与302状态码搭配使用完成跳转
  • Content-Desposition:文件下载时使用,以下载的方式解析正文
  • Set-Cookie:服务器向浏览器写入Cookie
  • Refresh:定时刷新

空行

响应体:返回给浏览器的数据

3 Servlet

3.1 概述

接口,类想被浏览器访问需要实现该接口

接受请求,处理逻辑,响应结果

3.2 快速实现

  • web项目

  • java类实现业务逻辑并实现servlet接口

  • web.xml种配置url-pattern:通过反射机制创建该对象并调用该对象里service方法

  • 精确匹配

  • 目录匹配:/aa/*

  • 后缀匹配:*.xxx 比如 *.do

  • 部署web项目

3.3 生命周期

默认生命周期

  • 开启Tomcat不会创建实例

  • 第一次访问该servlet创建实例(单实例)并调用init方法

  • 接着调用service方法

  • 之后每次请求访问都通过该实例创建线程访问

  • 服务器关闭,servlet销毁执行destory方法

  • 可以通过配置在启动tomcat是实例化servlet对象,默认值是-1,不自动创建,建议数值4-N

体系结构

接口 Servlet:顶级接口,提供5个声明方法

​ |

抽象类 GenericServlet:抽象类,只需重写service方法即可

​ |

抽象类 HttpServlet:抽象类,处理http协议中的交互(请求,响应),根据不同请求方式做出处理,重写doGet和doPost方法

3.4 Request对象

Tomcat将HTTP请求所有信息都封装到Request对象中

Request对象API获取请求行,请求头,请求体

接收请求参数中文乱码:

  • get: tomcat8及以上,内部URL编码(UTF-8),不会中文乱码
  • post:
    • 客户端(浏览器)编码:UTF-8
    • 服务器默认解码:ISO-8859-1 拉丁文
    • setCharacterEncoding("UTF-8"); 方法内首行
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求行
        System.out.println("请求方式"+req.getMethod());
        System.out.println("项目名"+req.getContextPath());
        System.out.println("URL"+req.getRequestURI());
        System.out.println("协议版本"+req.getProtocol());
        System.out.println("IP"+req.getRemoteAddr());
        System.out.println("--------------------------------------------");
        //获取请求头
        System.out.println(req.getHeader("Host"));

        //获取请求头所有信息
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String s =  headerNames.nextElement();
            System.out.println(s+":"+req.getHeader(s));
        }
        System.out.println("--------------------------------------------");

        //获取请求参数
        System.out.println("用户名"+req.getParameter("username"));

        //获取多个值的参数
        String[] hobbies = req.getParameterValues("hobby");
        System.out.print("hobby: ");
        for (String hobby : hobbies) {
            System.out.print(hobby+" ");
        }
        System.out.println();

        //获取所有
        Map<String, String[]> parameterMap = req.getParameterMap();
        parameterMap.forEach((k,v)->{
            System.out.print(k+":");
            for (String s : v) {
                System.out.print(s+" ");
            }
            System.out.println();
        });

        System.out.println("--------------------------------------------");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        doGet(req,resp);
    }
}

3.5 请求转发

API:

  • request对象获取转发器对象

    • RequestDispatcher getRequestDispatcher(String path)//要跳转到的资源路径
  • 转发器对象实现转发

    • void forward(ServletRequest request, ServletResponse response)

特点:

  • 浏览器:发出一次请求
  • 地址栏:没有变化
  • 转发只能是服务器内部资源

3.6 Request域对象

API:

  • 设置数据

    • void setAttribute(String naem)
  • 获取数据

    • Object getAttribute(String name)
  • 删除数据

    • void removeAttribute(String name)

生命周期:

  • 创建:用户发送请求,创建request
  • 销毁:服务器返回响应,销毁request
  • 范围:一次请求,包含多次转发

3.7 Response对象

体系结构:

ServletResponse 接口
		|
HttpServletResponse 接口
		|
org.apache.catalina.connector.ResponseFacade 实现类(tomcat提供)

响应行:

API:

  • 设置状态码
    • void setStatus(int sc)

响应头:

API:

  • 设置指定头名称和值
    • void setHeader(String name,String value)

响应体:

API:

  • 字符输出流

    • PrintWriter getWriter()
  • 字节输出流

    • ServletOutputStream getOutputStream()

同一servlet种两种输出流不能同时存在

3.8 响应重定向

方式一:

  • 设置状态吗

    • response.setStatus(302);
  • 设置响应头Location

    • response.setHeader("Location","重定向的网络地址")

方式二:

response.sendRedirect("重定向的网络地址")

特点:

  • 地址栏会发生改变
  • 重定向是而此请求
  • 客户端(浏览器行为),可跳转到服务器外部资源
  • 不能用request域共享数据

中文乱码:服务器 ISO-8859-1 浏览器GBK

  • 第一种方式:指定服务器响应编码方式,写在首行

    • resp.setCharacterEncoding("GBK")
  • 第二种方式:统一浏览器和服务器编码

    • resp.setContentType("text/html;charset=utf-8")

3.9 ServletContext 对象

3.9.1 作用
  • 域对象(共享数据)
  • 获取资源在服务器的真实地址
  • 获取全局的参数配置
  • 获取问MIME类型
3.9.2 获取方式
  • request对象获取

    • req.getServletContext();
  • 基层HttpServlet后直接调用

    • this.getServletContext();
3.9.3 域对象

API:

  • 存储数据

    • void setAttribute(String name, Object value)
  • 获取数据

    • Object getAttribute(String name)
  • 删除数据

    • void removeAttribue(String name)

范围:

当前项目范围,多个servlet可共享

3.9.4 获取资源在服务器真实地址

API:传入项目下的映射路径,获取真实路径

  • String getRealPath(String path);
3.9.5 获取全局配置参数
<context-param>
        <param-name>username</param-name>
        <param-value>guanyu</param-value>
    </context-param>
    
 req.getServletContext().getInitParameter("username")   
3.9.6 获取MIME类型

格式:大类型/小类型

  • text/html image/jpeg
req.getServletContext().getMimeType(".jpg")
posted @ 2020-11-17 12:33  Pengc931482  阅读(134)  评论(0)    收藏  举报