初识 Servlet

Web 的发展基础

Socket 编程

  • 客户端
    • 向服务器发起请求,并传递数据
  • 服务端
    • 接收客户端的请求,并响应数据
  • 通信规则
    • TCP/IP 协议

服务器的出现

  • 常见服务器:Tomcat、JBOOS、Apache、Jetty等
  • 服务器的作用:
    • 服务器统一接收客户端处理并进行分发到不同的资源,由各个资源进行处理,最后结果交由服务器响应。

Java Web

  • C/S体系结构
    • 客户端和服务端模式
  • B/S体系结构
    • 浏览器和服务端模式
  • 区别:
    • C/S采用高性能的PC端或工作站,使用大型数据库,效率高,但是成本也高。
    • C/S一般用于局域网,B/S一般用广域网。
    • C/S的使用人员相对固定,B/S使用人群不固定。
    • C/S需要安装专用得客户机,需要专业人员维护,维护成本高。
  • Web应用技术
    • 客户端技术:
      • HTML
      • CSS
      • JavaScript
    • 服务端技术:
      • Servlet
      • JSP

Tomcat

​ Tomcat是符合JavaEE和Web标准的最小 Web容器。

  • 特点:

    • 技术先进、性能稳定、免费开源
  • 安装:

    • 需要在系统环境变量中配置JAVA_HOME
  • 目录结构:

    • bin:存放相关的脚本
      • startup.bat 启动服务器
      • shutdown.bat 关闭服务器
    • lib:存放jar包
    • conf:存放配置文件
      • server.xml 中可以修改服务器默认的8080端口
    • logs:存放打印的日志记录的
    • webapps:存放项目资源
    • work:JSP的源码会生成在该目录下

HTTP 协议

HTTP 简介

​ Http是超文本传输协议,是应用层协议

HTTP 协议的路径格式

  • http://IP?或域名:[port]/项目路径/项目中的资源路径?参数名=参数值
    • http://:表示但前使用的HTTP超文本传输协议
    • IP|域名:表示当前主机的IP或域名
      • 本地:localhost | 127.0.0.1
    • port:服务器的端口
      • tomcat:8080

HTTP 协议的特点

  • 支持客户端和服务端模式
  • 简单快捷
  • 灵活
  • HTTP1.1后支持持续连接
  • 无状态:协议对于事务处理没有记忆能力

请求协议

  • 客户端向服务端发起请求时的协议
  • 请求协议由三部分构成
    1. 请求行:
      1. 请求方式 GET/POST
      2. 请求路径
      3. 请求协议版本
    2. 请求头
      • 键值对组成,键: 值;多个请求头之间会换行
    3. 请求正文
      • GET请求没有请求正文,POST请求才有(From Data)

响应协议

  • 服务端向客户端响应数据时的协议
  • 响应协议由三部分组成:
    1. 状态行(响应行)
      1. 协议版本
      2. 响应状态码 (200=成功 404=未找到资源 500=服务器异常)
      3. 响应状态码的说明
    2. 消息报头(响应头)
      • 键值对组成,键: 值;多个消息头头之间会换行
    3. 响应正文
      • 浏览器中所看到的的内容

消息头

​ HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。

​ 请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。

​ 每一个报头域都是由 “名字 + ‘:’ + 空格 + 值” 组成,消息报头域的名字是大小写无关的。

  • 请求头:对于请求协议而言

    • Referer:该请求头指明请求从哪里来
      • 如果是直接从浏览器的地址栏直接访问,则没有Referer请求头
      • 作用:可以得知的页面的上一个访问地址
      • 应用场景:百度竞价、防盗链、邀请链接等
  • 响应头:对于响应协议而言

    • Location:

      • Location响应报头域用于重定向接受者到一个新的位置
      • Location响应报头域,常用在更换域名的时候
    • Refresh:

      • 自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现

      • 格式:

        <meta http-equiv="refresh" content="时间秒数;url=跳转的地址">
        <!-- 3秒钟后跳转到百度 -->
        <meta http-equiv="refresh" content="3;url=http://www.baidu.com"> 
        <!-- 每隔3秒刷新一次页面 -->
        <meta http-equiv="refresh" content="3;">
        

Servlet 的实现

​ Servlet是Server与Applet的缩写,是服务端小程序的意思。

​ Servlet本质上也是Java类,但要遵循Servlet规范进行编写,没有 main()方法,它的创建、使用、销毁都由Servlet容器进行管理(如 Tomcat)。

