这是我第一次从事使用 HttpServlet 的Java项目。
因此,我知道 HttpServlet 是在Web应用程序服务器上运行的程序,并且充当Web浏览器或其他HTTP客户端发出的请求与HTTP服务器上的数据库或应用程序之间的中间层。因此,servlet扩展了我的应用服务器的能力。
我有点怀疑要了解这个servlet在我的项目中,在我发现此配置的 web.xml 文件中建立的工作原理:
<?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。
在前面的情况下,我配置一个servlet名为 edimon 由实施 Monitoraggio 类。
然后,它将servlet映射到URL或URL模式。在这种情况下, edimon* Servlet使用 **/edimon.do/ URL模式进行映射。因此,当调用与先前模式匹配的内容时,将执行edimon servlet。
然后,在实现 HttpServlet的* Monitoraggio 类中,找到了 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
您阅读的文档描述了默认情况下HttpServlet的service()方法的作用。由于您的Servlet覆盖了该service()方法并提供了不同的实现,因此不再这样做。相反,它可以执行…方法中的代码可以执行的操作。
service()
Servlet不会“加载JSP”。我看不到JSP与您发布的servlet代码有什么关系。也许gotoPage()确实告诉容器将请求转发到JSP。您应该查看该方法的文档和/或代码,以了解其作用。
gotoPage()