每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

JavaWeb基础知识笔记

1.基本概念

前言
  • web开发
    • web,网页如:www.baidu.com
    • 静态web:html,css
      • 提供给所有人看的,数据始终不会变化
    • 动态web:
      • 千人千面,淘宝
      • 技术栈:Servlet/JSP,ASP,PHP
    • 在java中,动态web资源开发的技术统称为javaweb
  • 网络通信三要素
    • IP:电子设备在计算机网络中唯一的标识符
    • 端口:应用程序在计算机中唯一的标识 0~65536
    • 传输协议:规定了数据的传输规则
      • tcp udp
web应用程序
  • web应用程序:可以提供浏览器访问的程序;
    • a.html,b.html... ...多个web资源可以被外界访问,对外界通过服务
    • 任何一个资源或者页面都存在于某一台计算机上
    • URL-统一资源定位符
    • 统一的web资源会被放在同一个文件夹下,web应用程序--->通过Tomcat:服务器,启动
    • 一个web应用又多个部分组成:(静态web,动态web)
      • html,css,js
      • jsp,servlet
      • java程序
      • jar包
      • 配置文件(properties)
    • web应用程序编写完毕后,提供给外界访问需要一个服务器来统一管理;
静态web
  • *.htm *.html为网页后缀,通过网络进行读取

    客户端---->服务器---->.html

  • 静态web的缺点

    • web页面无法动态更新
    • 无法和数据库交互(数据无法持久化,用户无法交互)
动态web
  • 页面动态展示:千人千面

    客户端---->webserver plugin---->webserver---->file system

    ​ | |

    ​ 动态web资源jsp/servlet----->数据库

  • 缺点

    • 动态web资源出现错误,需要重新编写后台程序,重新发布
  • 优点

    • 动态更新,与数据库交互,数据持久化

2.web服务器

  • web服务器
    • 服务器:安装了服务器软件的计算机

    • 服务器软件:接受用户请求,处理请求,作出响应

    • web服务器:可以部署web项目,处理请求,做出响应

    • 服务器是一种被动操作,用来处理用户的一些请求和给用户一些响应;

  • 技术流派:
    • ASP 微软:
      • 最早流行的,在html中嵌入yeweudaima入了vb脚本,ASP+COM
      • 在ASP中,业务代码繁多,维护困难
      • 使用C#语言
      • iis服务器
    • PHP
      • 开发速度快,功能强大,跨平台,代码简单
      • 无法承载大访问情况(局限性)
    • JSP/Servlet
      • sun公司主推的B/S架构
      • 基于java语言
      • 可以承载三高问题带来的影响

TOMcat

  • 配置

    • 部署项目的方式

      • 直接将项目放到webapps目录下即可

        • /name:项目的访问路径---->虚拟目录name
        • 简化部署:将项目打包成一个war包,将war包放置到webapps目录下
          • war包会自动解压缩
      • 配置conf/server.xml文件

        • <Host>标签体中配置

          <Context docBase="项目路径" path="虚拟目录">

      • 在conf\Catalina\localhost创建任意名称的xml文件,在文件中编写

        <Context docBase="项目路径">

        • 创建的xml文件名称就是虚拟目录
    • 静态项目和动态项目

      • 目录结构

        • java动态项目的目录结构

          • 项目根目录

            • WEB-INF目录

              • web.xml:web项目的或许配置文件
              • classes目录:放置字节码文件
              • lib目录:放置项目依赖的jar包

