1.public interface Servlet
Servlet接口的基本目标是提供Servlet生命周期有关的方法:
init()
destroy()
service(ServletResquest req,ServletResponse resp):当用户对于Servlet发出请求的时候容器会调用该方法处理用户的请求,ServletResquest 提供用户访问请求数据的方法,ServletResponse提供构造Servlet响应的方法
getServletConfig()
源码如下:
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源码:
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,返回客户端