zoukankan      html  css  js  c++  java
  • java web(二):servlet的简单使用和介绍

    前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet。


    一:创建动态web项目

      1. 首先切换到javaEE视图。

      在ecplise左边即项目管理器哪里右键点击新建一个 Dynaimc Web  Project,输入项目名(eg:StudyServlet),Dynaimc  web module version 选择

    2.5版本【2.5使用xml文件配置servlet】,点击完成。

      在src下新建一个servlet,类名HelloWorld。

      

      

      2.打开servers(Window --> Show View --> Servers),右键单击tomcat服务器,选择 Add and Remove,把新建的web项目部署到

    服务器上。运行服务器。运行完成后打开浏览器。

      

      显示Hello world!代表一个简单的servlet编写成功。

    二:servlet

      1.什么是servlet

        servlet本身就是一种Java类,这种Java类提供了web形式的方法(JavaEE规范中),只要实现了servlet接口的类,都是一种servlet资源。

      2.如何创建servlet

        servlet有三种创建方法:

          实现servlet接口

          继承GenericServlet

          继承HttpServlet

        HttpServlet-继承-->GnericServlet-实现-->Servlet

        第一种方式:实现servlet接口

           public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /*主要实现该方法,当浏览器访问一个servlet    时,该方法被tomcat服务器调用*/

        

        第二种方式:继承GenericServlet

        

      service方法:

        我们可看出来,service还是抽象方法,并没有被重写,如果以这种方式创建servlet我们需要自己写service方法。

      init方法:

        有个带参数的init方法,该方法在启动tomcat服务器时会被调用【执行一些初始化工作】。

        

        @Override
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
            this.init();
        }
    

         该方法就两句代码,将config成员变量初始化,然后调用init()方法。去看无参的init方法发现是空实现。

      可以想想一下why?该方法会在tomcat服务器启动时执行一些初始化工作【带参数的init】,如果粗心的程序猿直接重写带参的init方法却忘记了

      将config成员变量初始化,而使用了声明却未定义的变量可能会造成意料不到的结果。所以,如果你要执行一些初始化工作,实现无参的init方法。

      

      第三种方式:继承HTTPServlet抽象类

        这种方法使我们最常用的也是最好用的。

        

        仔细看可以发现HTTPServlet并没有抽象方法,却是抽象类,why?

        回想一下抽象类和接口。当写了一个类,方法也全部实现,但是却不想别人直接使用它,可以把它声明为抽象类,让想使用

      他的人通过继承来使用。

        

        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(request, response);
        }

       声明了两个HTTPServletRequest和response变量,将servletRequest和response对象强转。然后调用另一个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);
            }
        }

      该方法就判断了浏览器的提交方式然后调用相应方法。一般我们使用doGet和doPost方法【实际上我们只重写了doGet方法】。

     三:servlet配置

      当我们写了一个servlet,如何让他与一般的java类不同,tomcat服务器如何识别他?这就需要配置文件【配置文件会在tomcat服务器启动时被解析,只要按它的约束,就能正常解析】。

    当然,直接创建servlet,ecplise会帮我们配置好。

     <servlet>
        <description></description>
        <display-name>HelloWorld</display-name>

        <!-- servlet的名字 -->
          <servlet-name>HelloWorld</servlet-name>

        <!-- servlet的限定名,包名+类名 -->
          <servlet-class>com.briup.servlet.HelloWorld</servlet-class>
      </servlet>
      <servlet-mapping>

        <!-- servlet的名字,和上同 -->
          <servlet-name>HelloWorld</servlet-name>

       <!-- url匹配 http://IP:Port/项目名 /HelloWorld  就可以访问该servlet -->
          <url-pattern>/HelloWorld</url-pattern>
      </servlet-mapping>

    四:servlet的生命周期

      servlet默认是单例,在web运行期间一个servlet类只会创建一个对象。

      servlet的生命周期可以用3个方法体现init、service、destory

                init(ServletConfig config)

      servlet初始化。调用时间取决于<load-on-startup>标签。
            <load-on-startup>标签表示当前这个servlet需要在启动tomcat服务器期间就被创建出来
            <load-on-startup>标签里面需要放一个正整数,数值的大小可以决定servlet对象被创建的先后顺序,【数值越小就越先被创建】。
            (如果有多个servlet对象需要在tomcat启动期间被创建的话)
        注意:如果值一样,也是可以创建成功的,有内部顺序,并非依次创建。

                service(ServletRequest req,ServletResponse res)

      tomcat服务器会执行该方法处理浏览器的请求。

                destory()

      当servlet需要销毁时调用servlet中的该方法。

      销毁时间:

        1.tomcat服务器【正常】关闭

        2.tomcat重新加载项目的时候

      

        

    总结:

      通过创建一个动态的web程序向浏览器发送Hello World阐述了servlet,如何创建,如何配置,生命周期,简要的介绍了一下servlet接口,GenericSerlvet、HTTPServlet类。

    接下来就要详细介绍一些方法,以及如何使用servlet做一些东西。

      

      

  • 相关阅读:
    TAdvStringGrid控件使用技巧[转]
    char, array of char, PChar
    C#操作xml文件入门
    用C#实现生成PDF文档(附源码)
    使用DDE技术,为您的应用程序增辉
    我要减肥了
    查询一个表中相同的记录
    获得Windows特殊目录
    用VB创建快捷方式(无需第三方DLL)
    为office编写插件
  • 原文地址:https://www.cnblogs.com/yangji0202/p/10441469.html
Copyright © 2011-2022 走看看