Servlet:server applet

  • 概念:运行在服务器端的小程序
    • servlet就是一个接口,定义了java类被浏览器访问到(tomcat识别的规则)

  • 定义一个类型实现Servlet方法

  • 快速入门:

    • 定义一个类实现Servlet接口

    • 实现接口中的方法

    • 配置Servlet

      • web.xml文件添加映射

        <servlet>
        	<servlet-name>demo01</servlet-name>
        	<servlet-class>com.km.Servletstudy01.ServletDemo01</servlet-class>
        </servlet>
        <servlet-mapping>
        	<servlet-name>demo01</servlet-name>
        	<url-pattern>/test</url-pattern>
        </servlet-mapping>
        
    • 执行原理:

      • 当服务器接收到客户端浏览器的请求之后,会解析请求URL路径,获取访问的Servlet的资源路径

      • 查找web.xml文件,是否有对应的<url-pattern>标签体内容

      • 如果有,则找对应的<servlet-class>全类名

      • tomcat会将字节码文件加载进内存,并创建其对象

      • 调用其方法

  • Servlet中的方法

    • 被创建:执行init方法,只会执行一次

      • 默认情况时,第一次被访问时,Servlet被创建

      • 指定Servlet的创建时机

      • Servlet的init的方法只执行一次,说明其在内存中只有一个对象,是单例的,存在线程安全问题,对于定义在Servlet中的成员变量避免修改其值

        <load-on-startup>num</load-on-startup>
        <!--第一次被访问的时候创建num为负整数-->
        
      
      
    • 提供服务:执行service

    • 被销毁:只有正常关闭才会执行destory方法

          /**
           * 初始化方法
           * 在Servlet创建时执行,只会执行一次,第一次访问的时候执行
           * @param servletConfig
           * @throws ServletException
           */
          @Override
          public void init(ServletConfig servletConfig) throws ServletException {
      
          }
      
          /**
           * 获取ServletConfig对象
           * ServletConfig:Servlet的配置对象
           * @return
           */
          @Override
          public ServletConfig getServletConfig() {
              return null;
          }
      
          /**
           * 提供服务
           * 每次servlet被访问时,执行,执行多次
           * @param servletRequest
           * @param servletResponse
           * @throws ServletException
           * @throws IOException
           */
          @Override
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
              System.out.println("hello");
          }
      
          /**
           * 获取Servlet的一些信息,版本,作者
           * @return
           */
          @Override
          public String getServletInfo() {
              return null;
          }
      
          /**
           * 服务器被正常关闭的时候执行,只会执行一次
           */
          @Override
          public void destroy() {
      
        }
      
    • 在Servlet3.0以上版本中,可以免去配置web.xml文件通过@WebServlet()进行配置

      String name() default ""; 
      String[] value() default {};
      String[] urlPatterns() default {};//虚拟目录
      @WebServlet({"/test","/test2"})//一个注解配置的实例
      
    • 在idea中为每一个项目配置了一份单独的tomcat的配置文件,在启动记录可以查看,工作空间中的web项目使用第二种部署模式<Context docBase="项目路径">

    • 在工作空间项目和tomcat部署的web项目中,tomcat真正访问的是tomcat部署的web项目

    • WEB-INF目录下的资源不能被浏览器直接访问

  • Servlet的体系结构

    • Servlet----接口

      ​ |

    • GenericServlet----抽象类:将Servlet接口中除service()的其他方法做了默认空实现,定义Servlet时通过继承GenericServlet | 秩序实现Servlet()方法即可

    • HttpServlet----抽象类:对http协议进行了封装、简化,通过继承HttpServlet复写doGET/doPOST方法

  • Servlet相关配置

    • urlPartten:Servlet访问路径
      • 一个Servlet可以定义多个访问路径:@webServlet({"/url1","/url2","/url3"})
      • 路径的定义规则
        • /XXX
        • /XXX/XXX:多层路径,目录结构
        • *.do

