需要掌握的知识点:
1、Servlet程序编写 ----- 生命周期
2、ServletAPI Request Response
3、Cookie 和 Session

Servlet 用来 动态web资源 开发
静态web资源 : 固定数据文件
动态web资源 : 通过程序动态生成数据文件

Servlet技术基于Request-Response编程模型 ---- HTTP协议也是基于请求响应 模型
* Servlet技术 用来 开发基于HTTP web 应用程序

接触 JavaEE API ------ 程序 接口 和 已经实现接口 类的 使用
JavaEE ---- Java Platform, Enterprise Edition 缩写

Servlet快速入门
1、创建web project
2、编写 class 继承 HttpServlet
3、在web.xml 配置 Servlet程序 虚拟访问路径
* 用户在浏览器上通过这个路径 访问编写Servlet程序
4、覆盖doGet或者doPost方法 进行输出

* Servlet 动态生成 网页文件

执行过程
1、用户在客户端发起url请求 : http://localhost/day05/hello ----- web.xml /hello 映射 HelloServlet程序
2、用户提交请求时,get方式提交 执行 HelloServlet的 doGet方法 post方式提交 执行 HelloServlet的doPost 方法

Servlet程序在编写和运行时,需要javaee 类库 (API支持)
* 在学习javase List 需要 import java.util.List 需要 jre/lib/rt.jar
* MyEclipse 自动导入 javaee5 liberary 存在 javaee.jar 提供 Servlet 需要类 API支持 (开发环境使Servlet程序正常编译)
* Serlvet程序运行tomcat环境中 没有javaee.jar , 在 tomcat/lib/servlet-api.jar 提供Servlet程序运行需要 类API 支持 (运行环境需要的)

手动编写Servlet运行
1、在webapps 新建 day05test目录 --- 虚拟应用
2、在day05test 新建 WEB-INF/classes
3、将编写Servlet的java源码文件 放入 classes ,在 WEB-INF 配置web.xml
4、编译Servlet的 java程序
javac -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar HelloServlet.java // 通过 -classpath 指定 Servlet需要jar 包
生成Servlet package结构
javac -d . -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar HelloServlet.java

Servlet运行原理分析
编写Servlet程序没有 main函数 ---- tomcat调用Servlet程序执行

通过myeclipse向导 创建Servlet ---- 创建Servlet程序,生成web.xml 配置
* 生成Servlet信息非常复杂,想生成Servlet 内容整洁一些,精简一些 ------ 修改Servlet模板
1、myeclipse工具 ---- 安装目录 common / plugins
com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar

2、解压缩 templates/Servlet.java --- 这个就是Servlet模板

通过API Servlet继承关系
Servlet接口 ---- 实现类 : GenericServlet ------ 子类 HttpServlet ------ 编写Servlet 继承HttpServlet
* 编写Servlet 间接 实现 Servlet 接口 (简化开发)
Servlet接口 提出,为了解决基于请求-响应模型数据处理 (并没有涉及与HTTP协议相关 API)
GenericServlet 实现接口 通用Servlet 也没有提供与 HTTP协议相关 API
HttpServlet 引入与 协议相关 API

Servlet生命周期
init(ServletConfig config) 初始化
service(ServletRequest req, ServletResponse res) 提供服务方法
destroy() 销毁

1、tomcat服务器启动时,没有创建Servlet对象
2、第一次访问时,tomcat构造Servlet对象,调用 init,执行service
3、从第二次以后访问 tomcat 不会从新创建Servlet对象,也不会调用init ---- 每一次访问都会调用service
4、当服务器重启或正常关闭时 调用destroy (正常关闭 shutdown.bat)

Servlet对象是tomcat创建的,每次请求调用Servlet中service方法,tomcat服务器会在每次调用Servlet的service方法时,为该方法创建Request对象和Response对象
* 在 JavaEE API 中没有Request和Response实现类 ----- 实现类由Servlet服务器提供的,tomcat提供实现类 weblogic 提供实现类

