Java Web之Servlet

前提

WEB相关

web(World Wide Web)即全球广域网,也叫万维网.基于超文本和HTTP的分布式图形信息系统.

软件架构

  1. C/S

    即客户端/服务器的结构,需要同时开发客户端和服务器,服务器负担小点,一些逻辑可以分配给客户端处理.

  2. B/S

    即浏览器/服务器的结构,不需要客户端,仅仅需要浏览器,使用方便,但是服务器处理所有逻辑,

Web服务器

  1. Tomcat服务器:Apache公司,开源,免费
  2. WebSphere服务器:IBM公司,大型,收费
  3. WebLogic服务器:BEA公司,大型,收费
  4. IIS服务器:微软,用于.Net平台
  5. Apache服务器:Apache公司,用于PHP平台

资源

  1. 静态
    • HTML
    • CSS
    • JS
  2. 动态
    • Servlet
    • JSP
    • PHP
    • ASP

Tomcat安装

网上查

HTTP协议

  1. 基于请求和响应模型
    • 必须要先有请求,后有响应。
    • 请求和响应必须成对出现。
  2. 简单快捷
    • 因为发送请求的时候只需要发送请求方式和请求路径即可

请求

三部分:

  1. 请求行

    请求方式,请求路径,使用协议版本

    1
    GET / HTTP/1.1
  2. 请求头

    修饰请求的参数,key:value格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Host: www.baidu.com
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
    Cookie: PSTM=1499256449;
  3. 请求体

    请求内容,key=value格式

    只有post方式才有请求体

    1
    BIDUPSID=466826E580D5EAA9916FE1722DFB567E; __cfduid=d35a63fec825c335b2020219e0e6d2f821499497945; BDUSS=TdoVWxnZTRPWHBWd0ZSQTdQMjY4UnpGV1ZtdEJPbE8zRldRcS00SXR4R0FVNXhaSVFBQUFBJCQAAAAAAAAAAAEAAADmWjVOstPf1di839UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDGdFmAxnRZS; BAIDUID=432F9D527217510DDA00119B0DC37E3B:SL=0:NR=20:FG=1; BD_UPN=12314753; BD_HOME=1; H_PS_PSSID=1449_13549_21126_18560_24093_22073; sug=3; sugstore=0; ORIGIN=0; bdime=0

响应

与请求类似,有响应行,响应头,响应体

  1. 响应行
    • 协议版本
    • 状态码
      • 200-响应成功
      • 302-需要重定向
      • 304-需要查询本地缓存
      • 404-请求资源不存在
      • 500-服务器内部错误
    • 状态码描述
  2. 响应头
    • key : value 格式
    • 重要响应头
      • Location重定向
      • Refresh定时刷新
      • Content-Disposition文件下载时候使用
  3. 响应体
    • 用户浏览的页面代码(html)

Servlet

Servlet其实就一个运行在web服务器上的小的Java程序,用于处理从web客户端发送的请求,并且对请求作出响应。

使用

底层是java类继承Servlet接口,

开发使用的方式是:继承tomcat中的HttpServlet类,重写doPost()和doGet()方法来实现

然后配置servlet(目的:使url映射到编写的servlet类上),有两种方式:

  1. web.xml中()
  2. Servlet类上使用@WebServlet(..)注解

Servlet的生命周期

Servlet是在第一次被访问的时候会被实例化,只要Servlet一被实例化那么Servlet中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同doXXX方法)。当Servlet从服务器中移除或者服务器关闭的时候Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉。

启动时加载

修改Servlet的加载时间为服务器启动加载

给Servlet添加load-on-startup属性,属性值为 2 (tomcat服务中存在一个值为1默认的Servlet,该Servlet必须先于任何一个Servlet启动)

访问路径的处理

Servlet的urlPattern属性/url 斜杠代表根路径即web目录,并且* 可以作为通配符来使用.

Servlet中得到web目录下的文件

通过IO流获得

  1. String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
    InputStream is = new FileInputStream(path);
    //is就是该文件的io流
    
    1
    2
    3

    2. ```
    InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

乱码的解决

  1. 对于response

    1
    response.setContentType("text/html;charset=UTF-8");
  2. 对于request

    1
    2
    3
    4
    //post
    request.setCharacterEncoding("utf-8");
    //get,tomcat8以上不用考虑编码问题
    String str = new String("中文".getBytes("ISO-8859-1"),"UTF-8");