HTTP

  • 概念:Hyper Text Transfer Protocal、超文本传输协议

    • 定义了客户端和服务器端通信时,发送数据的格式
  • 特点:

    • 基于TCP/IP的高级协议
    • 默认端口号:80
    • 基于请求/响应模型:一次请求对应于一次响应
    • 无状态的:每次请求之间相互独立的,不能交互数据
  • 历史版本:

    • 1.0版本:每一请求都会创建一个新的连接
    • 1.1版本:复用连接
  • 请求消息的数据格式:

    • 请求行

      • 请求方式 请求url 请求协议/版本

        GET /java_02_Servlet_war_exploded/ HTTP/1.1

      • 请求方式:

        • HTTP协议有七种,常见的有两种
          • GET:
            • 请求参数在请求行中
            • 请求的url长度有限制
          • POST:
            • 请求参数在请求体中
            • 请求的url长度长度没有限制
            • 相对安全
    • 请求头:客户端告诉浏览器的一些信息

      Host: localhost:8080
      Connection: keep-alive
      Cache-Control: max-age=0
      DNT: 1
      Upgrade-Insecure-Requests: 1
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
      Referer: http://localhost:8080/java_02_Servlet_war_exploded/
      Accept-Encoding: gzip, deflate, br
      Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
      Cookie: JSESSIONID=C07083980CC487F745690FAD6B70DA9F; Idea-501a323b=997da08b-cdc4-4b00-b142-bfaff8717b82
      
      • 格式:请求头名称:请求头值
      • 常见的请求头:
        • User-Agent:告知服务器使用的浏览器版本,服务器可以获取该头消息,解决浏览器兼容性问题
        • Accept-Encoding:可接受的压缩包格式
        • Accept-Language:可接受的语言
        • Connection: keep-alive:可以复用连接
        • Referer:告知服务器链接的来源
          • 防止盗链
          • 统计工作
    • 请求空行

      • 空行,用于分隔POST请求的请求行于请求体
    • 请求体(正文)

      • 封装POST请求消息的请求参数

Request

  • Request和Response对象的原理

    • Request和Response对象由服务器来创建
    • Request对象用于获取请求消息
    • Respond对象用于设置响应消息
  • Request:获取请求消息

    • Request对象的继承体系结构

      Servlet----接口

      ​ |

      HttpServletRequest----接口

      ​ |

      RequestFacade----由Tomct实现的类

  • Request功能

    • 获取请求消息数据

      • 获取请求行数据

        http://localhost:8080/java_study/user/demo1?name=Carl+Jones
        
        • String getMethod():获取请求数据---->GET/POST
        • (*)String getContextPath:获取虚拟目录---->/java_study
        • String getServletPath():获取Servlet路径---->/user/demo1
        • String QueryString():获取get方式的请求参数---->name=Carl+Jones
        • (*)String getRequestURI():获取请求URI---->/java_study/user/demo1
        • String getRequestURI():获取请求URL---->http://localhost:8080/java_study/user/demo1
          • URL:统一资源定位符---->中华人民共和国
          • URI:统一资源标识符---->共和国(Uniform Resource Identifier)
        • String getProtocal():获取协议及版本
        • String getRemoteAddr():获取客户端IP
      • 获取请求头数据

        • (*)String getHeader(String name):通过请求头的名称获取请求头的值
        • Enumeration getHeaderNames():获取所有的请求头名称
      • 获取请求体数据

        • 请求体只有POST请求方式才会有请求头,请求体中封装了POST请求的请求参数
        • 步骤:
          • 获取流对象
            • BufferedReader getReader():获取字符输入流,只能操作字符数据
            • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据
          • 再从流中获取数据
      • 其他功能:

        • 获取请求参数通用方式:POST,GET都可以使用

          • String getParameter(String name):根据参数获取请求参数值

          • String[] getParameterValues(String name):根据参数获取请求参数值的数组---->用于复选框

          • Enumeration getParameterNames():获取所有请求参数的名称

          • Map<String,String> getParameterMap():获取所有参数的map集合

          • 中文乱码问题:

            • get方式:tomcat 8将get方式的乱码问题解决了

            • post方式:会乱码、解决方式设置request的编码

              request.setCharacterEncoding("utf-8")
              
        • 请求转发:一种在服务器内部的资源跳转方式

          • 步骤
            • 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
            • 使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletRespons respons)
          • 特点
            • 浏览器路径栏路径不会发生改变
            • 只能转发到服务器内部的资源
            • 多个资源间使用同一个请求
        • 共享数据

          • 域对象:一个有作用范围的对象,可以在范围内共享数据
          • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
            • 方法:
              • void setAttribute(String name,Object obj):存储数据
              • Object getAttribute(String name):通过键获取值
              • void removeAttribute(String name):移除数据
        • 获取ServletContext

          • ServletContext getServletContext()
        • BeanUtils工具类,简化数据封装

          • JavaBean:标准的Java类

            • 类必须被public修饰
            • 必须提供空参的构造器
            • 成员变量必须使用private修饰
            • 提供公共的getter和setter方法
            • 功能:封装数据
          • 概念:

            • 属性:getter和setter方法截取之后的产物
              • 例如:getUsername()---->Username---->username
          • 方法:

            • setProperty():操作属性
            • getProperty():操作属性
            • populate(Object obj,Map map):将map集合中的键值对信息,封装到对应的JavaBean对象中,键当作属性的名称,值当作属性对应的值

