Servlet

  • Servlet是Server Applet的简称, “小型服务程序”,用于响应客户端的请求
  • 一般使用要素
    • 继承javax.servlet.http.HttpServlet, 实现doGet, doPost域service方法
    • 通过request对象获取客户端的请求数据
      • request.getParameter( )
    • 通过response对象给客户端返回响应
      • response.getWriter( ).write( )
    • 通过注解@webServlet设置Servlet对应的请求路径
  • 通过response拿到的输出流对象(比如getWriter),不需要程序员调用close关闭
  • 默认情况下,一个Servlet类只会被服务器创建一个实例对象,而且是在第一次处理客户端请求才创建实例
    • 注意:Servlet并没有设计成单例模式
    • 建议:不要再Servlet中定义可写的成员变量,会引发线程安全问题
  • 有init、destroy生命周期方法
  • 可以通过注解、XML方式使用
  • 可以使用loadOnStartup属性设置Servlet的创建时机

    • 负数
      • 首次访问Servlet时,才创建Servlet
      • 默认值是-1
    • 非负数
      • 项目部署到Web容器中时就会创建Servlet
      • 数值越小,越先创建

        Servlet处理请求的常见过程

        image.png

        乱码问题解决

  • 客户端请求的数据乱码

    • request.setCharacterEncoding( “UTF-8”)
  • 服务端的响应数据乱码
    • response.setContentType(“text/plain; charset=UTF-8”);
      • 其中“text/plain”是数据的MIMEType,根据实际情况而定
      • 更多的MIMEType可以参考TOMCAT_HOME/conf/web.xml

JSP

  • JavaServer Pages, 是一种动态网页技术标准
  • 指令
    • <%@ page%> : 配置当前页面信息
    • <%@ include%> : 包含其他页面
    • <% taglib%>: 导入标签库
  • 输出
    • <%= 需要输出的内容%>
    • 等价于out.print( 需要输出的内容)
  • 嵌入Java代码
    • <% Java代码%>
  • 注释
    • <%— 注释内容 —%>
  • 声明

    • <%! 声明成员变量、方法%>

      EL表达式、 JSTL标签库

  • Expression Language

  • ${obj.property}
  • empty、 not empty

  • JSTL 是 JSP Standard Tag Library,“JSP标准标签库”

  • 导入JSTL核心标签库

image.png

  • 常用标签

    • Servlet + JSP 处理请求的常见过程

      image.png
  • MVC开发模式

    • C (Controller) : 控制器
    • M(Model):数据
    • V (View):页面展示(JSP)

转发

image.png

转发链条

  • 在同一次请求中,可以转发多次,形成一个转发链条,在一个转发链条上
    • 可以通过request.setAttribute、 request.getAttribute来共享数据
    • 每一次转发都会创建一个新的request对象,用成员变量request指向前一个request对象

image.png

  • 在转发链条上,所有的attribute都存储在头部的Request对象中

重定向(redirect)

  • 重定向:服务器通知客户端重新发送请求到新的任意URL地址

image.png

转发 vs 重定向

  • 转发代码: request**.getRequestDispatcher(“/路径”).forward(request, response)**
    • 只能转发到同一个Context下, 路径中不用包含ContextPath
    • 客户端只发了一次请求
    • 浏览器地址栏的URL不会发生变化
    • 转发的操作只由服务器完成
  • 重定向代码:response.sendRedirect(“/路径”)
    • 可以重定向到任意URL, 如果重定向到同一个Context下,路径中需要包含ContextPath
    • 客户端发了两次请求
    • 浏览器地址的URL会发生变化
    • 重定向的操作由服务器 + 客户端配合完成