servlet是运行在服务器端的小程序,Servlet一词由Java Servlet Applet而来。Servlet是一个独立于平台的Java类,实际就是按照Servlet规范编写的一个Java类。Servlet被编译成为平台独立的字节码文件,可以被Web服务器加载和运行,可以生成动态的web页面。
特点
1、简单、实用的API方法
2、高效率:N个并发的请求,Servlet将启动N个线程处理,但只创建一个Servlet实例。
3、功能强大
4、可移植性
Servlet的开发和执行步骤
1、编写一个Java类使其继承HttpServlet类并覆盖doGet和doPost方法。
2、在配置文件web.xml中配置Servlet
<servlet> <servlet-name>servlet名</servlet-name> <servlet-class>servlet的class全名</servlet-class> </servlet> <servlet-mapping> <servlet-name>servlet名</servlet-name> <url-pattern>Servlet的访问路径</url-pattern> </servlet-mapping>
3、项目部署到服务器,并启动服务器
4、请求servlet:地址栏URL、超链接、表单
Servlet API
Servlet API包含两个包:javax.servlet和javax.servlet.http包。javax.servlet包中定义的类和接口时独立于协议的。
1、Servlet接口
javax.servlet.Servlet接口是任何一个Servlet都要直接或间接实现的。
方法 | 说明 |
public void init(ServletConfig config) | Servlet实例化后,Servlet容器调用此方法完成初始化工作 |
public ServletConfig getServletConfig() | 获取Servlet对象的配置信息,返回ServletConfig对象 |
public void service(ServletRequest request,ServletResponse response) | 处理request对象封装的客户端请求,并使用response返回请求结果 |
public String getServletInfo() | 返回描述Servlet的一个字符串 |
public void destory() | 当Servlet将要卸载时由Servlet引擎调用,以释放资源 |
2、ServletConfig接口
在ServletConfig对象中包含Servlet的初始化参数信息。
方法 | 说明 |
public String getServletName() | 该方法返回一个Servlet实例的名称,该名称由服务器管理员提供 |
public ServletContext getServletContext() | 返回一个ServletContext对象的引用 |
public String getInitParameter(String name) | 返回一个由参数name决定的初始化变量的值,如果该变量不存在,返回null |
public Enumeration getInitParameterNames() | 返回一个存储所有初始化变量的枚举函数,如果Servlet没有初始化变量,返回一个空枚举函数 |
3、GenericServlet类
GenericServlet类是一种与协议无关的Servlet,它直接实现了Servlet接口,是一个抽象类。该类实现了Servlet接口中除了service()方法之外的所有抽象方法,但是是默认实现,其还实现了ServletConfig接口。
4、HttpServlet类
HttpServlet类继承了GenericServlet类,也是一个抽象类。HttpServlet类为Servlet接口提供了HTTP相关的通用实现。
5、ServletRequest和ServletResponse接口
Servlet由Servlet容器(Web服务器)来管理,当客户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象将被容器作为service()方法的参数传递给Servlet,Servlet利用ServletRequest对象获取客户端发来的请求数据,利用ServletResponse对象发送响应数据。
ServletRequest
方法 | 说明 |
public Object getAttribute(String name) | 返回请求范围对象内以name为名字的属性的值,如果该属性不存在,这个方法将返回null |
public void setAttribute(String name,Object o) | 将对象o保存在请求范围对象内名字为name的属性,如果第二个参数o为null,那么相当于调用removeAttribute(name) |
public void removeAttribute(String) | 移除请求范围内名字为name的属性 |
public String getCharacterEncoding() | 返回请求正文使用的字符编码的名字,如果请求没有指定字符编码,这个方法将返回null |
public String getContentType() | 返回请求正文的MIME类型。如果类型不可知,这个方法将返回null |
public String getParameter(String name) | 返回请求范围对象中name属性的值。如果name参数有多个值,那么这个方法将返回值列表中的第一个值。如果没有则为null |
public String[] getParameterValues(String name) | 返回请求范围对象中name参数所有的值,如果这个参数在请求中并不存在,这个方法将返回null |
public RequestDispatcher getRequestDispatcher(String path) | 返回指定资源名的RequestDispatcher对象,作为path所定位的资源的封装 |
ServletResponse
方法 | 说明 |
public String getCharacterEncoding() | 返回响应使用字符解码的名字,除非显示设置,否则为ISO-8859-1 |
public OutputStream getOutputStream() | 返回用于将返回的二进制输出写入客户端的流,此方法和getWriter()方法二者只能调用其一 |
public Writer getWriter() | 返回用于将返回的文本输出写入客户端的一个字符写入器,此方法和getOutputSteam()二者只能调用其一 |
public void setContentType(String type) | 设置字符编码方式和内容类型 |
6、HttpServletRequest和HttpServletResponse接口
HttpServletRequest是专用于HTTP的ServletRequest子接口。
方法 | 说明 |
public Cookie[] getCookies() | 返回一个数组,该数组包含这个请求中当前的所有cookie。如果这个请求中没有cookie,则返回一个空数组 |
public String getMethod() | 返回这个请求使用的HTTP请求方式(GET、POST、PUT) |
public String getRequestedSessionId() | 返回这个请求相应的session id。如果由于某种原因客户端提供的session id是无效的,这个session id 将于当前session id中的session id不同,与此同时,将建立一个新的session |
public HttpSession getSession() | 返回与这个请求关联的当前有效的session。在没有session与这个请求关联的情况下,将会新建一个session |
public HttpSession getSession(boolean create) | 返回与这个请求关联的当前有效的。在没有与这个请求关联的情况下,如果参数create为真时将新建一个session;如果参数create为假时,这个方法会返回空值。为了确保session能够被完全维持,servlet开发者必须在响应被提交之前调用该方法 |
HttpServletResponse子接口
方法 | 说明 |
public void addCookie(Cookie cookie) | 将一个Cookie加入到响应中 |
public void senRedirect(String location) | 重定向到某一web组件中 |
public void sendError(int status) | 设置响应状态码为指定值(可选的状态信息) |
7、ServletContext接口
一个ServletContext接口对象表示一个web应用程序的上下文,运行在Java虚拟机中的每个web应用程序都有一个与之相关的servlet上下文。
方法 | 说明 |
public Object getAttribute(String name) | 返回Servlet上下文中名字为name的对象。名字为name的对象是全局对象,因为它们可以被同一Servlet在另外某一任意时刻访问,或上下文中任意其它的Servlet访问 |
public void setAttribute(String name, Object obj) | 将对象obj保存在Servlet上下文中,名字为name |
public getInitParameter(String name) | 返回指定上下文范围的初始化参数值 |
8、HttpSession接口
HttpSession接口被Servlet容器用来实现在HTTP客户端和HTTP会话两者的关联。
方法 | 说明 |
public long getCreationTime() | 返回建立Session的时间,这个时间表示为自1970年1月1日0时0分0秒0毫秒GMT至创建经历的毫秒数 |
public String getId() | 返回分配给这个Session的标识符。一个HTTP session的标识符是一个由服务器来创建和维持的唯一的字符串 |
public long getLastAccessedTime() | 返回客户端最后一次发出与这个session有关的请求的时间,如果这个session是新建立的,返回-1.这个世界表示为自1970年1月1日0时0分0秒0毫秒GMT至最后一次访问所经历的毫秒数 |
public int getMaxInactiveInterval() | 从最后一次与客户端发生交互开始计算,返回会话存活的最大秒数 |
public void setMaxInactiveInterval(int seconds) | 从最后一次与客户端发生交互开始计算,设置会话存活的最大秒数 |
public Object getAttribute(String name) | 返回会话中名字为name的对象,如果不存在,则返回null |
public void setAttribute(String name,Object value) | 将对象value保存在会话中,指定名字为name |
public void removeAttribute(String name) | 删除会话中此前保存的名称为name的对象 |
Servlet的生命周期
1、Servlet类加载:Servlet容器在Servlet被第一次请求时执行,该阶段仅执行一次。主要操作包括将Servlet对应的class文件载入内存。
2、实例化Servlet:Servlet容器创建ServletConfig对象,其包含Servlet的初始化配置信息,此外Servlet容器还会使得ServletConfig对象与当前Web应用的ServletContext对象关联。该阶段仅执行一次。
3、Servlet提供服务:该阶段客户端请求一次执行一次。在这个阶段Servlet可以随时响应客户端的请求。当Servlet容器接到访问特定Servlet请求时,Servlet容器会创建针对这个请求的ServletRequest和ServletResponse对象,ServletRequest对象用来封装请求信息,ServletResponse对象用来生成响应信息,然后调用service(ServletRequest request,ServletResponse response)方法传值。经过Servlet对象的doGet或doPost方法处理后,处理结果封装在ServletResponse对象中返回。当Servlet容器把Servlet生成的响应结果发送到客户端后,Servlet容器会销毁ServletRequest和ServletResponse对象。
4、销毁Servlet:该阶段执行一次。当web应用被终止时,Servlet容器会先调用Web应用中所有的Servlet对象的destroy()方法,然后再销毁Servlet对象Servlet对象。此外,容器还会销毁与Servlet对象关联的ServletConfig对象。在destroy()方法的实现中,可以编写代码释放Servlet所占用的资源,例如,关闭文件输入输出流、关闭与数据库的连接等。
Servlet中的跳转
request.getRequestDispatcher("转发的目标文件路径").forward(request,response);
response.sendRedict("重定向的目标文件路径");
1、forward(request,response)必须添加,否则该语句无效
2、转发可以携带request和response,是在服务端直接完成的,返回响应给浏览器后,浏览器的地址栏URL是发生转发的页面而非转发后的页面。
3、重定向是服务端返回给浏览器3xx状态的响应,浏览器需要重新对响应中的URL进行请求,是全新的请求——响应过程。