Java_servlet

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,返回客户端


















服务器

相关文章
相关标签/搜索