实现

  1. 创建Web项目

    1. 右键选择"New",选择"Other"
    2. 搜索"Web",选择"Dynamic Web Project"
    3. 设置项目的名称,选择"Dynamic web module version"的版本为2.5,选择"Next",再选择"Next"
    4. 设置"Context root"的值
      • 默认与项目名保持一致,代表的是项目的对外访问路径,即站点名
    5. 创建完成
  2. 访问Web项目

    1. 选择服务器,右键选择"Add and remove",将项目加到服务器中
    2. 右键服务器,选择"Start"或者"Debug"启动服务器
    3. 在浏览器中输入"http://localhost:8080/站点名/资源路径"
  3. 创建Servlet

    1. 创建普通的JAVA类

    2. 继承HttpServlet类

    3. 重写service方法

      import java.io.IOException;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      @SuppressWarnings("serial")
      public class Servlet01 extends HttpServlet {
      	@Override
      	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
      		System.out.println("Hello Servlet!!!");
      	}	
      }
      
    4. 配置项目中WEB-INF下的web.xml文件

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
        <display-name>servlet01</display-name>
        <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
          <welcome-file>default.html</welcome-file>
          <welcome-file>default.htm</welcome-file>
          <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
          
          <!-- servlet类的配置 -->
        <servlet>
        	<servlet-name>Servlet01</servlet-name> <!-- servlet的名称,给服务器看的,与servlet-mapping中servlet-name标签保持一致 -->
        	<servlet-class>com.myservlet.Servlet01</servlet-class> <!-- servlet的路径,包含包名+类名 -->
        </servlet>
          <!-- servlet类的映射配置 -->
        <servlet-mapping>
        	<servlet-name>Servlet01</servlet-name> <!-- servlet的名称,给服务器看的,与servlet中servlet-name标签保持一致 -->
        	<url-pattern>/ser01</url-pattern> <!-- servlet类的对外访问路径。注:"/"不要忘记 -->
        </servlet-mapping>
          
      </web-app>
      
  • 实现Servlet的另外两种方式

    1. 继承GenericServlet类,实现service方法

    2. 实现Servlet接口,实现接口中的方法

      import java.io.IOException;
      import javax.servlet.Servlet;
      import javax.servlet.ServletConfig;
      import javax.servlet.ServletException;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletResponse;
      
      /**
       * 实现Servlet接口
       * 	1、创建普通Java类
       * 	2、实现Servlet接口
       * 	3、实现接口中的方法
       * 	4、配置web.xml
       */
      public class Servlet01 implements Servlet {
      
      	/**
      	 * 系统方法,初始化方法,当servlet被实例化时调用,只会执行一次(在第一次访问 Servlet执行)
      	 * 	当有请求访问servlet时,会先判断是否存在servlet实例,如果不存在,则调用init方法,实例化servlet类;如果存在,则不调用init方法
      	 */
      	@Override
      	public void init(ServletConfig config) throws ServletException {
      		System.out.println("Servlet01 init...");
      		
      	}
      	
      	/**
      	 * 系统方法,服务方法,没法打那个有请求访问servlet时,都会调用;可以调用多次
      	 */
      	@Override
      	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
      		System.out.println("Servet01...");		
      	}
      
      	/**
      	 * 系统方法,销毁方法,在服务器关闭时调用该方法,只会执行一次
      	 */
      	@Override
      	public void destroy() {
      		System.out.println("Servlet01 destoy...");		
      	}
      }
      

Servlet 生命周期

  • servlet 类加载–>实例化–>服务–>销毁

  1. Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
  2. Servlet 容器接收 Web Client 的请求
  3. Servlet 容器创建一个 HttpRequest 对象,将 Web Client 请求的信息封装到这个对象 中
  4. Servlet 容器创建一个 HttpResponse 对象
  5. Servlet 容器调 HttpServlet 对象 service 方法,把 HttpRequest 对象与 HttpResponse对象作为参数,传给 HttpServlet 对象
  6. HttpServlet 调用 HttpRequest 对象的有关方法,获取 Http 请求信息
  7. HttpServlet 调用 HttpResponse 对象的有关方法,生成响应数据
  8. Servlet 容器把 HttpServlet 的响应结果传给 Web Client

Servlet 的配置

  • 基本配置

    <servlet>
        <servlet-name>Servlet01</servlet-name>
        <servlet-class>com.myservlet.Servlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet01</servlet-name>
        <url-pattern>/ser01</url-pattern>
    </servlet-mapping>
    
  • 初始化参数:在servlet被实例化时,即可获取的参数

    <init-param>
        <param-name>参数名</param-name>
        <param-value>参数值</param-value>
    </init-param>
    
  • 自启动:服务器启动时servlet被实例化 (值越小,优先级越高)

    <load-on-startup>1</load-on-startup>
    
  • 设置多个访问路径

    <!-- 设置多个路径访问servlet -->
    <url-pattern>/ser04</url-pattern>
    <!-- 指定路径 -->
    <url-pattern>/ser004</url-pattern>
    <!-- 以指定后缀结尾的路径  .html .do -->
    <url-pattern>*.do</url-pattern> 
    <!-- 以指定目录开头的路径 -->
    <url-pattern>/test/*</url-pattern> 
    <!-- 所有路径 -->
    <url-pattern>/*</url-pattern>
    <!-- "*" 是个通用符,代表所有 -->
    
    • "*"只能放在最前面或者最后面,不能单独使用,不能和字母组合
    • 越精准,优先级越高
  • 注意点:

    • 修改配置文件,必须重启服务器,配置才会生效
    • 在web.xml文件中,servlet标签中的servlet-name的值必须唯一
    • servlet-mapping标签中url-pattern的值必须唯一:java.lang.IllegalArgumentException
    • servlet-mapping标签中url-pattern的值要加"/":java.lang.IllegalArgumentException
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值