JavaWeb攻坚(Servlet详解)

前段时间一直在进行Android方面的学习,逐渐显露出自己在后端方面的力不从心,于是打算花费一些时间来研究一下后端知识。
那就从最简单的Servlet学起吧。
Servlet技术是基于Request-Response编程模型的,其为一个接口,在编程中只需实现Servlet接口,该类便可成为一个Servlet,Tomcat帮我们实现了两个类, GenericServlet 和 HttpServlet,而之后的HttpServlet是直接对Http协议进行相关处理的。
接下来简介一下Servlet的生命周期:
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方法和doGet、doPost方法之间的联系和区别?
    首先,不管是什么请求,都会调用service方法,然后,tomcat自动分析该请求是什么方式的请求,然后在service方法里区别处理不同方式的请求,所以,在继承了HttpServlet的自定义类中,只需实现具体的请求方法即可,tomcat会在service方法中自动调用请求方法。
    配置Servlet随tomcat服务器启动时 进行初始化 —
    * 参数可以是一个数字 0-9 代表服务器加载优先级 0 最高
    例如:在tomcat启动时,想通过Servlet加载一些框架配置文件 配置随服务器启动 (struts1 )
    结论:
    1、编写Servlet 继承HttpServlet
    2、编写Servlet 不需要覆盖service方法,只需要覆盖doGet和doPost 方法
    在Servlet生命周期的方法中,有两个初始化的方法,在编程时只需覆盖init()方法而无需覆盖init(ServletConfig config)方法,原因是init(ServletConfig config)调用了init()方法
    一个Servlet可以配置多个url-pattern
    URL 配置格式 三种:
    1、完全路径匹配 (以/开始 ) 例如:/hello /init
  • 当前工程没有被正确发布,访问该工程所有静态资源、动态资源 发生404 ----- 工程启动时出错了
  • 查看错误时 分析错误
  1. 单一错误 : 从上到下 查看第一行你自己写代码 (有的错误与代码无关,查看错误信息)
    2)复合错误 Caused by ---- 查看最后一个Caused by
  • Invalid init2 in servlet mapping

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

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

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

相对路径:相对当前网页地址 路径 例如 chengfabiao ./chengfabiao …/chengfabiao
例如: http://localhost/day05/chengfabiao.html 提交 action=“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配置初始化参数

itcast
传智播客

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

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

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

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

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

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

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

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

缺省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 了解功能将静态资源数据内容读取写给客户端

猜你喜欢

转载自blog.csdn.net/qq_42453117/article/details/88073863
今日推荐