Servlet详解-什么是Servlet,Servlet基础全记录;

1. Servlet简介

  1. Servlet是JavaEE的规范之一,也就是属于一个接口,一个需要实现的接口;
  2. Servlet是Javaweb的三大组件之一,分别是Servlet程序,Filter过滤器,Listener监听器;
  3. Servlet是在服务器端运行的Java程序,并且能够接受客户端发送的请求,还能响应数据给客户端;(就是说属于服务端的代码)
  4. Servlet不是线程安全的;

2. 手动实现Servlet方法

第一步: 实现一个继承Servlet接口的类;
第二步: 实现service方法,处理请求,并响应数据;
**第三步:**到web.xml中去配置servlet程序访问的位置;(但是目前的servlet版本已经是3.0了,可以直接通过注解进行配置了,也就是不再需要去XML里面单独配置了);不过这里对简单的配置还是进行一下记录,以下是在web.xml文件中对Servlet文件进行配置的方法;
包的安放位置:
这是包的存放结构

	 <servlet>
        <!--第一个是自己设置的名字,随便设置 -->
        <servlet-name>FirstServlet</servlet-name>
        <!--这个是设置Servlet的位置,资源详细位置-->
        <servlet-class>cn.dxs.Servlet.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--这里的名字要和前面的一致-->
        <servlet-name>FirstServlet</servlet-name>
        <!--这里必须要有一条 / 否则会报异常,主要表示的是一个地址例如:http://ip:端口号/工程路径/first
        工程路径可以在Tomcat中设置;
        -->
        <url-pattern>/first</url-pattern>
    </servlet-mapping>

web.xml配置文件中,先加载<url-pattern>中的资源路径,然后找到<servlet-mapping>标签中的<servlet-name>,通过这个<servlet-name>找到 <servlet>中的<servlet-name>,最后找到 <servlet-class>中的对应位置;

如果<url-pattern>标签中的内容没有加/,在启动Tomcat的时候,就会报如下的错误;

3.Servlet的生命周期

  1. 执行Servlet的构造器方法;(只执行一次,目前一般不写)
  2. 执行init方法;(只执行一次)
  3. 执行service方法;(可以多次执行,处理客户端请求,响应客户端)
  4. 执行destroy方法; (停止Tomcat服务器时可以执行)

一般实际使用中很少直接去实现Servlet方法,创建Servlet,一般都是直接继承HttpServlet类来实现Servlet程序;

  1. 在创建servlet之后,就需要进行请求的分发,一下是HttpServlet类重写的Servlet方法(源码);
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
 		 //定义两个空的类型引用;
        HttpServletRequest request;
        HttpServletResponse response;
        try {
        //在这里对传进来的ServletRequest参数进行强制类型转换;
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException(lStrings.getString("http.non_http"));
        }
		//调用重载的另外一个service方法
        this.service(request, response);
    }
}

这个源码就是上面所说的重载了的方法; 下面做简单的记录;

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过getMethod()方法,获得表单传递时的方法名;
        String method = req.getMethod();
        long lastModified;
        //然后就是开始判断,**方法就掉用do**()方法;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
//基本逻辑就是这样;
    }

4. ServletConfig类记录

  1. Servlet和ServletConfig都是由Tomcat创建;
  2. Servlet程序默认是在第一次访问的时候创建,而ServletConfig则是在其创建的同时创建一个对应的对象;
  3. 这个类可以获得初始化参数<init-param>(前提是已经设置了这么一个标签),这是一个类似于键值对的参数;以下所有的结果都是按照上面的XML配置文件显示的;
		  <init-param>
            <!--在<servlet>标签中设置<init-param>标签,这个标签存放的是键值对;-->
            <param-name>/name</param-name>
            <param-value>/dxs</param-value>
        </init-param>

在init方法中使用读写方法
4. 这个类还可以获得程序的别名,也就是自己设置的<servlet-name>;

结果是:

  1. 这个类还可以获得ServletContext对象;
  2. 如果类继承了一个HttpServlet类,那么在这里面的doPost/doGet方法中,可以使用getServletConfig()方法获得一个ServletContext对象;但是必须要重写init()方法,才能够得到一个非空对象,按如下格式重写init()方法;

    然后在具体的方法中可以这么写:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//先获得ServletConfig对象,然后就可以通过这个对象调用相应的方法了;
        ServletConfig servletConfig = getServletConfig();
        System.out.println(servletConfig.getServletName());
    }

除此之外,还需要再XML中单独创建属于这个类自己的Severlet标签和servlet-mapping标签;如果直接注解也都可以设置,像什么initparam、name、value等;

Java杂记

1. 在web中重定向(sendRedirect)需要服务器响应两次;但是转发(forword)只是响应一次;
2. http的请求方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH;

请求的方法 基本介绍
GET 该方法传输数据长度有限制,且不安全,但是单纯的申请资源时不会对服务器产出影响,可主要用于接收数据;
POST 该方法主要可用于传输数据,传输数据无限制,且安全;
HEAD 该方法与Get类似,但是服务器要返回头部信息;
PUT 该方法简单来说就是更新一些数据;
DELETE 该方法用于删除某些资源,并且可以返回状态码,分别是200(删除,返回资源),202(将要删除数据放于待删除区),204(已经删除,无返回资源,或资源不存在)
PATCH 对部分资源进行修改

上面的方法中最常使用的,目前还是get和post;

3.在查看各种请求方法的时候,发现了所谓的名词“幂等”,意思就是发送一次和多次请求引起的边界效应是一样的,(就像是get方法中,直接从服务器获取到的数据就是一样的);post由于用于上传数据,所以可能接收到不同的的回传数据,导致它是“不幂等”的;

4. ServletContext是一个接口,一个web只有一个ServletContext对象实例,它是域对象(像Map一样存取数据,键值对),这种域对象的主要的方法有存放(setAttribute()方法),取数据(getAttribute()),移除数据(removeAttribute());
5. 通过 getServletConfig().getServletContext();创建ServletContext对象;

猜你喜欢

转载自blog.csdn.net/dxsdcyy/article/details/107470553