Java_servlet

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


















posted @ 2018-05-07 18:22  laiso  阅读(189)  评论(0编辑  收藏  举报