Javaweb-在xml中配置一个Servlet以及重要接口,实现类

servlet创建

  1. 编写servlet:写一个普通类,然后去实现或者继承javaEE规范中所提供的指定接口或者父类,然后再重写指定方法.

    • 这个指定接口或者父类都在tomcat的lib目录里面的servlet-api.jar中
      • 实现Servlet接口,重写里面的五种抽象方法,主要实现service方法
      • 继承HttpServlet类,HttpServlet继承GenericServlet类重写doGet或者doPost方法
      • 继承GenericServlet抽象类,实现service方法
  2. web.xml文件中配置自己编写好的servlet

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.briup.test.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    • servlet对象的创建,以及对象中指定方法的调用,都是由tomcat服务器来处理的
    • web.xml配置文件又tomcat服务器在期间必须要读取的web项目的中的一个文件,所有要把自己写好的servlet相关信息配置到web.xml中,以便让tomcat及时的知道这些信息,然后就可以创建对象和调用方法了.
  3. 访问方式:浏览器访问指定uri:http://127.0.0.1:8989/web_test/hello

Servlet实现原理

  1. 什么是servlet:就是Servlet applet,Java EE中的组件;本质是一个java类,这种java类可以提供访问web形式的访问方法(接口规范,主要是servlet接口的service方法)

  2. Servlet的优点:

    1. 较好的移植性。Java语言具有跨平台性和可移植性强的特点,使用Servlet具有良好的移植性,无需修改代码可以部署到多种服务器平台上面。

    2. 执行效率高。Servlet针对每个请求都会创建一个线程来执行,而创建线程比创建CGI每次创建一个进程的开销要小,因此Servlet更具有响应时间短,效率高。

    3. 功能强大。可以和Web服务器进行交互。

    4. 使用方便。Servlet技术提供了多种接口和方法,处理请求和响应,以及cookie和会话跟踪技术。

    5. 可拓展性强。因为使用了Java进行编程。

  3. 按照Java EE的规范编写一个servlet

    • a、实现Servlet接口:实现接口中的五个抽象方法,最主要是实现service方法,处理请求及响应.

      • tomcat服务器main主函数入口调用service方法
    • b、继承GenericServlet类,实现service抽象方法

      • GenericServlet类中不但实现了Servlet接口中的init方法,而且还重载了一个无参的init()方法;

      • tomcat默认调用Servlet中的init方法,最终调用的是GenericServlet中的实现的init方法;

      • GenericServlet实现了ServletConfig接口,通过实现了servlet中的init方法,初始化ServletConfig接口引用;

        @Override
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
            this.init();
        }
        public void init() throws ServletException {
            // NOOP by default
        }
        
      • ServletConfig接口:规范了获取Servlet相关信息的方法(Servlet名字,初始化参数,application对象)。

    • c、继承HttpServlet:重写doXxx方法,处理对应请求方法的请求

      • HttpServlet继承了GenericServlet类;

      • HttpServlet中有两个service方法,一个是实现了Servlet中,一个是重载的;两者的参数类型不一样;

        • tomcat调用Servlet接口的service方法,其实是调用GenericServlet中的service方法,HttpServlet中的doGet方法和doPost方法都会接受请求和响应,所以两个方法都尽量必须实现,然后再根据请求行中的请求方法调用具体的方法。
        源代码中俩个service方法的实现:
        
        //实现Servlet接口中的service方法
        @Override
        public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        
            HttpServletRequest  request;
            HttpServletResponse response;
        
            try {
                request = (HttpServletRequest) req;
                response = (HttpServletResponse) res;
            } catch (ClassCastException e) {
                throw new ServletException("non-HTTP request or response");
            }
            //调用重载之后的service方法
            service(request, response);
        }
        
        //HttpServlet类中重载的service方法
        protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        
            String method = req.getMethod();
        
            if (method.equals(METHOD_GET)) {
                long lastModified = getLastModified(req);
                if (lastModified == -1) {
                    // servlet doesn't support if-modified-since, no reason
                    // to go through further expensive logic
                    doGet(req, resp);
                } else {
                    long ifModifiedSince;
                    try {
                        ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                    } catch (IllegalArgumentException iae) {
                        // Invalid date header - proceed as if none was set
                        ifModifiedSince = -1;
                    }
                    if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                        // If the servlet mod time is later, call doGet()
                        // Round down to the nearest second for a proper compare
                        // A ifModifiedSince of -1 will always be less
                        maybeSetLastModified(resp, lastModified);
                        doGet(req, resp);
                    } else {
                        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                    }
                }
        
            } else if (method.equals(METHOD_HEAD)) {
                long lastModified = getLastModified(req);
                maybeSetLastModified(resp, lastModified);
                doHead(req, resp);
        
            } else if (method.equals(METHOD_POST)) {
                doPost(req, resp);
        
            } else if (method.equals(METHOD_PUT)) {
                doPut(req, resp);
        
            } else if (method.equals(METHOD_DELETE)) {
                doDelete(req, resp);
        
            } else if (method.equals(METHOD_OPTIONS)) {
                doOptions(req,resp);
        
            } else if (method.equals(METHOD_TRACE)) {
                doTrace(req,resp);
        
            } else {
                //
                // Note that this means NO servlet supports whatever
                // method was requested, anywhere on this server.
                //
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[1];
                errArgs[0] = method;
                errMsg = MessageFormat.format(errMsg, errArgs);
        
                resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
            }
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值