Servlet简介-体系结构(二)

154 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情 >>

体系结构

Servlet是一个接口,下面有两个抽象子类。

其中GenericServlet抽象类直接实现Servlet接口,HttpServlet继承GenericServlet抽象类;

request和response

  • request和response对象是由服务器创建的。
  • request对象是来获取请求消息,response对象是来设置响应消息
  • request和response对象是ServletRequest接口的两个子接口HttpServletRequest和HttpServletResponse声明的两个对象,用来处理请求和响应进而与客户端进行交互;
  • ServletRequest接口 的子接口 HttpServlet比较常用,一般使用HttpServleRequestt来声明request对象;response同理;

  • 通过request对象可以获得请求行数据中的请求方式,URI,请求参数,HTTP协议等;还可以获得请求头数据和请求体数据;
  • 通过response对象可以设置响应消息;响应行,响应头,响应体;
  • HTTP传输数据类型:ContentType

request域

域对象:一个有作用范围的对象,可以在范围内共享数据;

作用范围:一次请求。一般用于请求转发的多个资源中共享数据;

方法:

  • void setAttribute(String name, Object obj):存储数据;
  • Object getAttribute(String name):根据键获取数据;
  • void removeAttibute(String name):根据键移除键值对数据;

Servlet请求响应流程

  1. 浏览器发送请求到服务器(请求)

  2. 服务器接收浏览器的请求进行解析,创建request对象存储请求数据

  3. 服务器调用对应的Servlet进行请求处理,并将request对象作为实参传递给Servlet的service方法

  4. Servlet的service方法执行请求处理:

    1. 设置请求的编码格式 request.setCharacterEncoding("utf-8");

    2. 设置响应的编码格式 response.setContentType("text/html;charset=utf-8");

    3. 获取请求信息

    4. 处理请求信息

      1. 创建业务层对象
      2. 调用业务层对象的方法
    5. 响应请求处理

      1. 直接响应
      2. 请求转发
      3. 重定向

请求转发

服务器内部资源跳转的一种方式。

request.getRequestDispatcher("servletname").forward(request,response);
  • 请求转发的两个Servlet属于一次请求,可以使用request对象共享数据;
  • 浏览器地址栏信息不改变,
  • 只能转发到当前服务器的资源;
  • 刷新时可能导致表单重复提交。
  • / :表示项目根目录

重定向

资源跳转的方式。

response.sendRedirect("url");
  • 使用时机:解决当前Servlet无法处理请求的问题以及表单重复提交的问题。
  • 重定向的两个Servlet属于两次请求,拥有两个request对象;
  • 浏览器地址会改变,Servlet之间数据不能共享。
  • 可以重定向到其他站点的资源;
  • 两次请求的数据共享需要使用session,session依赖于cookie。
  • / : 表示服务器根目录,绝对路径需要加上虚拟项目名

ServletContext对象

request解决了一次请求内的数据共享问题,session解决了一个用户不同请求的数据共享问题,而不同用户之间的数据共享问题则需要使用ServletContext对象。

特点

1. 由服务器创建
        	2. 用户共享
     	3. 一个项目只有一个

生命周期

​ 服务器启动到服务器关闭

使用:

//1.获取ServletContext对象(三种方式,等价)
ServletContext sc = this.getServletContext();
ServletContext sc2 = this.getServletConfig().getServletContext();
ServletContext sc3 = request.getServletContext();
//ServletContext sc3 = req.getSession().getServletContext();
//2.使用ServletContext对象完成数据共享
sc.setAttribute(String name,Object value);
sc.getAttribute(String name);//返回Object对象类型数据
//3.获取项目中web.xml中的全局配置数据
sc.getInitParameter(String name);//返回String类型数据
//4.获取项目根的根路径信息
sc.getRealPath();

功能:

  1. 获取MIME类型:在互联网通信过程中定义的一种文件数据类型;

    格式:大类型/小类型 text/html;

    方法:String getMinmeType(String file);

  2. 域对象:共享数据;所有用户共享数据;

    • setAttribute(String name, Object value);
    • getAttribute(String name);
    • removeAttribute(String name);
  3. 获取文件的真实(服务器)路径;

    • String getRealPath(String path);

文件下载

设置请求头信息:

  • setHeader("content-disposition", "attachment;filename=xxx");

  • setHeader("content-type", this.getServletContext().getMinmeType(filename));

    • HTTP传输数据类型:ContentType;
    • 这里要在响应头中设置HTTP传输数据的类型MIME为文件对应的类型;

注意:文件名的中文问题要根据浏览器版本信息设置对应的文件编码方式;

ServletConfig

​ ServletConfig对象是Servlet的专属对象(域对象).

问题:

​ 如何获取在web.xml中给每个Servlet单独配置的数据?

解决:

​ 使用ServletConfig对象

使用:

  1. 获取ServletConfig对象

    ServletConfig sc = this.getServletConfig();
    
  2. 获取web.xml中的配置数据

    String value = sc.getInitParameter("name")
    

Web.xml文件使用总结

作用:

​ 存储项目相关的配置信息,保护Servlet。解耦一些数据对程序的依赖。

使用位置:

​ 每个Web 项目中;

​ Tomcat服务器中(在服务器conf目录下)

区别:

​ Web项目下的web.xml文件为局部配置,针对本项目的配置;

​ Tomcat下的web.xml文件为全局配置,配置公共信息;

内容(核心组件)

​ 全局上下文配置(全局配置参数)

​ Servlet配置

​ 过滤器配置

​ 监听器配置

加载顺序:

​ Web容器会按ServletContext -> context-param -> listener -> filter -> servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。

​ 在服务器启动时完成加载。

server.xml

问题:

​ 浏览器发起请求后,服务器根据请求在webapps目录下调用对应的的Servlet进行请求处理。那么为什么是webapps目录,难道不能是其他的文件吗?

解决:

​ 了解server.xml文件的配置信息

server.xml文件的核心组件

<Server>
	<Service>
        <Connector/>
        <Connector/>
        <Engine>
            <Host>
                <Context/>
            </Host>
        </Engine>
    </Service>
</Server>

热部署

<Context path="/Pet" reloadable="true" docBase="F:/PetWebroot"/>