Web应用体系结构
容器
Servlet没有main()方法。它们受控于另一个Java应用,这个Java应用称为容器。
Tomcat就是一个容器。如果向服务器请求一个Servlet,此时服务器会把请求交给部署该Servlet的容器,容器向Servlet提供HTTP请求和响应,且由容器调用Servlet方法,如doGet()或doPost()。
容器能作甚?
1.通信支持。容器知道自己与web服务器之间的协议,让Servlet与服务器轻松对话。我们不必再担心web服务器和我们的web代码之间的API。
2.生命周期管理。容器负责加载类、实例化和初始化Servlet、调用Servlet方法,并使Servlet能够被垃圾回收。
3.多线程支持。容器会自动为它接收的每个Servlet请求创建一个新的Java线程。
4.声明方式实现安全。利用容器,可以使用xml部署描述文件来配置和修改安全性。
5.JSP支持。容器负责把JSP代码翻译成真正的Java。
容器如何处理请求
1.用户点击一个链接,其URL指向一个Servlet而不是静态页面。
2.容器“看出来”这个请求指向一个Servlet,所以容器会创建两个对象:HttpServletResponse和HttpServletRequest。
3.容器根据请求中的URL找到正确的Servlet,为这个请求创建或分配一个线程,并把请求和响应对象传递给这个Servlet线程。
4.容器调用Servlet的service()方法(在这之前还要加载类、实例化和初始化Servlet)。根据请求的不同类型,service()方法会调用doGet()或doPost()方法。此处假设调用的doGet()。
5.doGet()方法生成动态页面,并把页面填入响应对象。
6.线程结束,容器把响应对象转换为一个HTTP响应,把他发给客户,然后删除请求和响应对象。
映射
Servlet的三个名字
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.shangxiaoying.ListenerTesterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
说明:
<servlet-name>
元素用于把一个<servlet>
元素绑定到一个特定的<servlet-mapping>
元素。这个名只在这个部署文件中使用。
<servlet-class>
元素内放完全限定类名(但是不要加.class扩展名)。
<url-pattern>
元素内是用户看到并使用的Servlet名,这是虚构的,并不是具体Servlet类的名字。
当请求到来时,容器会根据<servlet-mapping>
里的<url-pattern>
找到与请求的URL对应的<servlet-mapping>
元素,然后根据<servlet-mapping>
里的<servlet-name>
元素找到对应的<servlet>
,然后根据<servlet>
里的<servlet-class>
找到具体的Servlet类。
MVC
MVC的关键是业务逻辑与表示分离,而且要在二者之间放上别的东西,这样业务逻辑本身就能作为一个可重用的Java类存在,它根本不用对视图有任何了解。
MVC就是把业务逻辑从Servlet中抽出来放在一个“模型”中,
模型(Model)就是可重用的普通Java类,是业务数据和处理该数据的方法的组合。系统中只有这部分与数据库通信。
视图(View)负责表示,从控制器获取模型状态,还要获得用户输入,并交给控制器。
控制器(Controller),从请求获得用户输入,并明确这些输入对模型有什么影响;告诉模型自行更新,并让视图得到新的模型状态。