什么是静态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、统计字母