我是Java Enterprise和Spring的新手,但我对标准Java有很强的把握。我正在查看现有的Web应用程序项目。该项目使用Tomcat / Spring / Hibernate,我理解这是相当普遍的。它还使用DWR进行远程方法调用。我发现分离职责有点困难:Tomcat负责什么,Spring负责什么,请求如何从一个到另一个,以及Spring的主要部分如何组合在一起。我已经阅读了大量关于Spring的文档,特别是有关bean和bean工厂的文档,我还在阅读更多内容。我们欢迎您提出任何建议,但我会提供一些具体问题。
问题1:web.xml在哪里适合(什么时候使用/调用,从哪里调用)?
代码示例1:
<servlet>
<servlet-name>qrst</servlet-name>
<display-name>qrst Servlet</display-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
上面的代码片段做了什么(或者,它会导致什么事情发生)?在我的网络应用程序的某些时候,qrst.jsp被使用;是DispatcherServlet使用servlet名称调用qrst.jsp吗?那么servlet名称的意义是什么?什么是启动时的负载?
代码示例2:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/someLocation/some-servlet.xml
</param-value>
</context-param>
上述内容的链接或解释?我可以从XML文件中看到它包含bean定义,我确实了解bean是什么以及它们是如何使用的,但是我不知道任何其他有关这方面的细节,并希望如此。
代码示例3:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR</display-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>classes</param-name>
<param-value>
somepackage.someclass
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
从我读到的关于bean的内容来看,我相信那些init-param元素只是在servlet的java类中设置的参数。 servlet名称的重要性是什么,以及启动时的负载如何? Web应用程序以某种方式“知道”何时发生AJAX(dwr)调用,而不是第一次加载Web应用程序时(第一次加载时应该使用qrst.jsp)。怎么知道这个?它如何决定将请求路由到DWR而不是qrst.jsp?这是做什么的?
感谢。
答案 0 :(得分:13)
Servlet是JavaEE回答HTTP requests的习惯用语。您可以在Servlet中编写应用程序的行为,该Servlet将响应请求。
Tomcat是一个Servlet容器,这意味着您在Tomcat中部署应用程序,它将为您管理所有通信基础结构:它接受连接,管理数据库连接(*)并将调用您的servlet来处理传入的请求。 / p>
web.xml
是任何JavaEE应用程序的一部分,而不是Spring。您的代码示例1声明您的应用将使用类org.springframework.web.servlet.DispatcherServlet
的实例来处理传入的请求。
虽然servlet是JavaEE开发的基础,但建议不要创建自己的;相反,使用Spring,您可以创建MVC controllers。然后DispatcherServlet将调用这些控制器来处理请求。这只是另一个间接(但非常强大!)
是DispatcherServlet使用servlet名称调用qrst.jsp吗?
不直接。您的servlet和JSP文件具有相同的名称只是巧合。
启动时加载了什么?
您的代码示例2指示DispatcherServlet从文件/someLocation/some-servlet.xml
加载bean。如果此文件中有控制器bean ,并且根据您配置网址映射的方式,此文件中的bean将应答传入的请求。请参阅the reference。
我相信那些init-param元素只是在servlet的java类中设置的参数
web.xml中的init-param元素用于servlet类。
Web应用程序以某种方式“知道”发生AJAX(dwr)调用时与第一次加载Web应用程序时(第一次加载时应使用qrst.jsp)。怎么知道这个?
缺少问题的是<servlet-mapping>
元素(在web.xml中找到)或url映射(在spring文件中找到)。这些负责决定是否应该由调度程序servlet或dwr servlet处理URL。
例如,使用如下的servlet映射:
<servlet-mapping>
<servlet-name>qsrt</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>*.dwr</url-pattern>
</servlet-mapping>
然后,调度程序servlet将回答以.do
结尾的所有URL,而以.dwr
结尾的URL将由dwr servlet处理。这里是servlet名称的重要部分。
JSP文件是另一回事。容器将简单地使用它们来处理以* .jsp结尾的URL。不要为以*.jsp
结尾的URL创建onw servlet映射。这只会引起头痛。这可能是未指明的行为。
修改强>
但是,浏览器地址栏中的URL看起来总是一样:它总是会调用第一个servlet
然后你的servlet映射可能是如此宽泛(类似于:<url-pattern>/*</url-pattern>
),它将处理你在服务器上抛出的任何内容,并且永远不会让其他servlet处理它。
最后但并非最不重要的是,在使用DWR或任何Ajax技术时,请安装HttpFox extension for Firefox,以便监视应用程序的Ajax调用。