service方法 和 HttpServlet doGet/doPost 关系区别? ----- 必须阅读HttpServlet源代码
在HttpServlet代码实现中,根据请求方式不同 调用相应doXXX方法 get方式请求 --- doGet post方式 --- doPost

配置Servlet随tomcat服务器启动时 进行初始化 --- <load-on-startup >
*<load-on-startup > 参数可以是一个数字 0-9 代表服务器加载优先级 0 最高
例如:在tomcat启动时,想通过Servlet加载一些框架配置文件 配置随服务器启动 (struts1 )

结论:
1、编写Servlet 继承HttpServlet
2、编写Servlet 不需要覆盖service方法,只需要覆盖doGet和doPost 方法

Servlet初始化时覆盖init() ,无需覆盖init(config) ??
* init(Config) 调用 init()

当doGet和doPost代码逻辑相同时,可以相互调用,简化编程

一个Servlet可以配置多个url-pattern
URL 配置格式 三种:
1、完全路径匹配 (以/开始 ) 例如:/hello /init
* 当前工程没有被正确发布,访问该工程所有静态资源、动态资源 发生404 ----- 工程启动时出错了
* 查看错误时 分析错误
1) 单一错误 : 从上到下 查看第一行你自己写代码 (有的错误与代码无关,查看错误信息)
2)复合错误 Caused by ---- 查看最后一个Caused by
* Invalid <url-pattern> init2 in servlet mapping

