JavaWeb

一、相关概念

软件架构

  • C/S:客户端/服务端
  • B/S:浏览器/服务端

资源分类

  • 静态资源:所有用户访问后,得到的结果都是一样的,可以直接被浏览器解析
  • 动态资源:每个用户访问相同资源后得到的结果不一样,被访问后需要先转换为静态资源,后返回给浏览器

网络通信三要素

  • IP:电子设备在网络中的唯一标识
  • 端口:应用程序在计算机中的唯一标识。0-65535
  • 传输协议:规定了数据传输的规则

    tcp:安全协议,三次握手
    udp:不安全协议

二、Web服务器软件:Tomcat

几款软件

  • webLogic:oracle公司,大型JavaEE服务器
  • webSphere:IBM公司,大型JavaEE服务器
  • JBOSS:JBOSS公司,大型JavaEE服务器
  • Tomcat:Apache基金组织,中小型JavaEE服务器

java

  • JavaEE:Java语言在企业级开发中使用的技术规范总和,共规定了13项大的规范。

Tomcat

  • 下载
  • 安装
  • 卸载
  • 启动
    sudo ./startup.sh
    http://localhost:8080
  • 关闭
    sudo ./shutdown.sh
  • 配置
    部署项目的方式:

    将项目放到webapps目录下,war包会自动解压缩
    配置conf/server.xml文件,在表情中配置:
    在conf/Catalina/localhost文件夹下创建xml文件,编写:,文件名称就是虚拟路径

静态项目和动态项目

目录结构

Java动态项目的目录结构

项目目录
- WEB-INF目录
|- web.xml:web项目的核心配置文件
|- classes目录:放置字节码文件的目录
- lib目录:放置依赖的jar包

三、Servlet

核心知识

概念: server applet,运行在服务器端的小程序。servlet就是一个接口,定义了Java类被浏览器访问识别。

代码实现

创建JavaEE项目

实现类,实现Servlet接口

实现所有接口

  • init
  • ServletConfig
  • service
  • getServletInfo
  • destroy

配置Servler,需要在web.xml文件中

在web.xml文件中添加<servlet><servlet-mapping>标签:即servlet的类路径(反射)和url的资源路径来进行匹配。

<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.yang.web.servlet.Demo1</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>

执行原理

  • 1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,来获取访问的Servlet的资源路径
  • 2.查找web.xml文件,是否有对于的<url-pattern>标签内容
  • 3.如果有,则会找到对应的<servlet-class>全类名
  • 4.tomcat会将字节码文件加载进内存,并创建其对象
  • 5.调用方法

Servlet的生命周期

  • init:初始化,只会在调用服务时才会检测是否已经初始化,懒加载。如果需要创建服务自动初始化需要在<servlet>标签中添加<load-on-startup>设置大于等于0即可。
  • ServletConfig:设置config,config内容可以在init函数中获取到,获取的内容需要在web.xml文件中的<Servlet>标签中添加<init-param>标签以Key-Value添加即可
  • service:每次调用服务就会运行
  • getServletInfo:获取基本信息
  • destroy:销毁。只有服务器正常关闭才会运行。
Servlet3.0

支持注解配置,不需要web.xml文件。
直接使用@WebServlet("路径")即可

Servlet的体系

Servlet-接口
GenericServlet-抽象类
HttpServlet-抽象类
  • GenericServlet:将Servlet接口中其他方法做了默认空实现,只将servlet()方法作为抽象。
  • HttpServlet:对http协议的一种封装,简化操作。

Servlet相关配置

1.urlpartten:Servlet访问路径

一个Servlet可以定义多个访问路径

{"/路径1","/路径2","路径3"}
/路径1
/路径1/路径1.1
*.后缀名

四、Http

概念

Hyper Text Transfer Protocol 超文本传输协议

* 传输协议:定义了客户端与服务端通信的数据格式
* 特点
    * 基于TCP/IP协议
    * 默认端口号80
    * 基于请求/相应模型,一次请求响应一次响应
    * 无状态:每次请求之间相互独立
* 历史版本
    * 1.0:每次响应都会建立新的连接
    * 1.1:复用响应

请求消息数据格式

请求行

请求方式 请求url 请求协议/版本
Get  /login.html  HTTP/1.1
  • 请求方式(7中)
    • GET
      请求参数在url中
      url长度是有限制的
      不太安全
    • POST
      请求参数在请求体中
      相对安全

请求头

请求头名称: 请求头值(多个则用,分割)
常见请求头
  • User-Agent:浏览器告诉服务器,使用的浏览器版本信息,这样服务器会根据这些信息完成兼容性
  • Accept:能解析的格式
  • Accept-Language:语言
  • Accept-Encoding:压缩方式
  • Referer:告诉服务器,当前请求从哪里来,用于防盗链和统计工作
  • Connection:是否保持连接
  • Upgrade-Insecure-Requests:升级信息

