Servlet基础
本文总结JavaEE中Servlet技术的基本结构, Servlet中的基本方法和ServletConfig, ServletContext对象的作用及方法
1. Servlet是什么, 它用来解决什么问题的?
a. Servlet是为了增强主机上的应用被request-response programming model 访问能力而设计的一个Java类
b. 尽管Servlet可以处理各种形式的request, 但是一般servlet只用于处理基于web server的应用请求
c. 对于web server网络应用服务的请求, servlet定义了一类Http-形式的servlet类
2. Servlet存在有什么必要的条件, 如何创建以Servlet类?
a. 所有的Servlet都需要继承Servlet接口
b. Servlet接口中定义了有关servlet的life-cycle方法
c. 如果要实现一个generic servlet, 可以extends GenericServlet得到一个类
d. 实现处理一个web application的servlet, 一般extends HTTPServlet
e. HTTPServlet类中提供了doGet/ doPost方法来处理HTTP-类型的服务
3. 什么是life-cycle方法?
a. lifecylc方法定义了Servlet的生命周期
b. 一个Servlet的生命周期包括3部分
b.1 如果还不存在servlet实例对象, web container会
b.1.a 加载servlet class
b.1.b 创建servlet class实例对象
b.1.c 通过init method初始化 servlet 实例对象
b.2 存在了servlet实例对象后, service方法会运行, 并被传入request和response对象
b.3 如果需要移除servlet实例对象, web container 会通过destroy方法来消除这个servlet实例
4. servlet处理life-cycle方法外还提供了什么方法, 对应哪些对象, 都是什么作用?
a. 除了life-cycle之外, 还提供了两个重要的获取方法: getServletConfig和getServletContext
b. 对应得到的ServletConfig对象是为了获取配置在web.xml-<servlet>标签中的servlet的初始化参数<init-param>而建立的
b.1 初始化时可以通过init(ServletConfig) 方法在init中调用初始化参数 getInitParameter/getInitParameterNames
b.2 还可以获得一些上级对象的信息: getServletContext/ getServletName
c. 对应得到的ServletContext对象有着十分广泛的应用, ServletContext可以:
c.1 作为Webapp中所有的servlet的控制类
- URL getResource(String path) 获取一个servlet
- getRequestDispatcher(String path) 获取一个RequestDispatcher再去操作include/forward(ser_x.request, ser_y.response)
c.2 提供Webapp下所有Servlet的共享数据设置和获取
- set/get/removeAttribute 操作共享的Object-valued attributes 数据/资源
- InputStream getResourceAsStream(String path) / String getRealPath(String virtualPath) / URL getResource(String path) 获取Webapp下资源文件
c.3 作为Webapp的代表与其他的Webapp进行资源/信息的交互
- getContext(String contextPath)
c.4 除去 c.1,2,3 中的功能, ServletContext还提供了一些方法获取一些general的信息
- getMimeType(); 自动获得文件类型的MIME类型字符串
- getServerInfo()
5. Browser向WebServer发出请求调用一个Servlet, 整个机制是什么样的?
a. 上图展示了一个简易的BS模型
b. Web Container/ Web Server 会将Browser按http协议发出的信息处理成:
b.1 HTTPServerRequest对象让Servlet解析, http-request部分的信息
b.2 同时, Web Container还会生成一个HTTPServerResponse对象让Servlet去根据需要构造返回给Browser的http-response部分信息
c. Request和Response对象是被传递给service方法来处理的
6. WebServer的配置文件和Servlet有什么关系?
a. 使用Tomcat WebServer时, web.xml自动配置了一个ServletContext下所有的servlet文件的<servlet>和<servlet-mapping>标签信息
b. <servlet>子标签<servlet-name><servlet-class>定义了servlet的名称和在classes目录下带package信息的名称
b.1 <servlet>中还可以设置<init-param>为ServletConfig对象在init方法中读取servlet的初始化信息
b.2 <servlet>中可以设置<load-on-startup>标签设置让servlet在服务器启动的时候即初始化
c. <servlet-mapping>子标签<servlet-name><url-pattern>指定了url访问此servlet时相对于ServletContextPath的虚拟路径
d. url-pattern定义的一些细节:
d.1 /* : 表示任意的路径都可访问
d.2 *.xxx : 表示以.xxx结尾的路径都可访问
d.3 /*和*.xxx 不可同时使用, 会造成歧义
d.4 访问是从外层文件夹向内进行的, 按照某个路径访问, 先遇到符合条件的servlet的url-pattern就先访问这个servlet
参考资料:
[1] Java_EE 6.0 Tutorial Basic Concept, 4th Edition, Eric Jendrock el, Addison-Wesley press
[2] 传智播客徐文海JavaWeb笔记
[3] 传智播客赵君JavaWeb视频