2.servlet

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 {

    }
}

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

时间: 2024-11-09 00:29:33

2.servlet的相关文章

Description Resource Path Location Type The superclass &quot;javax.servlet.http.HttpServlet&quot; was not foun

一段时间没亲自建新项目玩乐,今天建立了一Maven project的时候发现了以下异常,Description Resource Path Location Type The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path index.jsp /easyBuy/src/main/webapp line 1 JSP Problem 经过查找原因,原来是因为忘记设置server

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Java web之servlet

入坑必备之servlet(O(∩_∩)O哈!) 两个问题:是什么?怎么用? the first question:what?       Servlet是sun公司提供的一门用于开发动态web资源的技术,sun公司在其API中提供了一个servlet接口.由此可以理解为原生的servlet是一个接口,提到接口,我们应该想道我们必须去实现它才能被我们使用,servlet这个接口当然也不例外,从概念上讲,servlet是指sun公司提供的这个API接口,约定俗称,现在我们说的servlet是指实现这

JavaWeb之Java Servlet完全教程(转)

Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servlet必须部署在Java servlet容器才能使用.虽然很多开发者都使用Java Server Pages(JSP)和Java Server Faces(JSF)等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet.也就是说,了解Java Servle

servlet理解

一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现servlet接口. 2.把开发好的Java类部署到web服务器中. 按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet 二.Servlet的运行过程 Servlet程序是由WEB

web.xml 中的listener、filter、servlet加载及一些配置

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servlet

Servlet简介与生命周期

转载请注明原文地址: 一:Servlet是什么 Servlet是运行在Web服务器上的Java程序,作为处理来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层.JSP在web服务器上要先转换成servlet,然后才能在JVM运行,并把结果拼接成浏览器可识别的文件(如html)传回浏览器显示. 二:Servlet的应用场景 单纯地对客户端的请求做处理时,如果我们用纯JSP文件(即:只有Java语句)来处理的话,还需要先转换为servlet才能运行

Java—Servlet开发

掌握Servlet API是Java Web的基础. 首先新建一个Web类型的工程,然后再创建Servlet类.而且Servlet类名,要以Servlet作为后缀.--Servlet技术,就在Servlet类中. 然后要运行Servlet,就需要一个容器(JSP也需要),如开源的Tomcat. Tomcat的配置: 下载:

Servlet的生命周期

Servlet的生命周期是由Servlet的容器来控制的,它可以分为三个阶段:初始化.运行.销毁1.初始化阶段:(1)Servlet容器加载Servlet类,把Servlet类的.class文件中数据读到内存中:(2)然后Servlet容器创建一个ServletConfig对象.ServletConfig对象包含了Servlet的初始化配置信息:(3)Servlet容器创建一个Servlet对象:(4)Servlet容器调用Servlet对象的init方法进行初始化.2.运行阶段当Servlet

Servlet入门

1.在tomcat中新建一个day01web应用,然后在web应用中新建一个web-inf/classes目录:2.在classes目录中新建一个FirstServlet.java文件:package cn.itcastimport java.io.*;import javax.servlet.*;public class Firstservlet extends GenericServlet{ public void service(ServletRequest req, ServletRes