zoukankan      html  css  js  c++  java
  • Servilet初步

    以http://locahost:8080/......开头,或者以/开头,都是绝对路径
    以路径开头:相对路径 路径/路径

    Servlet执行流程:(只用自己编写执行的代码,执行的细节全是tomcat封装的)
      1:浏览器输入URL(回车)
        找到服务器端的Tomcat
      2:tomcat解析web.xml文件,根据URL中项目名后面的路径找到对应的class
        <servlet>
          <servlet-name>first</servlet-name> //自己给自己的servlet class取的一个路径名
          <servlet-class>cn.itcast.a.servlet.HelloServlet</servlet-class> //定位servlet所在位置
        <servlet>
        <servlet-mapping>
          <servlet-name>first<servlet-name> //所对应的class别名
          <url-pattern>/hehe<url-pattern> //将class与URL映射到一起
        <servlet-mapping>
      3:通过反射获取该类对象,和它的方法,再通过反射调用相关方法(service)
        和JavaSE项目比较:
          1.WEB项目会屏蔽很多实现细节
          2.WEB项目中,对象创建以及调用相当一部分场景下是反射完成的
    Servlet:
      1、资源分类
        静态资源 ----- HTML ----- 源码不改,每次访问的数据都是一样的
        动态资源 ----- 由程序(Servlet)生成 -- 每次访问得到的数据可能都不一样

      2、使用 Servlet 进行动态资源实现 --- 版本1
        A、创建一个类实现 Servlet 接口
        B、重写 service 方法
        C、配置 Servlet 与 URL 的映射
        D、浏览器输入 URL 后,就可以执行 Servlet 的 service 方法了(重点:执行流程)

      3、使用 Servlet 进行动态资源实现 --- 版本2
        A、继承 GenericServlet(通用的Servlet)(GenericServlet实现了Servlet接口,重写了其它的方法,只有具体实现的service方法没有重写)
        B、重写 service 方法
        C、配置Servlet 与 URL 映射

      4、使用 Servlet 进行动态资源实现 --- 版本3 ---- 终极版
        A、eclipse 直接创建 Servlet 类 --- 继承 HttpServlet,配置信息自动生成
        B、重写的不再是 service 方法,而是更加细化的 doGet 或 doPost 方法(service方法中有处理所有请求所对应的方法)
        C、怎么执行?
          根据URL 找到对象类,反射生成对象,反射调用 (父类)service 方法,根据请求方式
          再调用 子类的 doGet 或 doPost
          (反射其实执行的还是service方法,只是service方法中调用了doGet或者doPost方法)

      5、请求与响应简单使用(请求对象和响应对象已经被tomcat封装)
        ServletRequest ---- HttpServletRequest
        A、request 是请求对象
          request.getParamter("键") ---- 可以根据键获取客户录入的值
        B、response 是响应对象
          response.getWriter() --------- 获取一个字符打印流,可以像浏览器响应数据

        被屏蔽的实现:
          request 和 response 这两个对象 和 Servlet 对象一样是 Tomcat 创建的,
          Tomcat 在调用 service 方法时,会把这两个对象作为参数传给 service,最终传给
          doGet 或 doPost

      6、servlet 高级 --- 生命周期
        init ----- 出生时调用的方法 ---- 第一次访问时出现
        servletConfig ---- 解读配置信息
        service -- 每次运行时调用的方法 ---- 每次访问
        destory -- 消亡时调用的方法 ---- 服务器关闭时消亡

      注意:
        servlet 自始至终只有一个(使用了单例设计模式)

      控制Servlet初始化的时机:
        A、web.xml中使用 <load-on-startup>设置初始化时机  
          取值:0 以及正整数,服务器启动时就加载(因为有服务器启动时就加载Servlet,所以servlet-mapping配置错误会导致服务器启动失败)
                   如果是负数或不设置,就是第一次访问时加载
        B、 <load-on-startup> 还可以设置启动优先级
          数字越小( >= 0 ),优先级越高

      7、Servlet 映射的 URL 如何配置?
        一般实现,URL 和 类名一致
        <!-- 浏览器地址栏中录入的路径完全匹配才能执行servlet -->
        1.<!-- <url-pattern>/abc/def/xxx</url-pattern> -->
        <!-- 录入的路径只要目录严格匹配即可,而目录后任意 -->
        2.<!-- <url-pattern>/xxx/yyy/*</url-pattern> -->
        <!-- 录入的路径只要后缀名匹配即可,前面任意--> .do .action
        3.<!-- <url-pattern>*.xx<url-pattern> -->
        <!-- 路径爱咋咋地 ,都行--> ---- 不建议使用
        4.<!-- <url-pattern>/</url-pattern> -->

        优先级(越具体优先级越高):
        1 > 2 > 3 > 4

    路径问题
      方式1:
        表单的 action = "http://loaclhost:8080/项目名/路径" ---- 繁琐

      方式2:
        表单的 action = "/项目名/路径" ---- 和方式1一样,是对 方式1的简化

        方式1 和 方式2 称之为绝对路径

      方式3:
        表单的 action = "路径" || "../../路径" ---- 相对路径(不建议使用)
        文件位置一旦变动,路径名也要进行相应修改,不易于后期维护

      相对路径怎么推导
      不是根据存储位置推导而是根据地址栏输入的 URL 推导

    ServletConfig
      解析servlet的配置文件信息,所有的配置信息全在<servlet></servlet>的子标签中<servlet-mapping></servlet-mapping>是URL和class
      ServletConfig sc = this.getServletConfig(); (this:当前servlet)
      sc.getServletName(); //返回ServletName
      sc.getInitParameter("code"); //得到code的值
        xml代码: <init-param>
                <param-name>code</param-name>
                <param-value>gbk</param-value>
              </init-param>
      Enumeration<String> names = sf.getInitParameterNames(); //得到所有的配置的文件,返回一个迭代器
      while(names.hasMoreElements()){
        String name = names.nextElement();
        System.out.println(name + " " + sf.getInitParameter(name));
      }

    编码集概念:
      1、作用,让数字与字符(小图片)产生映射关系
      2、不同的编码集能映射的字符也不同
      3、不同的编码集中相同的字符可以对应的数字也不一样
      解码:
        byte[] b1 = "中".getBytes("UTF-8"); //括号中指定让其按照什么编码集解码
      编码:
        byte[] b2 = new byte[]{-28, -72, -83};
        String str2 = new String(b2,"UTF-8");
    Eclipse:GBK
    MySQL:UTF-8 MySQL进行数据传递时做了处理,会将其它编码集的代码先按原编码编码之后在按照UTF-8解码,然后传递数据

  • 相关阅读:
    iOS开发拓展篇—音频处理(音乐播放器4)
    iOS开发拓展篇—音频处理(音乐播放器3)
    iOS开发拓展篇—音频处理(音乐播放器2)
    iOS开发拓展篇—音频处理(音乐播放器1)
    UIcollectionView的使用(首页的搭建4)
    UIcollectionView的使用(首页的搭建3)
    php与国付宝对接过程吐槽
    Mac OS X 10.10下Versions crash的问题
    利用栈Stack实现队列(Queue)
    安装ubuntu后启动黑屏
  • 原文地址:https://www.cnblogs.com/chonglchong/p/6833418.html
Copyright © 2011-2022 走看看