Java web之Servlet



 什么是静态web资源和动态资源
 1、静态web资源 :数据固定不变的文件 
 2、动态web资源 :程序 执行生成数据文件 
 
 Servlet:一段程序 用来动态生成网页的 
 
 Request-Response编程模型
 1、先有请求 后有响应
 2、请求和响应成对出现 
 
 Sun在JavaEE API 中定义Servlet接口 ,编写Servlet程序只需要实现Servlet接口,并且在web服务器中进行注册 
 
 Servlet快速入门
 1、创建 web project 
 2、编写class 继承HttpServlet 
 3、覆盖doGet 和 doPost方法 

 GET请求方式:参数位于请求行,参数有长度限制 -------- 1) 直接在浏览器输入URL 2) <a href=""/> 链接 3) form method="get"
 POST 请求:参数位于请求体中,参数没有长度限制 ------- form method="post"
 
 4、在web服务器中对Servlet程序进行注册 ---- 配置web.xml 
   <!-- 注册一个Servlet -->
   <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
   </servlet>
   
   <!-- 为Servlet配置访问路径 -->
   <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
   </servlet-mapping>
 * 在浏览器上通过 /hello 访问 HelloServlet 类
 
 ***** 使用Servlet生成HTML 可以含有动态数据 
  
 -----------------------------------------------------------------------------------------------------------------
 深入分析Servlet运行机制 
 1、Servlet程序如何运行的 --- 无法独立执行
 由Tomcat创建对象,调用doGet和doPost方法执行 
 
 2、从哪里 引入Servlet API 
 JDK API从哪引入 java.util.List java.io.Reader  来自JRE环境 rt.jar 
 MyEclipse中提供 javaee类库  javaee.jar 包含 JavaEE API 
 
 网站运行时,需要javaee的jar包吗 ? 需要  tomcat/lib/servlet-api.jar 
 
 实验:手工运行Servlet 
 网站目录结构
 Root
   ---- *.html *.jsp 
   ---- WEB-INF
          ---- classes 存放.class文件
          ---- lib 存放jar包
          ---- web.xml 
 
 命令行编译Servlet 
 cmd> javac -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar -d . HelloServlet.java
 cn.itcast.servlet.HelloServlet 编译后 WEB-INF/classes/cn/itcast/servlet/HelloServlet.class 
 
 -------------------------------------------------------------------------------------------------
 通过MyEclipse 向导创建Servlet 
 * 生成Servlet代码非常冗余 ----- 修改MyEclipse 默认Servlet 模板
 修改模板
 1、 Commons/plugins/com.genuitec.eclipse.wizards.xxx.jar 
 2、 打开Jar包中的Templates文件夹既可以看到Servlet.java源代码 -- 进行编辑
  
 -------------------------------------------------------------------------------------------------
 Servlet 接口实现关系
 Servlet接口 定义和请求响应模型操作相关方法 ----- 与协议无关 
 GenericServlet 通用Servlet 实现Servlet接口基本方法 ----- 与协议无关 
 HttpServlet 继承 GenericServlet 添加了与HTTP协议相关操作方法

 
 自定义Servlet 需要继承HttpServlet  为了简化开发
 
 Servlet生命周期:从Servlet对象创建 到Servlet对象销毁 全过程 
 init(ServletConfig) : 初始化
 service(ServletRequest,ServletResponse) :提供服务
 destroy()  : 销毁对象 

 * 三个方法在什么情况执行 ?
 第一次访问 :创建Servlet对象,执行init方法,执行service方法
 第二次以后访问:只执行service方法,没有再创建Servlet对象,也没有执行init 
 
 Servlet对象只会创建唯一一个,只会调用一次init执行初始化 !!!!
 destroy方法 在服务器正常停止时执行 

 
 ***** 既然有构造函数了,为什么还需要init方法 ??? 
 在Java中不建议在构造器中 编写大量代码(读写文件、操作数据库)的 ,需要提供单独初始化方法进行复杂操作 
 
 执行service方法 传入两个对象 request response ,这两个对象由Tomcat创建的,在JavaEE API中只含有request和response 接口,没有提供实现类 。
 * request和response实现类 由 tomcat服务器提供 
 * service方法再根据请求方式分别调用doGet或者doPost
 问题:doGet 和 service 方法关系 参见HttpServlet源代码 

 
 关于Servlet自动加载
 * 默认情况下 Servlet第一次访问时 ,创建对象和执行init
 * 需求:服务器启动时 创建Servlet对象 执行 init ---- 配置web.xml  添加 <load-on-startup>
   <servlet>
     <servlet-name>InitServlet</servlet-name>
     <servlet-class>cn.itcast.servlet.InitServlet</servlet-class>
     <!-- 配置Servlet 随服务器启动时 进行创建初始化 -->
     <!-- 中间值可以 0-9 代表加载优先级 0 最高 -->
     <load-on-startup>0</load-on-startup>
   </servlet>
 
 小结:
 1、编写Servlet程序 无需实现Servlet接口,只需要继承 HttpServlet
 * HttpServlet 继承 GenericServlet 提供与HTTP协议相关操作方法
 2、覆盖doGet 和 doPost 无需覆盖service
 * HttpServlet 根据请求方式 在service方法中 自动调用doGet 或者 doPost 
 3、覆盖init() 而不去覆盖init(ServletConfig)
 * 在GenericServlet中 init(ServletConfig) 自动调用 init() 
 4、当doGet和doPost代码逻辑相同时,可以相互调用,简化编程

 
 ----------------------------------------------------------------------------------------------------------
 Servlet的URL-Pattern 共分为三种
 1、完全路径匹配 (不含有通配符* ,必须以/ 开始) 例如:/hello /init 
 * web.xml 必须不能有错误 
 2、目录匹配 (含有 通配符* ,必须以/开始,以/* 结尾) 例如:/* 、/aaa/* 、/bb/cc/*
 3、扩展名匹配 (含有 通配符*、必须不以/开始, 以*.xxx 结尾) 例如:*.do、 *.action
 
 经典错误 :/aa/*.do 
 优先级:完全路径匹配 > 目录匹配 > 扩展名匹配 
 
 如果一个Servlet的url-pattern 值为/ ------ 缺省Servlet 
 * 在web.xml 找不到匹配 都将执行缺省Servlet  
 * 所有服务器端 静态web资源 都是由缺省Servlet 返回给客户端 
 默认缺省Servlet 在tomcat/conf/web.xml  
 
 <servlet>
         <servlet-name>default</servlet-name>
         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
         <init-param>
             <param-name>debug</param-name>
             <param-value>0</param-value>
         </init-param>
         <init-param>
             <param-name>listings</param-name>
             <param-value>false</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
         <servlet-name>default</servlet-name>
         <url-pattern>/</url-pattern>
 </servlet-mapping>
 
 * 将 listing值设置true ---- 访问某个目录时,以列表方式展示该目录下所有文件 
 
 -----------------------------------------------------------------------------------------------------
 打印乘法表案例 
 访问服务器资源通过链接、通过form提交 --- 两种路径写法 绝对路径和相对路径 
 
 相对路径:参考当前路径地址 和 目标路径地址决定
 当前地址 : http://localhost/day5/chengfabiao.html
 目标地址 : http://localhost/day5/chengfabiao
 
 处于同一个目录
 <a href="./chengfabiao"> <a href="chengfabiao" > 
 
 当前路径:http://localhost/day5/bb/chengfabiao.html
 目标路径:http://localhost/day5/chengfabiao
 
 位于当前路径上一级
 <a href="../chengfabiao">
 
 绝路路径:http://localhost/day5/chengfabiao 或者 以/(服务器根目录)开始
 * 不管当前文件在哪个位置,写法一定的
 <a href="/day5/chengfabiao" >
 
 结论:都用绝对路径
 客户端 /day5/chengfabiao  服务器端 /chengfabiao (不需要写工程名)

 
 --------------------------------------------------------------------------------------------------
 init(ServletConfig config) ------- 初始化
 ServletConfig : 在Servlet初始化阶段,向Servlet传递信息 
 1、在web.xml 进行初始化参数的配置
 <init-param> 在 <servlet> 内部编写 
 
 <servlet>
     <servlet-name>ConfigServlet</servlet-name>
     <servlet-class>cn.itcast.servlet.ConfigServlet</servlet-class>
     <!-- 通过init param 配置初始化信息 -->
     <init-param>
      <param-name>company</param-name>
      <param-value>传智播客</param-value>
     </init-param>
     <init-param>
      <param-name>city</param-name>
      <param-value>北京</param-value>
     </init-param>
 </servlet>
 2、在Servlet程序中通过 ServletConfig对象 获得初始化参数 
 * GenericServlet 源代码 
 
 String getInitParameter(String name)  通过参数名称 获得 参数值
 
 最主流应用:在Servlet初始化阶段传递 配置相关信息 例如:配置文件存放位置  Struts 
 
 ***** 通过ServletConfig 配置初始化参数,只能对当前Servlet使用,理解为Servlet局部变量 
 
 --------------------------------------------------------------------------------------------
 
 ServletContext对象 : Servlet上下文 
 * 每个工程只会产生一个ServletContext对象 
 获得ServletContext 通过ServletConfig对象 ===== config.getServletContext() 

 
 因为ServletContext保存和整个web应用相关数据 ----- context域对象
 
 主流应用:
 1、提供全局初始化参数 ----- 所有Servlet都可以使用 
 2、根据文件扩展名获得文件MIME类型 (主要用于文件下载)
 3、ServletContext对象进行日志记录 
 4、请求分发 (请求转发)
 5、数据域,保存整个web相关数据
 6、读取web工程中文件 

 
 案例一:通过ServletContext 为工程提供全局初始化参数 
 配置web.xml ----- <context-param> 
 <context-param>
    <param-name>address</param-name>
    <param-value>北京昌平区...</param-value>
 </context-param>
 
 ServletContext context = this.getServletContext();
 System.out.println(context.getInitParameter("address"));
 
 ServletConfig和ServletContext 区别 ?
 ServletConfig 每个Servlet对象 对应一个 ,用来在Servlet的init方法进行初始化时,传递Servlet私有初始化信息 
 ServletContext 每个web应用对应一个,提供全局初始化参数,所有Servlet都可以访问 
 
 案例二:通过文件扩展名 获得文件MIME类型
 MIME类型 MIME协议中 规定文件书写格式
 tomcat/conf/web.xml 配置了文件扩展名和MIME类型对应关系 
 
 ServletContext对象 提供 API : String getMimeType(String file)  根据文件名获得MIME类型 
 原理:自动查找tomcat/conf/web.xml 
 
 案例三 记录日志信息
 public void log(String msg)
 将指定消息写入 servlet 日志文件(通常是一个事件日志)。servlet 日志文件的名称和类型是特定于 servlet 容器的。  
 public void log(String message, Throwable throwable)
 将给定 Throwable 异常的解释性消息和堆栈跟踪写入 servlet 日志文件。servlet 日志文件的名称和类型是特定于 servlet 容器的(通常是一个事件日志)。 
 
 日志信息应该记录到 tomcat/logs/localhost.当前日期.log
 * MyEclipse 启动tomcat,无法写入日志文件 
 
 案例四 作为数据域,保存整个web应用数据 
 void setAttribute(String name, Object object)  将一个数据保存ServletContext中 
 Object getAttribute(String name) 从ServletContext对象中取出数据 
 
 ServletContext因为全局唯一的,所以在多个Servlet之间可以共享数据 
 案例:统计Servlet的访问次数
 
 案例五 ServletContext 对请求分发 (转发)
 比较:转发和重定向区别 
 
 RequestDispatcher getRequestDispatcher(String path) :获得转发器,完成转发 
 再使用Dispatcher的 void forward(ServletRequest request, ServletResponse response)  完成请求和响应转发操作 
 
 案例:统计字母出现次数 
 input.html 允许用户输入一个字符串
 CountServlet 统计每个字母出现次数(忽略大小写) ,转发给下一个程序
 ShowResultServlet 显示统计结果到浏览器页面
 
 案例六:读取web工程中资源文件
 创建四个文件:
 1、工程根目录 1.txt
 2、WebRoot 2.txt
 3、WEB-INF 3.txt
 4、src 4.txt 
 
 读取web 网站中文件时,必须使用文件绝对磁盘路径 例如: c\aa\1.txt d:\bb\2.txt
 1、因为发布工程时,将WebRoot目录 发布tomcat/webapps 位于工程根目录1.txt不会被发布 ---- 无法在Servlet中读取 
 * 通过ServletContext String getRealPath(String path)  获得文件绝对磁盘路径 
 2、位于网站根目录 2.txt ==== > getServletContext().getRealPath("/2.txt"); 
 3、位于网站根目录/WEB-INF 3.txt ==== >getServletContext().getRealPath("/WEB-INF/3.txt");
 
 4、src下文件 自动发布到 WEB-INF/classes ===> getServletContext().getRealPath("/WEB-INF/classes/4.txt");
 
 =====================
 位于WEB-INF/classes/4.txt 文件位置非常特殊 (classpath)
 * 读取4.txt 通过类加载器读取 
 String filename4 = ReadFileServlet.class.getResource("/4.txt").getFile();
 
 ----------------------------------------------------------------------------------------------------------------------
 小结:
 1、掌握Servlet编程步骤
 2、Servlet依赖jar包环境 sevlet-api.jar 
 3、Servlet生命周期
 4、url-pattern 三种方式
 5、缺省Servlet
 6、绝对路径和相对路径写法
 7、ServletConfig 提供Servlet初始化参数
 8、ServletContext 6个案例API 

 
 目标:
 1、编写Servlet 
 2、乘法表
 3、统计字母
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值