Java_Servlet介绍

Servlet 介绍
  1. java提供用于生成动态web资源技术,java 服务器端的应用小程序 server + applet = servlet
  2. servlet必须实现或间接实现servlet接口(javax.servlet.Servlet)
    • 实现:implements Servlet
    • 间接实现:extends Xxxx , Xxxx implements Servlet
  3. 效果:http://localhost:8080/ms/HelloServlet ,输入的地址,tomcat将能执行一个servlet程序 (调用一个类相应的方法)

    • 为了使tomcat可以找到处理类,需要编写配置文件,给当前web项目进行配置(web.xml)

      <servlet>
          <servlet-name>xxxx
          <servlet-class>com.mszs.servelet
      
      <servlet-mapping>
          <servlet-name>xxxx
          <url-pattern>/HelloServlet</url-pattern>
      
  4. servlet继承树
    • 通用实现类(默认实现类) class GenericServlet implements Servlet
      • 通过实现类与协议无关的实现的,没有具体的功能。
    • 子类 HttpServlet, class extends GenericServlet
      • 与Http协议有关的
      • 自定义servlet继承HttpServlet,复写方法,doGet 用于处理get请求,doPost 用于处理post请求
手动
  • javac -cp “D:\java\tomcat\apache-tomcat-7.0.42\lib\servlet-api.jar” -d . HelloServlet.java
servlet生命周期
  • init(ServletConfig) ,初始化方法
    • 执行者(调用者):tomcat (servlet容器)
    • 执行次数:1次
    • 执行时机
      • 默认情况:第一次请求前(在service方法之前)
      • 服务器启动时: 配置启动时机,内容为数字,数字越小优先初始化
  • service(ServletRequest,SerlvetResponse) , 处理
    • 执行者:tomcat
    • 执行次数:每一次请求,执行一次
  • destroy() ,销毁
    • 执行者:tomcat
    • 执行次数:1次
    • 执行时机:服务器正常关闭
init方法参数ServletConfig
  • 当前servlet的配置对象,通过配置对象获得需要的配置信息
  • api
    • config.getServletName() ,获得配置的servlet名称 web.xml 名称
    • getInitParameter(java.lang.String name) 通过指定的名称获得初始化参数
      • 如果没有返回null
      • 需要在web.xml进行配置
    • getInitParameterNames() ,获得所有初始化参数的名称
    • getServletContext() ,可以通过ServletConfig对象获得ServletContext对象的引用
service方法参数:
  • ServletRequest,http协议请求封装对象
    • 接口:javax.servlet.ServletRequest
    • 子接口:javax.servlet.http.HttpServletRequest , 与http协议有关的对象
  • ServletResponse,http协议响应的封装对象
    • 接口:javax.servlet.ServletResponse
    • 子接口:javax.servlet.http.HttpServletResponse , 与http协议有关的对象
  • tomcat的实现类,实现的接口是子接口

    ServletRequest impl = new HttpServletRequestImpl()
    service(ServletRequest req,....){
        // req 运行时,是HttpServletRequest子接口的实现类
        HttpServletRequest request = (HttpServletRequest)req;
    }
    
    ## 对比
    Object obj = new ArrayList();
    demo(Object xxx){
        xxx,运行时表示ArrayList
        ** 思考:将xxx转换成List
        List list = (List)xxx;
    }
    * 结论【】
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
    
GenericServlet 实现分析
abstract class GenericServlet implments Servlet,ServletConfig{
    //实现4个方法 ,init() , destroy() ,getServletConfig    (),getServletInfo() 没用
    // 提供成员变量缓存ServletConfig
    private SerlvetConfig config;

    void init(SerlvetConfig config){
        this.config = config;
        this.init();
    }
    ServletConfig getServletConfig(){
        return this.config;
    }

    //##提供ServletConfig 对象4个api简洁操作
    SerlvetContext getServletContext(){    //提供简洁方式
        return getServletConfig().getServletContext();
    }
    String getServletName(){
        return getServletConfig().getServletName();
    }
    ...

    // 提供没有参数初始化
    public void init(){

    }


    //与协议无关,没有具体实现
    abstract service()
}

class DemoServlet extends GenericServlet{

    //必须实现service
    public void service ... {

        //使用父类的方法
        getServletConfig().getServletContext(); //获得父类缓存的ServletConfig,再获得ServletContext
        getServletContext(); //简洁方式获得ServletContext

        // 如果需要使用ServletConfig中的api可以直接使用父类提供简洁api
    }

    public void init(){
        //复写的父类的init()方法
    }

}