Response

  • 响应消息的数据格式

    • 响应行

      • 组成:协议/版本 响应状态码 状态码描述
      • 响应状态码:服务器告知的客户端浏览器本次请求和响应的一次状态
        • 状态码为三位数字
        • 分类:
          • 1xx,服务器接收客户端消息但没有接收完全,等待一段时间后发送1xx状态码确认客户端
          • 2xx,成功
          • 3xx,重定向 302重定向 304访问缓存
          • 4xx,客户端错误,404客户端请求的资源错误没有对应的资源,405请求方式没有对应的方法... ...
          • 5xx,服务器端错误 500服务器内部出现异常
    • 响应头

      • 格式:头名称:值
      • Content-Type:告知客户端本次响应体的格式
      • content-disposition:告知客户端打开响应体数据的格式
        • inline,默认值,在当前页面打开
        • attachment,filename=xxx,以附件形式打开响应体,文件下载
    • 响应空行

    • 响应体

      HTTP/1.1 200
      Content-Type: text/html;charset=utf-8
      Content-Length: 15
      Date: Wed, 28 Oct 2020 02:25:31 GMT
      Keep-Alive: timeout=20
      Connection: keep-alive
      
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>登陆界面</title>
          <style>
              div{
                  margin: auto;
              }
          </style>
      </head>
      <body>
          <div>
              <form action="/java_study/login" method="post">
                  <label for="username">用户名</label><input type="text" name="username" id="username" placeholder="请输入用户名"><br>
                  <label for="password">密码:</label><input type="password" name="password" placeholder="请输入密码" id="password"><br>
                  <input type="submit" value="登录">
              </form>
          </div>
      </body>
      </html>
      
  • 功能:设置响应消息

    • 设置响应行
      • 格式:HTTP/1.1 200 OK
      • 设置状态码:setStatus(int sc)
    • 设置响应头:
      • setHeader(String name,String value)
    • 设置响应体
      • 1.获取输出流
        • 字符流:PrintWriter getWriter()
        • 字节输出流:ServletOutputStream getOutputStream()
      • 2.使用输出流,将数据输出到客户端
  • 重定向:资源转发的一种方式

    方法一:

    resp.setStatus(302); //设置响应状态
    resp.setHeader("location","/java_study/response01"); //设置响应头,重定向访问路径
    

    方法二:

    resp.sendRedirect("/java_study/response01"); //简单的重定向方法
    
  • 与转发的比较:

    • 转发:
      • 转发地址栏路径不变
      • 转发只能访问当前服务器下的资源
      • 转发是一次请求
      • 可以使用request域共享数据
    • 重定向:
      • 转发地址栏路径变化
      • 可以访问其他服务器资源
      • 转发是两次请求
      • 不能共享数据
  • 路径的写法:

    • 路径的分类:
      • 相对路径:通过相对路径不可以确定唯一资源
        • 如./index.html,以.开头./父目录 ../爷目录
      • 绝对路径:通过绝对路径可以确定唯一的资源
        • 如/java_study/response01,以/开头
        • 客户端发出:需要加虚拟目录,重定向也是客户端路径
        • 服务器端发出:不需要加虚拟目录(如:转发)
  • 设置响应体

    • 获取流对象之前,设置流的默认编码:IOS-8859-1(无法显示中文),设置为其他编码如"utf-8"

    • 通知客户端,服务器发送的响应体数据的编码

      resp.setContentType("text/html;charset=utf-8");
      
posted @ 2020-10-28 12:54  雨下整夜~  阅读(78)  评论(0)    收藏  举报