1.public interface Servlet
Servlet接口的基本目标是提供Servlet生命周期有关的方法:
init()
destroy()
service(ServletResquest req,ServletResponse resp):当用户对于Servlet发出请求的时候容器会调用该方法处理用户的请求,ServletResquest 提供用户访问请求数据的方法,ServletResponse提供构造Servlet响应的方法
getServletConfig()
源码以下:java
public interface Servlet { //容器在启动的被调用,仅调用一次 void init(ServletConfig var1) throws ServletException; //获取Servlet配置 ServletConfig getServletConfig(); //处理具体请求 void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; //获取Servlet的相关信息 String getServletInfo(); //Servlet销毁后释放资源 void destroy(); }
2.public abstruct class GenericServlet extends Object implements Servlet,ServletConfig、Serilalizable
GenericServlet是一个抽象类,是Servlet接口的直接实现
init()
init()
service()
destory()
getServletConfig()
getServletContext()
getServletInfo()
GenericServlet源码:
web
package javax.servlet; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; import java.util.ResourceBundle; public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { private static final String LSTRING_FILE = "javax.servlet.LocalStrings"; private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings"); private transient ServletConfig config; public void destroy() { } public String getInitParameter(String name) { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getInitParameter(name); } public Enumeration getInitParameterNames() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getInitParameterNames(); } public ServletConfig getServletConfig() { return this.config; } public ServletContext getServletContext() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getServletContext(); } public String getServletInfo() { return ""; } public void init(ServletConfig config) throws ServletException { this.config = config; init(); } public void init() throws ServletException { } public void log(String msg) { getServletContext().log(getServletName() + ": " + msg); } public void log(String message, Throwable t) { getServletContext().log(getServletName() + ": " + message, t); } public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse) throws ServletException, IOException; public String getServletName() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getServletName(); } }
3.public abstract class HttpServlet extends GenericServlet implements Serilalizable
HttpServlet类的主要方法:
1.service(HttpServletResquest req,HttpServletResponse resp)
HttpServlet重写了Servlet接口中的service方法,该方法用于判断用户的请求方式,若是是Get请求就调用相应的doGet方法,若是是Post方法,就调用相应的doPost方法。所以开放人员在编写Servlet的时候,只须要重写doGet、doPost方法便可,而不要去重写service方法,若是Servlet收到一个Http请求而并无调用相应的do方法,它就返回一个说明此方法对于本资源不可用的报告,在HttpServlet的源码中有所体现
2.doGet:用来处理Get请求
3.doPost:用来处理Post请求
须要注意的是:HttpServlet方法是能够处理Http请求的Servlet,在Servlet原有的基础上边添加了对Http协议的处理,所以开发人员在编写Servlet的时候多数是继承与HttpServlet,而不是直接去实现Servlet接口(毫无心义)。
4.Servlet生命周期:从建立到相应客户请求直至销毁的过程
1.加载和实例化:服务器运行中、Servlet被更改
2.初始化:调用Init()方法,能够读取一些固定数据、初始化JDBC的链接以及创建与其余资源的链接等操做
3.处理请求:服务器接收到客户端的请求时,会为该请求建立一个请求对象和相应对象并调用Service(),service()方法肯定了请求方式,调用相应的do方法,若是有多个客户端同时访问Servlet时,服务器就会为每个请求建立一个线程,这样就能够并行处理多个请求。
4.销毁
5.Servlet的两种声明方式:两种方式任一种均可以,我的以为注解式在如今更为简单
1.基于web.xml的配置
<servlet>
<description>this is dispacther</description> //简单的叙述,可有可无
<servlet-name>Servlet`s name</servlet-name> //Servlet的名字,不能够和其余的Servlet的名字出现重复的状况
<servlet-class>Servlet`s class</servlet-class>
//指定实现Servlet的java类
<init-param>
<param-name>ConfigLocation</param-value>
<param-value>classpath/classpath*</param-value>
//以后会涉及到Spring的配置方式
</init-param>
<load-up-startup>a number</load-up-startup>
//指定Servlet的加载顺序,默认为当Servlet第一次被请求时踩开始加载,当值为0或者大于0的时候
//表示容器在启动时便开始加载Servlet
<async-supported>Boolean值</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>Servlet`s name</servlet-name> 与上边的name务必相同
<url-pattern>/register</url-pattern> 匹配路径,包括精确匹配、目录匹配、扩展名匹配
</servlet-mapping>
2.基于注解的配置
@WebServlet(
name="wtf", //Servlet`s name
urlPatterns="/" 匹配路径,包括精确匹配、目录匹配、扩展名匹配
displayName="",
initParams="@WebInitparam(name="",value="")",相似于web.xml的init-param
loadOnStartup="0/1", 指定Servlet的加载顺序
asyncSupported="true/false" 是否支持异步处理
)
6.数据处理:HttpServletResponse接口对请求的数据进行处理
两种数据形式:表单与超连接
当用户的请求到达Servlet容器时,请求被包装成了ServletResquest对象,若是是Http请求的话,请求继续
被包装成HttpServletResquest,处理信息的方法:
1.public String getParameter(String name) 返回name所指定的参数值(value)
2.public String[] getPatarameterValues(String name) 返回name所指定的一组参数值
3.public Enumeration getParameterNames() 返回一个集合,包含着全部用户请求参数名
7.重定向和请求转发
1.重定向:重定向是指的由原请求地址从新定位到某个新地址,原有的请求失效,客户端看到的是新的请求返回的请求结果,客户端浏览器的地址栏变为新的URL;
语法:(HttpServletResponse)Resp.sendRirdect(new Url);
example:(HttpServletResponse)Resp.sendRirdect(项目名/index.jsp):从新定位到项目名下的WEB-CONTENT目录下的index.jsp文件
具体步骤为:
1.客户端在ServletA发起重定向到ServletB的请求A
2.A传递到服务器,以后又传递到客户端
3.客户端对服务器端的ServletB发起请求B
4.请求A失效
5.完成请求B,返回客户端
浏览器
重定向不只能够定向在当前应用的全部的资源,还能够定向其余站点的资源
2.请求转发:是将请求转发到其余地址,可是在转发过程当中使用的是一个请求,也能够理解为一个Servlet
在一个应用内部请求另外一个Servlet,也就说请求转发是基于同一个应用内部的,而不能把请求转发到其余应用。
语法:
使用ResquestDispatcher接口中的forward()方法,该方法能够把请求转发给另一个资源
(HttpServletResquest)req.getResquestDispatcher(new URL).forward((HttpServletResquest)req,(HttpServletResponse)resq);
注意new URL是同一应用的下的资源
具体步骤:
1.客户端在ServletA中发起请求转发到ServletB的请求A
2.在服务器内部,对ServletB进行查找,完成请求A
3.完成ServletB,返回客户端
服务器