【问题标题】:What exactly do the service() method of this HttpServlet?这个 HttpServlet 的 service() 方法到底是做什么的?
【发布时间】:2015-01-23 05:08:54
【问题描述】:

这是我第一次参与使用 HttpServlet 的 Java 项目。

所以我知道 HttpServlet 是一个在 Web 应用程序服务器上运行的程序,它充当来自 Web 浏览器或其他 HTTP 客户端的请求与服务器上的数据库或应用程序之间的中间层。 HTTP 服务器。所以 servlet 扩展了我的应用服务器的权限。

我有点怀疑这个 servlet 是如何在我的项目中工作的,我发现了这个配置:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">    
<web-app>

    <display-name>My Project</display-name>

    <listener>
        <listener-class>it.sistinf.ediweb.quartz.QuartzListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>edimon</servlet-name>    
        <servlet-class>it.sistinf.ediweb.monitor.servlets.Monitoraggio</servlet-class>   
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>edimon</servlet-name>    
        <url-pattern>/edimon.do/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>/logon.jsp</welcome-file>
    </welcome-file-list>

    <taglib>
        <taglib-uri>displaytag</taglib-uri>
        <taglib-location>/WEB-INF/displaytag-11.tld</taglib-location>
    </taglib>

</web-app>

所以阅读一些文档似乎明白我必须告诉 servlet 容器(或应用程序服务器)要部署哪些 servlet,以及要将 servlet 映射到什么 URL。

在前面的例子中,我正在配置一个名为 edimon 的 servlet,由 Monitoraggio 类实现。

然后将 servlet 映射到 URL 或 URL 模式。在这种情况下,edimon servlet 映射到 /edimon.do/* URL 模式。因此,当它被调用与之前的模式匹配的东西时,就会执行 edimon servlet。

然后进入实现 HttpServletMonitoraggio 类,我找到了 service() 方法:

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        LoggerMDC.setup(req, res);
        Logger logger = (Logger) Logger.getStdLogger(Monitoraggio.class); // do not declare 'logger' as static field in order to work with MDC

        String service = req.getParameter("serv");

        char serviceId = Utility.getServizio(req.getParameter("serv"));

        if (checkSession(req, serviceId) == false) {
            gotoPage(ConfigurationFactory.getPropertiesPages().getProperty("pagina_errore_session"), req, res);
            return;
        }

        LoggerWatch loggerWatch = new LoggerWatch(Monitoraggio.class, Long.valueOf(System.getProperty(Constants.Keys.CONFIG_STATS_WARNING_THRESHOLD, String.valueOf(LoggerWatch.DEFAULT_WARNING_THRESHOLD))).longValue());
        if (logger.isTraceEnabled())
            logger.trace("lanciaServizio() | logger threshold: " + loggerWatch.getWarningThreshold());

        loggerWatch.start();
        loggerWatch.info(new StringBuffer("service() | servizio: [").append(service).append("] | service start").toString());

        String paginaDaLanciare = lanciaServizio(serviceId, req, res);
        String executionTime = loggerWatch.getInfoTime();

        //Modifica per export
        if (req.getSession().getAttribute("export") == null) {
            gotoPage(paginaDaLanciare, req, res);
        }

        loggerWatch.info(new StringBuffer("service() | servizio: [").append(service).append("] | [").append(executionTime).append("] after forward to ").append(paginaDaLanciare).toString(), true);
        loggerWatch.stop();

        req.getSession().removeAttribute("export");
        req.getSession().removeAttribute("stringaXML");
        req.getSession().removeAttribute("downbyte");

        return;
    }

阅读文档它从公共服务方法接收标准 HTTP 请求并将它们分派到此类中定义的 doXXX 方法

那么这个方法到底有什么作用呢?我不明白 servlet 如何加载 JSP

【问题讨论】:

    标签: java jsp jakarta-ee servlets


    【解决方案1】:

    您阅读的文档描述了 HttpServlet 的 service() 方法默认执行的操作。由于您的 servlet 覆盖了 service() 方法并提供了不同的实现,因此它不再这样做了。相反,它确实......方法中的代码做了什么。

    servlet 不会“加载 JSP”。我看不出 JSP 与您发布的 servlet 代码有什么关系。也许gotoPage() 确实告诉容器将请求转发给JSP。您应该查看该方法的文档和/或代码以了解它的作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2012-03-30
      • 2013-11-29
      • 2014-01-29
      • 2015-07-04
      • 2013-02-08
      相关资源
      最近更新 更多