2、目录匹配 (以/开始) 例如:/* /abc/*
/ 代表网站根目录

3、扩展名 (不能以/开始) 例如:*.do *.action
典型错误 /*.do

优先级:完全匹配>目录匹配 > 扩展名匹配

路径问题:编写九九乘法表
1、需要用户在客户端输入一个数字
2、Servlet接收客户输入数字 打印对应乘法表

在chengfabiao.html 通过 action 访问 ChengfabiaoServlet 路径可以用绝对路径和相对路径

相对路径:相对当前网页地址 路径 例如 chengfabiao ./chengfabiao ../chengfabiao
例如: http://localhost/day05/chengfabiao.html 提交 action="chengfabiao"
* 将url最后地址换成相对路径
结果: http://localhost/day05/chengfabiao ----- 服务器端 /chengfabiao

例如: http://localhost/day05/aaa/chengfabiao.html 提交 action="chengfabiao"
结果: http://localhost/day05/aaa/chengfabiao ----- 服务器 /chengfabiao
* /aaa/chengfabiao 与服务器 /chengfabiao 不匹配 出现404

http://localhost/day05/aaa/chengfabiao.html 提供 action="../chengfabiao"
结果:http://localhost/day05/aaa/../chengfabiao ---- > ..和/aaa抵消 http://localhost/day05/chengfabiao 可以匹配服务器 /chengfabiao

结论:如果用相对路径提交请求,考虑当前路径, 当前访问服务器资源路径不同 ---- 相对路径写法不同

绝对路径 解决相对路径,会根据当前地址改变问题。 例如: /day05/chengfabiao 、http://localhost/day05/chengfabiao
绝对路径 以/开始 /访问服务器根目录
例如: 客户端访问服务器,不管当前路径是什么 --- / 服务器根目录 http://localhost
/day05 --- 找到虚拟目录day05工程 /day05/chengfabiao --- 找到 day05工程下配置 虚拟路径/chengfabiao

结论: 客户端路径 /工程虚拟目录/servlet虚拟路径 例如:/day05/chengfabiao
服务器端 配置web.xml 不需要写工程虚拟目录 只要直接写/servlet虚拟路径 例如:/chengfabiao

----------------------------------------------------------------------------
掌握Servlet程序编写
通过路径 访问Servlet 程序
* Servlet 生命周期

init
service
destroy

学习init方法 ---- init(ServletConfig) ---- 通过ServletConfig 获得Servlet初始化参数
1、创建一个Servlet
2、在web.xml 中 <servlet> 标签内 通过 <init-param> 标签 为Servlet配置初始化参数
<init-param>
<param-name>itcast</param-name>
<param-value>传智播客</param-value>
</init-param>

3、在Servlet程序中通过ServletConfig对象 获得itcast对应数据
getInitParameter ------ 通过name获得value
getInitParameterNames ----- 获得所有name

* 思考 :如何在doGet 或 doPost 方法中 获得 Servlet初始化参数
将ServletConfig对象保存实例成员变量
GenericServlet 已经将ServletConfig 保存成员变量 ----- 在子类中通过 getServletConfig方法 获得 初始化参数

结论:子类Servlet不需要覆盖 init(ServletConfig) , 只需要通过GenericServlet中 getServletConfig() 获得ServletConfig对象

应用:在init-param 指定配置文件位置和名称,配置Servlet随服务器启动创建 load-on-startup

* ServletConfig 配置初始化数据,只能在配置Servlet获得,其它Servlet无法获得 ----- 每个Servlet程序都对应一个ServletConfig对象

ServletContext 是Servlet上下文对象
每一个工程 对会创建 单独ServletContext对象,这个对象代表当前web工程
操作ServletContext 必须通过ServletConfig 获得对象

应用:
1、 获得整个web应用初始化参数
2、 实现全局数据共享
3、 实现服务器端转发功能
4、 读取web工程资源文件

1、获取WEB应用的初始化参数 和 ServletConfig 对象不同
* ServletConfig对象配置参数,只对配置Servlet有效,如果配置参数,所有Servlet都可以访问 通过ServletContext
<context-param>

     @Override
public void init(ServletConfig config) throws ServletException {
String name = config.getInitParameter("shellway");
System.out.println(name);
//Enumeration相当于Iterator 它是Iterator的前身
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()) {
String name2 = (String) names.nextElement();
System.out.println(name2+":"+config.getInitParameter(name2));
}
}

ServletConfig对象配置参数的获取

     public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(getServletConfig().getInitParameter("shellway"));
ServletContext sc = getServletContext();
System.out.println(sc.getInitParameter("XXX"));
}

全局的配置参数,所有Servlet都可以访问,通过ServletContext获取

2、通过ServletContext 在多个Servlet间 共享数据
在ServletContext中 保存站点访问次数 ,每当一个用户访问站点,将访问次数+1
在CountServlet 初始化过程中,向ServletContext 保存访问次数 ---- 0 --------------> ServletContext setAttribute

每次访问次数 +1 --- 数据存放ServletContext中 ---- 所有Servlet都可以获得该数据

* 在ServletContext中保存数据,所有Servlet都可以访问

 package com.shellway.servlet;

 import java.io.IOException;

 import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloServlet2 extends HttpServlet {
@Override
public void init() throws ServletException {
ServletContext sc = getServletContext();
sc.setAttribute("times", 0);
System.out.println("已经初始化。。。");
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
int time=(Integer)sc.getAttribute("times");
time++;
sc.setAttribute("times", time);
System.out.println("被访问第:"+time+"次");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}

统计网页访问次数:HelloServlet2

 package com.shellway.servlet;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class CountServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
int time=(Integer)sc.getAttribute("times");
PrintWriter pw = response.getWriter();
pw.write("this site has been visit "+time+" times"); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}

统计网页访问次数:CountServlet

3、通过ServletContext 完成服务器程序转发
什么是转发? 转发和重定向区别 ?
getRequestDispatcher(java.lang.String path) ---- 完成转发

使用转发还是重定向? ---- 转发性能好于重定向,请求次数好

统计字母次数
request.getParameter("content") 获得form 提交内容 content 就是 textarea name属性

 package com.shellway.servletcontext;

 import java.io.IOException;

 import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class CountForA_Z extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//拿到请求数据
String content = request.getParameter("content");
//减少工作量,把内容都转为大写
String upcontent = content.toUpperCase();
//为26个字母创建数组,每个字母对应一个数组位置,每个数组位置存放统计该字母的数量
int[] arr = new int[26];
for (int i = 0; i < upcontent.length(); i++) {
//charAt(int index)返回指定索引处的 char 值。索引范围为从 0 到 length()-1
char c = upcontent.charAt(i);
//isLetter()确定指定字符是否为字母。
if (Character.isLetter(c)) { //等价于c>='A'&&c<='Z'
arr[c-'A']++;
}
}
ServletContext context = getServletContext();
context.setAttribute("arr", arr);
RequestDispatcher rd =context.getRequestDispatcher("/servlet/result");
rd.forward(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}

统计字母次数:CountForA_Z

 package com.shellway.servletcontext;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class CountForResult extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
int []arr1 = (int[])sc.getAttribute("arr");
char c = 0 ;
response.setContentType("text/html;charset=utf-8");
PrintWriter pw =response.getWriter();
for (int i = 0; i < arr1.length; i++) {
c = (char) (i+'A');
pw.write(c+"出现的次数为: "+arr1[i]+" 次"+"<br/>");
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}

统计字母次数:CountForResult

4、利用ServletContext对象读取资源文件

使用java application 读取文件,读取当前工程下所有文件 ----- 使用相对路径读取文件
使用Servlet读取文件 只能读取WebRoot下所有文件 ---- 必须使用绝对磁盘路径读取文件

通过站点根目录绝对路径 获得磁盘绝对路径 ------ getServletContext().getRealPath(“/WEB-INF/info.txt”)

* 因为 WEB-INF/classes 非常特殊 (存放.class文件目录),被类加载器加载,通过Class类对象读取 该目录下文件
String filename3 = c.getResource("/a1.txt").getFile(); ----- / 代表 /WEB-INF/classes

结论:在web工程中,必须将 文件路径转换绝对磁盘路径 c:\xxx e:\xxx\xxx ----- getServletContext().getRealPath("/xxx"); /代表WebRoot
如果读取文件 恰好位于 WEB-INF/classes ----- 通过 类名.class.getResource("/文件名").getFile(); 获得绝对磁盘路径 / 代表 /WEB-INF/classes

 package com.shellway.io;

 import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; public class ReadFile {
public static void main(String[] args) throws Exception {
String fileName = "src/a1.txt";
readfile(fileName); String fileName2 = "WebRoot/a2.txt";
readfile(fileName2); String fileName3 = "a3.txt";
readfile(fileName3);
} private static void readfile(String fileName) throws FileNotFoundException,
IOException {
BufferedReader in = new BufferedReader(new FileReader(fileName));
String len;
while ((len = in.readLine())!=null) {
System.out.println(len);
}
}
}

使用java application 读取上图中文件a1,a2,a3

 package com.shellway.io;

 import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ReadFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName = "/a2.txt";//这里的/代表网站的根目录
String s = getServletContext().getRealPath(fileName);
//返回: D:\apache-tomcat-6.0.14\webapps\day03\a2.txt
System.out.println(s);
readfile(s); String fileName2 = "/a1.txt";//这里的/代表classpath根路径,即: /WEB-INF/classes
String s2 = ReadFileServlet.class.getResource(fileName2).getFile();
//返回: /D:/apache-tomcat-6.0.14/webapps/day03/WEB-INF/classes/a1.txt
System.out.println(s2);//
readfile(s2);
} private static void readfile(String fileName) throws FileNotFoundException,
IOException {
BufferedReader in = new BufferedReader(new FileReader(fileName));
String len;
while ((len = in.readLine()) != null) {
System.out.println(len);
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}

使用Servlet读取文件 只能读取WebRoot下所有文件。只能读取/WEB-INF下的a2和类路径下的a1,而a3读取不了

缺省Servlet 功能:处理其他Servlet都不处理请求
tomcat/conf/web.xml org.apache.catalina.servlets.DefaultServlet 作为缺省Servlet

总结:
1、编写Servlet HelloServlet
2、修改Servlet模板
3、Servlet生命周期 理论重点掌握
4、Servlet url三种写法 完全、目录、扩展名
5、路径问题:绝对路径 ----- 案例 九九乘法表
将web.xml 配置路径复制到网页 在路径前 /工程名
6、ServletConfig 和ServletContext 读取初始化参数区别 ?
7、ServletContext数据共享案例 ----- 统计访问次数
8、ServletContext转发案例 --- 统计字母出现次数
9、读取web工程中资源文件 ---- 绝对路径
在web工程中,必须将 文件路径转换绝对磁盘路径 c:\xxx e:\xxx\xxx ----- getServletContext().getRealPath("/xxx"); /代表WebRoot
如果读取文件 恰好位于 WEB-INF/classes ----- 通过 类名.class.getResource("/文件名").getFile(); 获得绝对磁盘路径 / 代表 /WEB-INF/classes
10、缺省Servlet 了解功能将静态资源数据内容读取写给客户端

java攻城师之路--复习java web之servlet的更多相关文章

  1. java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  2. java攻城师之路--复习java web之Cookie_Session

    Servlet技术 用来动态生成 网页数据资源Servlet生成HTML 页面数据时,所有内容都是通过 response.getWriter response.getOutputStream 向浏览器 ...

  3. java攻城师之路--复习java web之request_respone

    Servlet技术 两条主线1.HTTP协议 2.Servlet生命周期 init() 方法中参数 ServletConfig 对象使用通过ServletConfig 获得 ServletContex ...

  4. java攻城狮之路--复习xml&dom_pull编程续

    本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 ...

  5. java攻城狮之路--复习JDBC

    1.JDBC中如何获取数据库链接Connection? Driver 是一个接口: 数据库厂商必须提供实现的接口. 能从其中获取数据库连接. 可以通过 Driver 的实现类对象获取数据库连接. 1. ...

  6. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

  7. java攻城狮之路--复习xml&dom_pull编程

    xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. ...

  8. java攻城狮之路--复习JDBC(利用BeanUtils、JDBC元数据编写通用的查询方法;元数据;Blob;事务;批量处理)

    1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shel ...

  9. java攻城狮之路--复习JDBC(PrepareStatement)

    PreparedStatement: 1.可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象 2.PreparedS ...

随机推荐

  1. ORA-12541:TNS:无监听程序

    安装oracle以后,sql plus可以正常登陆,pl/sql登陆时报错ORA-12541:TNS:无监听程序,解决方案如下: http://blog.csdn.net/hao134838/arti ...

  2. 使用CDN

    CDN的全称是Content Delivery Network.中文直译过来是:内容交付网络. 它的主要意思是,将某些内容进行交付的网络.对于站点开发而言,我们所讲的内容通常指的是内容文件(比如jav ...

  3. xul 创建一个按钮

    MDN Mozilla 产品与私有技术 Mozilla 私有技术 XUL Toolbars 添加工具栏按钮 (定制工具栏) 添加工具栏按钮 (定制工具栏) 在本文章中 创建一个 overlay 在工具 ...

  4. Tomcat PK Resin

    特征 Tomcat Resin 所属公司 Apache CAUCHO 用户数 多 少 可參考文档 多 少 与Eclipse集成复杂度 适中 较复杂. Eclipse下调试开发 简便 复杂.更新类后会自 ...

  5. 数据库定时删除历史数据的SQL指令

    新建作业,用于定时清除数据库的历史数据 删除表gps_comm 之前120天即一个季度的数据,例如以下: ELETE FROM gps_comm WHERE (时间 < GETDATE() - ...

  6. cacheed 限制 4节点 3000万 es 批量删除 shell脚本练习 elasticsearch_action

    文件分割 "www.laiwunews.cn/xinxi/25324717.html""www.zznews.cn/xinxi/10411214.html"&q ...

  7. click事件触发也有失灵的时候?

    今天做了个手机页面,点击某个按钮->弹出菜单,再点击菜单以外的任意位置->关闭菜单,在其他浏览器里面没有问题,但是在IOS浏览器中并不会关闭. 网上解决这个bug的帖子很多,这篇帖子主要是 ...

  8. android后台input命令模拟按键【转】

    本文转载自:http://www.cnblogs.com/sh1o2os/archive/2013/02/05/2893201.html 有时做开发时,我们使用的触摸屏没有虚拟按键(HOME.BACK ...

  9. 【BZOJ 3032】 七夕祭

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3032 [算法] 交换左右两个相邻格子的摊点,不会改变这一行的摊点个数 交换上下两个相 ...

  10. handbook/CentOS/使用免费SSL证书让网站支持HTTPS访问.md