博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.servlet
阅读量:5129 次
发布时间:2019-06-13

本文共 13191 字,大约阅读时间需要 43 分钟。

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)            servlet的生命周期 :        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 {    }}

 

转载于:https://www.cnblogs.com/syj1993/p/8419900.html

你可能感兴趣的文章
pair的例子
查看>>
前端框架性能对比
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
同步代码时忽略maven项目 target目录
查看>>
Oracle中包的创建
查看>>
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>