Servlet建立 生命周期 继承结构 Servlet的配置 ServletConfig ServletContext
2013-10-15 00:41
543 查看
<为Servlet配置模版>
1. plugins/com.genuitec.eclipse.wizards.xxx.jar ---- 都是zip格式的
2. 打开Jar包中的Templates文件夹既可以看到Servlet.java源代码,直接修改就可以了
1、Servlet建立
----创建一个JAVA文件,继承自HttpServlet
----覆盖doGet doPast方法
----将JAVAEEjar包设置classpath
---在web.xml中配置java文件位置,并启动服务
2、Servlet生命周期
(1)tomcat启动后,当用户第一次访问Servlet的时候,首先创建一个Servlet对象,创建ServletConfig对象,然后执行Init()方法实例化Servlet
(2)执行service(); 当接收一个HTTP请求,如果Servlet已比实例过的话会直接执行service()方法,Tomcat会将对象HttpServletRequest,HttpServletResponse传进来。
(3)执行dectory()方法; 此方法在服务关闭的时候或应用被移除的时候才会调用
3、Servlet继承结构
|--------Servlet接口 定义了init() service() dectory()方法
|-------abstract GenericServlet implements Servlet
实现了Init()方法 空实现了dectory()方法
init();
init(ServletConfig config); Tomcat启动时会执行此有参的init()将ServletConfig对象传进来,并将ServletConfig设为全局的对象,供别的对象调用
dectory(); 对此对象进行了空实现,子类不一定非要重写,如果没有什么任务,也可以选择不重写
abstract service();此方法为抽象方法,因为不知道子类如何实现,所以定义为抽象的。让子类去执行
|-------HttpServlet
重写了service方法,并对来访的HTTP进行了判断,如果是GET请求而来,那么提供了doGet供子类重写方法,如果是POST方式,那么提供了doPOST供子类重写
4、Servlet的配置
示例:
(1)多个Servlet-mapping可以指向一个Servlet,不管哪个路径都可以访问到Servlet
(2)url-pattern中可以使用*匹配符,但是必须是/开头/*结束或*.后缀的方式。匹配规则:哪个最像匹配哪个,*.后缀优先级最低
(3)load-on-startup 加上此标签后,服务器启动后会首先创建Servlet对象 中间的字代码加载的优先级 如果优先级设置一样。那么要看在web.xml中配置的先后顺序创建,此标签在<Servlet>下面
(4)缺省Servlet -- 所有其他Servlet都不处理的请求由他处理 ,其实对静态资源的访问就是由缺省Servlet来进行的
(5)Servlet的线程安全问题
因为涉及到多个用户同时访问Servlet的情况,而多个用户并发访问的时候如果操作同一数据的话,会造成多线程访问数据安全问题,所以建议在Servlet尽量写局部变量,不要写全局变量。如果需要全局变量,只能为线程加snycrchrozied同步块,但是此方法会使用程序运行在客户端访问是感觉执行很慢,甚至出现超时现象
5.ServletConfig
(1)取得this.getServletConfig().getServletContext()
(2)取得当前Servlet名字 this.getServletConfig().getServletName();
(3)取得当前Servlet的所有参数
(3)取得当前Servlet的具体参数
6.ServletContext -- 带表当前web应用
生命周期:在服务器启动,web应用加载后,服务器立即创建代表当前web应用的ServletContext对象,这个对象和当前web应用是一一对应的。
(1)做为 对象在在整个web应用范围内共享数据
作用范围: 整个web应用范围。
生命周期:随着web应用的加载而创建,随着web应用的销毁而销毁。
setAttribute(String name ,Object value);
getAttribute(String name);
removeAttribute(String name);
(2)获取web应用的初始化信息
web.xml
通过ServletContext对象的 .getInitParameter("encode");getInitParameterNames();可以获取出来
(3)实现请求转发 (请求重定向)
(4)获取资源
由于直接写路径是相对于程序的启动目录,在web环境下写的路径就相对于了tomcat/bin目录了,所以是找不到web应用中的资源。
我们可以使用ServletContext.getRealPath()获取路径,传入相对于当前web应用的路径,此方法会在传入的路径前,拼接当前web应用的硬盘路径,从而得到资源的硬盘路径。
在没有ServletContext的环境下,可以使用类加载器机制获取资源,getResource方法,传入一个相对于类加载目录(WEB-INF/classes)的路径,从而在传入的路径前拼接类加载目录的硬盘路径,从而获取到资源的硬盘路径。
1. plugins/com.genuitec.eclipse.wizards.xxx.jar ---- 都是zip格式的
2. 打开Jar包中的Templates文件夹既可以看到Servlet.java源代码,直接修改就可以了
1、Servlet建立
----创建一个JAVA文件,继承自HttpServlet
----覆盖doGet doPast方法
----将JAVAEEjar包设置classpath
---在web.xml中配置java文件位置,并启动服务
2、Servlet生命周期
(1)tomcat启动后,当用户第一次访问Servlet的时候,首先创建一个Servlet对象,创建ServletConfig对象,然后执行Init()方法实例化Servlet
(2)执行service(); 当接收一个HTTP请求,如果Servlet已比实例过的话会直接执行service()方法,Tomcat会将对象HttpServletRequest,HttpServletResponse传进来。
(3)执行dectory()方法; 此方法在服务关闭的时候或应用被移除的时候才会调用
3、Servlet继承结构
|--------Servlet接口 定义了init() service() dectory()方法
|-------abstract GenericServlet implements Servlet
实现了Init()方法 空实现了dectory()方法
init();
init(ServletConfig config); Tomcat启动时会执行此有参的init()将ServletConfig对象传进来,并将ServletConfig设为全局的对象,供别的对象调用
dectory(); 对此对象进行了空实现,子类不一定非要重写,如果没有什么任务,也可以选择不重写
abstract service();此方法为抽象方法,因为不知道子类如何实现,所以定义为抽象的。让子类去执行
|-------HttpServlet
重写了service方法,并对来访的HTTP进行了判断,如果是GET请求而来,那么提供了doGet供子类重写方法,如果是POST方式,那么提供了doPOST供子类重写
4、Servlet的配置
示例:
<servlet> <servlet-name>XXX</servlet-name> <servlet-class>com.itheima.XXX</servlet-class> </servlet> <servlet-mapping> <servlet-name>XXX</servlet-name> <url-pattern>/servlet/XXX</url-pattern> </servlet-mapping>
(1)多个Servlet-mapping可以指向一个Servlet,不管哪个路径都可以访问到Servlet
<servlet> <servlet-name>XXX</servlet-name> <servlet-class>com.itheima.XXX</servlet-class> </servlet> <servlet-mapping> <servlet-name>XXX</servlet-name> <url-pattern>/servlet/XXX</url-pattern> </servlet-mapping>
<servlet-mapping>
<servlet-name>XXX</servlet-name>
<url-pattern>/servlet/YYY</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XXX</servlet-name>
<url-pattern>/servlet/ZZZ</url-pattern>
</servlet-mapping>
(2)url-pattern中可以使用*匹配符,但是必须是/开头/*结束或*.后缀的方式。匹配规则:哪个最像匹配哪个,*.后缀优先级最低
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.itheima.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <!-- 这里的×前面不能加任何东西 --> <url-pattern>*.du</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
(3)load-on-startup 加上此标签后,服务器启动后会首先创建Servlet对象 中间的字代码加载的优先级 如果优先级设置一样。那么要看在web.xml中配置的先后顺序创建,此标签在<Servlet>下面
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.itheima.MyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
(4)缺省Servlet -- 所有其他Servlet都不处理的请求由他处理 ,其实对静态资源的访问就是由缺省Servlet来进行的
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern></url-pattern> </servlet-mapping>
(5)Servlet的线程安全问题
因为涉及到多个用户同时访问Servlet的情况,而多个用户并发访问的时候如果操作同一数据的话,会造成多线程访问数据安全问题,所以建议在Servlet尽量写局部变量,不要写全局变量。如果需要全局变量,只能为线程加snycrchrozied同步块,但是此方法会使用程序运行在客户端访问是感觉执行很慢,甚至出现超时现象
5.ServletConfig
(1)取得this.getServletConfig().getServletContext()
(2)取得当前Servlet名字 this.getServletConfig().getServletName();
(3)取得当前Servlet的所有参数
Enumeration enumeration = this.getServletConfig() .getInitParameterNames(); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); }
(3)取得当前Servlet的具体参数
this.getServletConfig().getInitParameter("username");
6.ServletContext -- 带表当前web应用
生命周期:在服务器启动,web应用加载后,服务器立即创建代表当前web应用的ServletContext对象,这个对象和当前web应用是一一对应的。
(1)做为 对象在在整个web应用范围内共享数据
作用范围: 整个web应用范围。
生命周期:随着web应用的加载而创建,随着web应用的销毁而销毁。
setAttribute(String name ,Object value);
getAttribute(String name);
removeAttribute(String name);
(2)获取web应用的初始化信息
web.xml
<context-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </context-param>
通过ServletContext对象的 .getInitParameter("encode");getInitParameterNames();可以获取出来
(3)实现请求转发 (请求重定向)
(4)获取资源
由于直接写路径是相对于程序的启动目录,在web环境下写的路径就相对于了tomcat/bin目录了,所以是找不到web应用中的资源。
我们可以使用ServletContext.getRealPath()获取路径,传入相对于当前web应用的路径,此方法会在传入的路径前,拼接当前web应用的硬盘路径,从而得到资源的硬盘路径。
在没有ServletContext的环境下,可以使用类加载器机制获取资源,getResource方法,传入一个相对于类加载目录(WEB-INF/classes)的路径,从而在传入的路径前拼接类加载目录的硬盘路径,从而获取到资源的硬盘路径。
相关文章推荐
- Servlet之重定向、配置访问路径、处理多个请求、生命周期、config和context、层次结构、线程安全问题
- JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
- Machine.Config Web.Config及配置文件层次结构和继承(转载)
- SerVlet-Config(单一servlet参数配置)/ConText(web项目内容)的使用
- (转)JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
- JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
- JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
- Servlet的调用过程_生命周期_继承结构
- Spring 配置中<context:annotation-config/> 的作用
- 关于Spring的<context:annotation-config/>配置详解
- web.xml 配置 contextConfigLocation
- Java Servlet【3】<load-on-startup>的配置、ServletConfig对象如何提起信息
- servlet基础(Tomcat的配置和应用的建立)
- action="post" 、 servletconfig 、 servletcontext 、getPrintWiter() 、context-param、 init-param(第一个完整的servlet)
- 扩展 web.config 配置文件结构
- Maven的pom.xml文件结构之基本配置parent和继承结构
- SpringMVC源码 1 ContextLoaderListener和Servlet容器web.xml配置
- 大型程序的结构(二)【配置选项config.py】
- context:annotation-config配置和context:component-scan配置
- 关于Spring中的<context:annotation-config/>配置