请求空行

空行用于分割请求头与请求体

请求体(请求正文)

五、Request

request对象与response对象的原理

  • 1.tomcat服务器会根据请求url中的资源路径,创建对应的Servlet对象
  • 2.tomcat服务器,会创建request和response对象,request对象中封装请求消息数据
  • 3.tomcat将request和response对象传递给service方法,并调用该方法
  • 4.我们通过request对象获取我们想要的内容,然后通过response对象响应出去
  • 5.服务器在给浏览器作出响应之前,会从response对象中拿出设置的响应数据

最重要为下面两点

request和response对象是由服务器创建的
request对象是来获取请求消息,response对象是来设置响应消息

request功能

获取请求数据

  • 获取请求行数据
    GET /day/demo?name=zhangsan HTTP/1.1

    • 获取请求方式:GET
      String getMethod()
    • 获取虚拟目录:/day
      String getContextPath()
    • 获取Servlet路径:/demo
      String getServletPath()
    • 获取get方式请求参数:name=zhangsan
      String getQueryString()
    • 获取请求uri:/day/demo
      String getRequestURI():/day/demo
      String getRequestURL():http://localhost/day/demo
    • 获取协议及版本:HTTP/1.1
      String getProtocol()
    • 获取客户机IP地址
      String getRemoteAddr()
  • 获取请求头数据

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

    • 1.获取流对象
      BufferedReader getReader():获取字符输入流,只能操作字符数据
      ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
    • 2.再从流对象中拿数据

其他功能

  • 1.获取请求参数通用方式

    • 根据参数名称获取参数值
      String getParameter(String name)
    • 根据请求参数名称获取参数的数组
      String[] getParameterValues(String name)
    • 获取所有请求参数的参数名称
      Enumeration<String> getParameterNames()
    • 获取所有参数的map集合
      Map<String, String[]> getParameterMap()
    • 中文乱码问题
      tomcat8以上get请求完成中文乱码,而post请求依旧乱码
      request.setCharacterEncoding("utf-8");
  • 2.请求转发:一种在服务器内部的资源跳转方式

    • 通过request对象获取请求转发器对象
      RequestDispatcher getRequestDispatcher(String path)
    • 使用RequestDispatcher对象来进行转发
      forward(ServletRequest request, ServletResponse reponse)
    • 特点
      1.浏览器地址路径不发生编号
      2.只能转发到当前服务器内部资源
      3.转发是一次请求
  • 3.共享数据

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

六、Response

HTTP协议的响应消息

响应消息

  • 数据格式

    • 响应行
      HTTP/1.1 200 OK
      1.组成:协议/版本 响应状态码 状态码描述
      2.响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。分为五类:服务器接收客户端消息,但没有接收完成,等待一段时间后发送1XX、成功2XX、重定向3XX(30重定向,304访问资源)、客户端错误4XX(404请求路径没有对应资源,405请求方式没有对应的功能函数doXXX)、服务器端错误5XX。
    • 响应头
      头名称: 头值
      Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
      Content-disposition:服务器告诉客户端以什么格式打开响应数据
        > in-line:默认值,在当前页面内打开
        > attachment;filenamt=xxx:以附件形式打开响应体。文件下载
      
    • 响应空行
    • 响应体:传输的数据
  • 响应字符串格式

Response对象

功能:

  • 1.设置响应行
      1. 格式 HTTP/1.1 200 ok
    • 2.设置状态码 setStatus(int sc)
  • 2.设置响应头:setHeader(String name, String value)
  • 3.设置响应体
    • 1.获取输出流
      字符输出流:PrintWriter getWriter()
      字节输出流:ServletOutputStream()
    • 2.使用输出流,将数据输出到客户端浏览器上

重定向

  • 重定向与转发的区别

    1.重定向地址栏发生变化
    2.重定向可以访问其他站点资源
    3.重定向是两次请求

  • 路径写法

    1.相对路径

    找到当前资源与目标资源关系,./文件夹路径
    2.绝对路径
    以/开头,去除URL三个基本后剩下的部分,需要确定是客户端发出还是服务端发出:客户端需要加虚拟目录,服务器端不需要加虚拟目录。

服务器输出字符数据

首先需要注意乱码问题:
response.setContentType("text/html;charset=utf-8");
通过response.getWriter()获取流。

服务器输出字节数据

通过response.getOutputStream()获取流。

验证码

ServletContext对象

概念:代表整个Web应用,可以和程序的容易来通信。
功能:

  • 1.获取MIME类型
    • MIME类型:在互联网通信过程中的一种文件类型标准。大类型/小类型。
    • String getMIMEType(String type)
  • 2.域对象:共享数据
  • 3.获取文件的真实路径