一 servlet 简述
1 servlet是运行在web服务器中的java小程序,通常通过HTTP接受和响应客户端请求。
2 service方法:每次响应请求时执行该方法
3 destroy方法:web容器关闭前即销毁servlet实例前调用该方法
三 HttpServlet简述
1 HttpServlet继承抽象类GenericServlet(实现了接口Servlet),常用方法:doGet、doPost
2 servletcontext在web容器启动时创建,一个web应用中的所有servlet共享一个servletcontext,实现数据共享
D获取工程中文件流
1 servlet是运行在web服务器中的java小程序,通常通过HTTP接受和响应客户端请求。
2 servlet一定要实现javax.servlet.Servlet接口,并且要在web.xml中部署
3 servlet是单例的,不是同步的,不是线程安全的(多个线程同时访修改成员变量即属性,会出错如属性值10经过两个线程同时修改后变为11),所以一般不设置servlet的属性
二 servlet生命周期-三个方法
1 init方法:第一次url访问时,servlet初始化2 service方法:每次响应请求时执行该方法
3 destroy方法:web容器关闭前即销毁servlet实例前调用该方法
三 HttpServlet简述
1 HttpServlet继承抽象类GenericServlet(实现了接口Servlet),常用方法:doGet、doPost
2 网页直接访问servlet映射的url时,调用的方法为doGet。如果为post方式,可采用表单提交。
四 servlet在web.xml中的配置说明
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>com.google.servlet.ServletClassName</servlet-class>
<load-on-startup>0</load-on-startup>
<init-param>
<param-name>username</param-name>
<param-value>abc</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/appletUploadServlet.do</url-pattern>
</servlet-mapping>
1映射路径url-pattern的分类和优先级
完全路径匹配,以/开头,如/aaa/aaa/bbb
> 目录匹配,以/开头,如/aaa/*/*
> 扩展名匹配,不能以/开头,如*.do*.action 禁止/*.do
2容器(服务器)启动时实例化servlet,参数load-on-startup,值只能大于等于0,表示一个序号,用来给servlet排序,服务器启动时按照这个顺序来实例化servlet对象
3初始化参数init-param,参数值都为String类型,只针对当前servlet有效
五 获取servlet的成员变量:ServletConfig和ServletContext
1 servletconfig在init方法中如何获取web.xml中初始化init-param的参数名称和参数值
public void init(ServletConfig config) throws ServletException {
//方式一,初始化参数名称已知,获取对应的参数值
String userNameValue = config.getInitParameter("username");
//方式二,获取所有初始化名称组成的枚举,遍历初始化参数的名称name和参数值value
Enumeration enums = config.getInitParameterNames();
while(enums.hasMoreElements()) {
String name = (String) enums.nextElement();
String value = config.getInitParameter(name);
}
}
2 servletcontext在web容器启动时创建,一个web应用中的所有servlet共享一个servletcontext,实现数据共享
A 获取全局参数值
<context-param>
<param-name>context_key</param-name>
<param-value>context_value</param-value>
</context-param>
<context-param>
<param-name>config_key</param-name>
<param-value>config_value</param-value>
</context-param>
public void init(ServletConfig config) throws ServletException {
//获取ServletContext对象
ServletContext sc = config.getServletContext();
//根据参数名称获取参数值
String val = sc.getInitParameter("context_key");
//获取所有初始化名称组成的枚举,遍历初始化参数的名称name和参数值value
Enumeration enums = sc.getInitParameterNames();
while(enums.hasMoreElements()) {
String name = (String) enums.nextElement();
String value = sc.getInitParameter(name);
}
}
B 全局属性的设置,应用案例,站点访问的统计
//获取ServletContext对象
ServletContext sc = config.getServletContext();
//获取全局属性的值
Integer callCount = (Integer) sc.getAttribute("callCount");
if (callCount == null) {
sc.setAttribute("callCount", 1);
} else {
sc.setAttribute("callCount", ++callCount);
}
C 获取工程中文件的目录路径
//获取ServletContext对象
ServletContext sc = config.getServletContext();
//获取工程目录的位置
String projectPath = sc.getRealPath("");//该参数值随便写如/aaa,不会被校验
System.out.println(projectPath);
D获取工程中文件流
//获取ServletContext
ServletContext sc = config.getServletContext();
//根据servletcontext获取文件流
sc.getResourceAsStream("/fileNameToProjectPath"); // 文件,相对工程路径
//根据类加载器获取文件流,不依赖servletContext,更常用
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/fileNameToClassPath");//文件,相对类文件的根目录