** 总结:
    * 如果有父子关系,使用方法时,this表示的当前运行类
        List list = new ArrayList();
    * GenericSerlvet 需要执行初始化操作时,复写init() 没有参数的
        * 如果复写生命周期的init方法,必须在方法体中添加super.init(config);
        * 如果没有添加this.getServletConfig() api都失效了,将出现空指针
HttpServlet 详解
abstract class HttpServlet extends GenericServlet{        //一个抽象类,但没有抽象方法,不允许new,只能作为父类存在。

    public void service(ServletRequest req,ServletResponse resp){
        //req 变量只能使用与协议无关的api
        //强转
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;

         //request 变量 就可以使用与协议有关的api

        service(request,response);
    }

    public void service(HttpServletRequest request,HttpServletResponse response){
        // 获得HTTP请求的请求方式:GET、POST
        String method = request.getMethod();
        if("GET".equals(method)){
            doGet(request,reposone);
        } else if("POST"...){
            doPost(request,response);
        }
    }
    // 支持get请求
    public void doGet(HttpServletRequest request,HttpServletResponse response){
        * 抛异常,发送错误状态码
        response.sendError("405","提示信息")
    }
    // 执行post请求
    public void doPost(HttpServletRequest request,HttpServletResponse response){
    }

}

class EndServlet extends HttpServlet{
    //get,复写doGet方法
    public void doGet(HttpServletRequest request,HttpServletResponse response){
        //执行
    }
    //post,复写doPost方法
    public void doPost(HttpServletRequest request,HttpServletResponse response){
        //执行
    }


}
  • 总结
    • HttpServlet根据http协议,对程序进行分流
      • get请求将执行doGet方法
      • post请求将执行doPost方法
  • get和post总结
    • post请求
      • 表单:
      • ajax: 将提交设置成post(了解)
    • get请求,默认请求
      • 表单:
      • 超链接: <a href=””
      • 图片:<img src=””
servlet路径配置
  • ….
  • 分类

ServletContext
  • ServletContext ,表示的servlet的上下文对象,别名:servlet管理者
  • 每一个web项目都对应一个ServletContext对象
    • 服务器启动时,由tomcat创建
    • 服务器关闭时,由tomcat销毁
  • 功能:(api)

    1. 获得资源

      • getRealPath(String) ,获得发布到tomcat下面的绝对路径,注意:必须/开头,表示web项目的根
        • getRealPath(“/a/1.html”) –> d:/tomcat/webapps/day08/a/1.html
      • getResourceAsStream(java.lang.String path) ,与getRealPath相同,获得的资源表示的流
      • getResourcePaths(java.lang.String path) 获得所有的内容
    2. 属性操作,Attribute,相当于是一个Map对象

      • setAttribute(name,value) ,相当于map.put(key,value) , 设置
      • getAttribute(name),相当于map.get(key) ,获得
      • removeAttribute(name),相当于map.remove(key) ,移除
      • 注意:多用户,多浏览器之间共享数据
    3. web项目的初始化参数‘
      getInitParameter(java.lang.String name) 获得初始化内容
      getInitParameterNames()  获得所有名称
      
servlet模板修改
  • 1.myeclipse安装目录/myeclipse.ini ,查看第4行 , 目的:查看Common目录位置
    • common/ ,当前目录
    • ../common ,上一级目录
    • c:/ ,指定目录
  • 2.进行common/plugins目录,查询文件com.genuitec.eclipse.wizards_*.jar
  • 3.拷贝jar文件,并修改 (注意:先备份)
    • 先将扩展名修改zip
    • zip/templates/Servlet.java ,进行修改
    • 将修改的内容,替换myeclipse jar即可,先将zip改成jar
总结
  • 总结:就是接口编程,所有的实现类都在web服务(tomcat)里,操作与实现类无关。
    • Servlet接口:javax.servlet.Servlet
      • 所有servlet实现类必须实现接口,提供init(ServletConfig) ,service(ServletRequest,ServletResponse), destroy()
    • ServletConfig接口:javax.servlet.ServletConfig
      • 每一个servlet的配置对象
      • 常用:可以获得ServletContext 引用 ,config.getServletContext()
    • ServletContext接口:javax.servlet.ServletContext
      • 每一个web项目都具有一个ServletContext对象,作为servlet上下文(管理者),可以操作所有内容
    • ServletRequest接口:javax.servlet.ServletRequest
      • 每一次请求的封装对象
      • 子接口:javax.servlet.http.HttpServletRequest ,http协议有关
    • ServletResponse接口:javax.servlet.ServletResponse
      • 每一次响应的封装对象
      • 子接口:javax.servlet.http.HttpServletResponse ,http协议有关
    • GenericServlet类,Servlet通用实现类,与协议无关
    • HttpServlet类,Http协议servlet实现,doGet、doPost与协议有关的具体方法