首页 > 其他 > 详细

2.servlet

时间:2018-02-06 00:24:44      阅读:275      评论:0      收藏:0      [点我收藏+]
servlet:动态的web技术
    servlet介绍:
        运行在服务器端.servlet可以做html能做的一切
        作用:可以开发动态web资源(可以生成动态的内容)
        本质上就是一个类
        servlet执行流程:
            1.浏览器输入一个网址
            2.服务器接受到请求,将请求信息进行封装
            3.查找web.xml找到响应的类,调用类里面的方法
            4.类将生成的动态内容返回给服务器
            5.服务器将动态的内容进行封装,返回给浏览器
    入门案例:
        步骤:
            1.编写一个类
                a.继承HttpServlet
                b.doGet(HttpServletRequest,HttpServletResponse)
            2.编写web.xml(WEB-INF/web.xml)
                a.注册servlet
                b.绑定路径
            3.测试
                访问路径:http://localhost:8080/项目名/绑定路径
                例如: http://localhost:8080/javaee_day09/helloworld
    servlet的体系结构及常用的api:
        Servlet(接口)
            |
            |
        GenericServlet(抽象类)
            |
            |
        HttpServlet(抽象类)
        
        常用方法:
            Servlet常用api:
                void init(ServletConfig config):servlet初始化方法
                void service(ServletRequest,ServletResponse):服务方法,处理业务逻辑
                void destroy:销毁
                
                ServletConfig getServletConfig():获取当前Servlet的配置对象
            GenericServlet常用api:
                除了service方法没有实现,其他方法都实现了
                除了实现了int(ServletConfig),且重载int()
            HttpServlet常用api:
                实现了service(ServletRequest,ServletResponse)
                在方法中把两个参数强转并且调用了自己重载service(HttpServletRequest,HttpServletResponse)
                doGet(HttpServletRequest,HttpServletResponse)
                doPost(HttpServletRequest,HttpServletResponse)
    
    
    service的生命周期 :
        init(ServletConfig config)
            /*
             * init:初始化方法
             * 执行时间:默认第一次访问的时候
             * 执行次数:一次
             * 执行者:服务器
             */
        service(ServletRequest,ServletResponse)
            /*
             * service:服务方法
             * 执行时间:访问来的时候
             * 执行次数:访问一次调用一次
             * 执行者:服务器
             */
        destroy()
            /* 
             * destroy:销毁方法
             * 执行时间:当此servlet被移除的时候或者服务器正常关闭的时候
             * 执行次数:一次
             * 执行者:服务器
             */
        
        描述:
            servlet是一个单实例多线程,默认情况下第一次访问的时候,调用init方法,实现初始化操作,请求一次,创建一个线程,
            调用service方法。直到当此servlet被移除的时候或者服务器正常关闭的时候,调用destroy方法,销毁。
        
        自己编写的servlet拥有init方法,void service(ServletRequest,ServletResponse)方法,
        还有service(HttpServletRequest,HttpServletResponse)方法,
        我们重写了doget或者dopost方法。
    
    url-pattern:☆
        格式1:完全匹配        要求:必须以"/"开始  例如:/a/b/c  /life /hello
        格式2:目录匹配        要求:必须以"/"开始,以"*"结尾  例如:/a/b/*
        格式3:后缀名匹配   要求:必须以"."开始,以字符结尾  例如:.jsp  .do  .action
        
        当我们编写的servlet处理不了请求的时候,tomcat缺省的servlet会帮我们做
            访问 1.html   1234.html(返回404)
        路径的优先级:
            完全匹配>目录匹配>后缀名匹配
            
    load-on-startup:
        作用:修改servlet初始化时机
        使用:在servlet标签下使用load-on-startup标签
            值>=0:服务器启动的时候,就会执行当前servlet的init方法
            值越小,执行的优先级越高
            
    servlet模板修改:
        window --> preferences --> java --> editor -->template --> New --> 
        
        package ${enclosing_package};
        import java.io.IOException;
        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;


        public class ${primary_type_name} extends HttpServlet {
    
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                
                
            }

            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                
                
            }
        }
        
        ctrl+a删除后,输入ser,再alt+/
    
    客户端访问servlet的路径写法:
        1.绝对路径
            a.带协议的绝对路径--访问站外的资源
                例如:localhost:8080/javaee_day09/helloworld
            b.不带协议的绝对路径--最常用
                例如:/javaee_day09/helloworld
        2.相对路径
            ./    当前目录
            jquery.js  当前目录
            ../jquery.js  上一级目录
    
    跳转到servlet的方式:
        1.地址栏 url
        2.a标签 href="url"
        3.form action="url"
        4.window.open(url)
        5.location.href=url

 

ServletConfig:☆
  是当前servlet的配置对象。
  获取:
    通过servlet的getServletConfig();
  产生:
    在servlet创建的同时,创建了servletConfig,通过servlet的init(ServletConfig)将servletConfig对象传递给当前的servlet
  作用:
    获取当前servlet的初始化参数
    获取当前servlet的名称
    获取全局管理者(上下文)
  常用的方法:
    String getInitParameter("key"):获取的是指定key的值
    Enumeration getInitParameterNames():获取所有Key
      参数在servlet标签下<init-param>
        格式:
          <init-param>
            <param-name>key</param-name>
            <param-value>value</param-value>
          </init-param>
    String getServletName():获取当前servlet的名称(web.xml中的servlet-name)
    ServletContext getServletContext():获取全局管理者(上下文)

public class SConfigDemoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取servletConfig
        ServletConfig config=getServletConfig();
        
        //获取初始化参数(servlet ==> int-param ==> param-name ==> param-value)
        String url=config.getInitParameter("url");
        System.out.println(url);
        
        System.out.println("---------------");
        
        Enumeration name= config.getInitParameterNames();
        while(name.hasMoreElements()){
            String key=(String) name.nextElement();
            String value=config.getInitParameter(key);
            System.out.println(key+":"+value);
        }
        
        System.out.println("---------------");
        
        String servletName=config.getServletName();
        System.out.println(servletName);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

 

ServletContext:
全局管理者(上下文)
  获取:
    方法1:this.getServletConfig().getServletContext();
    方法2:this.getServletContext();☆
  产生:(生命周期)
    在项目一启动的时候,就会创建一个servletContext对象,就是当前项目的引用
    在项目被移除或者服务器关闭的时候,该对象销毁
  作用:
    获取全局的初始化参数
    共享数据
    获取资源
    其他操作
  常用的方法:
    String getInitParameter("key"):获取的是指定key的值
    Enumeration getInitParameterNames():获取所有Key
      参数是放在跟元素下面<context-param>
        格式:
          <context-param>
            <param-name>key</param-name>
            <param-name>value</param-value>
          </context-param>

     String getRealPath(""):获取指定文件在tomcat上的绝对路径
      例如:getRealPath("/"): D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\javaee_day09\
         InputSream getResourceAsStream("路径"):以流的形式返回一个文件

public class SContextDemoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取servletContext
        ServletContext context=getServletContext();
        
        //获取全局的初始化参数==>content-param==>param-name==>param-value
        String url=context.getInitParameter("url");
        System.out.println(url);
        System.out.println("--------------");
        
        Enumeration names=context.getInitParameterNames();
        while(names.hasMoreElements()){
            String key=(String) names.nextElement();
            String value=context.getInitParameter(key);
            System.out.println(key+":"+value);
        }
        
        System.out.println("--------------");
        
        //获取文件路径
        String path=context.getRealPath("/");
        System.out.println(path);
        
        System.out.println("--------------");
        
        String path5=context.getRealPath("/WEB-INF/classes/d/servletcontext/5.txt");
        System.out.println(path5);
        BufferedReader reader=new BufferedReader(new FileReader(path5));
        System.out.println(reader.readLine());
        
        System.out.println("-------------------");
        
        //以流的形式返回一个文件
        InputStream in=context.getResourceAsStream("/WEB-INF/classes/d/servletcontext/5.txt");
        reader=new BufferedReader(new InputStreamReader(in));
        System.out.println(reader.readLine());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

  

  域对象:
    ServletContext域对象
    相当于一个Map
  作用:
    共享数据(servlet之间通信)
  常用方法:
    xxxAttrbute();
    setAttribute(String key,Object value);存
    Object getAttribute(String key);取
    removeAttribute(String key);移除

    Enumeration getAttributeNames()

public class AttrDemoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取servletContext
        ServletContext context=getServletContext();
        //存数据
        context.setAttribute("arr",new int[]{1,2,3});
        //取数据
        int [] array=(int[]) context.getAttribute("arr");
        System.out.println(Arrays.toString(array));
        //移除
        //context.removeAttribute("arr");
         
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

案例:
统计一个servlet的访问次数

分析:
  countServlet:被统计的servlet
  showServlet:用来显示countServlet被访问的次数

CountServlet:记录次数

 

public class CountServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取servletContext
        ServletContext context=this.getServletContext();
        //首先取次数
        Integer count=(Integer) context.getAttribute("count");
        //判断次数是否为空
        if(count==null){
            count=1;
        }else{
            count++;
        }
        //将次数放入域中
        context.setAttribute("count", count);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

ShowServlet:显示次数

public class ShowServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //作用:显示访问次数
        //获取servletcontext
        ServletContext context=this.getServletContext();
        //在域中取访问次数
        Integer count=(Integer) context.getAttribute("count");
        //打印
        System.out.println("访问的次数为"+(count==null?0:count));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

路径记不住,用的时候查询

classpath的获取:
    1.通过字节码文件获取路径
        类.class.getResource("").getPath():获取的是当前字节码文件所在的目录
            获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/readfile/
        类.class.getResource("/").getPath():获取的是字节码文件的根目录
            获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/
    2.通过类加载器获取路径
        类.class.getClassLoader().getResource("").getPath():获取的是字节码文件的根目录
            获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/
        类.class.getClassLoader().getResource("/").getPath():获取的是字节码文件的根目录
            获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/
    getRealPath("/"):获取的是项目的根目录 /        
            
    案例:    
        四个文件:        开发中的目录        服务器上的路径                      获取方法
            1.txt            src                    /web-inf/classes/1.txt            3种
            2.txt            webcontent            /2.txt                          getRealPath
            3.txt            web-inf                /web-inf/3.txt                  getRealPath
            4.txt            包下                /web-inf/classes/包名/4.txt        第一种

public class ReadFileServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        /*String path1=ReadFileServlet.class.getResource("").getPath();
        String path2=ReadFileServlet.class.getResource("/").getPath();
        
        String path3=ReadFileServlet.class.getClassLoader().getResource("").getPath();
        String path4=ReadFileServlet.class.getClassLoader().getResource("/").getPath();
        
        System.out.println(path1);
        System.out.println(path2);
        System.out.println(path3);
        System.out.println(path4);
        *
        */
        
        ServletContext context=getServletContext();
        
        String path1=this.getClass().getResource("/1.txt").getPath();
        String path2=context.getRealPath("/2.txt");
        String path3=context.getRealPath("/WEB-INF/3.txt");
        String path4=this.getClass().getResource("4.txt").getPath();
        
        readFile(path1);
        
    }

    private void readFile(String path) throws IOException {
        FileReader reader=new FileReader(path);
        BufferedReader bufr=new BufferedReader(reader);
        String line=null;
        while((line=bufr.readLine())!=null){
            System.out.println(line);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

2.servlet

原文:https://www.cnblogs.com/syj1993/p/8419900.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!