servlet复习
1. servlet概述
- javaWeb的三大组件
Servlet(今天所说的就是这个组件),Filter(拦截器),Listener(观察者模式)。 - servlet的作用
用来处理用户请求(当客户端发出请求后,由Tomcat去找到可以处理这个请求的Servlet来处理)。
2. servlet的生命周期
javax.servlet.Servlet接口中,有三个方法说明了Servlet的生命周期:
- void init(ServletConfig):创建后马上调用init()完成初始化。
- void service(ServletRequest, ServletResponse):每次处理请求时调用service()方法。
- void destroy():当Tomcat要销毁Servlet实例时,先调用destroy()方法。
3. http的Servlet
写一个Servlet类,继承javax.servlet.http.HttpSevlet类,需要重写doGet方法和doPost方法。
方法:
方法 | 作用 |
---|---|
doGet(HttpServeltRequest req,HttpServletResponse resp) | 由服务器(通过服务方法调用),以允许servlet处理Get请求。 |
doPost(HttpServeltRequest req,HttpServletResponse resp) | 由服务器(通过服务方法调用),以允许servlet处理Post请求。 |
service(HttpServeltRequest req,HttpServeltResponse resp) | 接收来自公共服务方法的标准HTTP请求,并将其分派给该类中定义的do***方法。 |
service(ServletRequest req,ServletResponse resp) | 将客户端请求分派到受保护的服务方法。 |
- HTTP请求方法
Get:通过请求URI得到资源
Post:用于添加新的内容
4. Servlet的实例
Servelt类:
package com.cn.zkk;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo1 implements Servlet {
/*
* 执行时机:当Servlet的实例对象被销毁的时候调用
* 做一些收尾或者清理的工作
*/
public void destroy() {
System.out.println("Servlet销毁了");
}
/*
* 获得ServletConfig的配置对象
*/
public ServletConfig getServletConfig() {
return null;
}
/*
* 获得当前Servlet的属性信息(了解)
*/
public String getServletInfo() {
return null;
}
/*
* 执行时机:当Servlet实例被创建时被调用,用于做初始化的工作
* ServletConfig:Servlet的配置对象,初始化的时候可以进行配置
*/
public void init(ServletConfig arg0) throws ServletException {
System.out.println("servlet组件创建了");
}
/*
* 核心方法
* 执行时机:当一个请求来请求当前的Servlet的时候被调用
* 处理当前Servlet的业务逻辑,并且把结果集(响应)返回给浏览器
* ServletRequest:Servlet请求对象(用于接收请求)
* ServletResponse:Servlet响应对象(用于响应请求)
*/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("响应请求!");
response.getOutputStream().write("<font color='red'>hello Servlet</font>".getBytes());
}
}
web.xml配置:
<servlet>
<!-- 设置servlet的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- 具体的servlet的类 -->
<servlet-class>com.cn.zkk.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- 指定要映射的servlet的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet的具体的映射路径 ,/:表示根目录-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
5. Tomcat启动时创建Servelt
<load-on-startup>
元素的值是一个序号,Tomcat会使用这个序号给多个Servlet排序!然后在Tomcat启动时会按这个顺序来创建Servlet实例对象!1最大。
需要注意的是:当Tomcat启动时创建时只是被创建,但没有做处理请求!参数必须是大于0的整数。
<load-on-startup>1</load-on-startup>
6. ServeltConfig
方法:
方法 | 作用 |
---|---|
getInitParameter(String name) | 返回一个字符串,该字符串包含指定的初始化参数的值,如果该参数不存在,则返回null。 |
getInitParameterNames() | 以字符串对象枚举的形式返回servlet的初始化参数的名称,如果servlet没有初始化参数,则返回空枚举。 |
getServeltContext() | 返回对调用方正在其中执行的ServletContext的引用。 |
getServletName() | 返回此servlet实例的名称。 |
示例:
- Servelt:
String username = config.getInitParameter("username");
System.out.println(username);
Enumeration enums = config.getInitParameterNames();
while(enums.hasMoreElements()){
String name = (String) enums.nextElement();
String pass = config.getInitParameter(name);
System.out.println(name);
System.out.println(pass);
}
web.xml:
<init-param>
<param-name>username</param-name>
<param-value>10086</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
7.Servlet 路径映射
关于url-pattern的配置:
匹配方式 | 配置注意 | 示例 |
---|---|---|
完全路径匹配 | 以/开头 | /aaa |
目录匹配 | 以/开头 | /aaa/* |
扩展名匹配 | 不能以/开头 | *.do |
优先级:完全路径匹配 > 目录匹配 > 扩展名匹配
经典错误:/*.do
8.ServletContext(用来获取全局参数)
主要应用:
- 获取web应用的全局初始化参数
- 通过ServletContext对象实现数据共享
- 利用ServletContext对象读取资源文件
方法:
返回类型 | 方法 |
---|---|
Object | getAttribute(String name) :返回具有给定名称的servlet容器属性,如果该名称中没有属性,则返回null。 |
String | getContextPath():返回web应用程序的上下文路径。 |
String | getIninParameter(String name):返回一个字符串,该字符串包含指定的上下文范围初始化参数的值,如果该参数不存在,则返回null。 |
String | getRealPath(String path):返回一个字符串,该字符串包含给定虚拟路径的实际路径 |
void | setAttribute(String name, Object obj):将对象绑定到此servlet上下文中给定的属性名。 |
InputStream | getResourceAsStream(String path):以InputStream对象的形式返回位于指定路径的资源。 |
ServletContext | getServletContext:获得ServletContext的对象 |
获得文件的资源(以后会大量的使用):
使用类加载器的方式来读取classpath下的资源,使用的好处是:不依赖与ServletContext,任何类都可以获取classpath下的资源文件,不需要自己指定/WEB-INF/classpath
- 重点:this.getClass().getClassLoader().getResourceAsStream(“需要找到的文件名”);
示例:
Servelt(ServletContext来访问网站来统计次数):
ServletContext sc = getServletContext();
Integer value = (Integer)sc.getAttribute("value");
if(value == null){
sc.setAttribute("value", 1);
}else{
sc.setAttribute("value", ++value);
}
value = (Integer)sc.getAttribute("value");
String result = "<font color='red' size='20'>当前站点被点击的次数是"+value+"次!</font>";
response.getOutputStream().write(result.getBytes());
9. 单例的Servlet
因为Servlet实例是由Tomcat来创建的,但Tomcat只会创建一个Servlet实例,所以Servlet就是单例的!
- Servelt是线程不安全的