容器 web Container
- 实例化(instantiate)servlet,开新线程,处理到来的request
- 调用 servlet 的
doPost()
,doGet()
方法 - 得到servlet的request/response
- 管理servlet的生死和相关资源
本章讨论
- 应用在容器中的运行方式
- Model View Controller(MVC) 设计模式
Web Application 的目录包含
- static content
- JSP pages
- servlet classes
- the deployment descriptor(就是记录URL, servlet, class之间mapping关系的xml)
- tag libraries
- JAR files
- Java class files
request: Client->web server app->web Container app->servlet
response: Client<-web server app<-web Container app<-servlet
不必用J2SE徒手写程序。可以把容器视作web app的服务器端的支持。
Container 带来的功能:
- Communications support
- Lifecycle Management
- Multithreading Support
- Declarative Security
- JSP Support
容器让开发者将重心放在业务逻辑而不是底层的线程、安全和网络问题。
容器如何处理一个request
- 用户点击指向servlet的 URL
- 容器”发现“这个请求是给servlet的,于是创建两个对象
HttpServletResponse
,HttpServletRequest
- 容器根据请求中的URL查找正确的servlet,为该请求创建或分配线程,并将请求和响应对象传递给servlet线程。
- 容器调用servlet的service()方法。 根据请求的类型,service()方法调用doGet()或doPost()方法。以GET为例。
- doGet()方法生成动态页面并将页面填充到响应对象(response object)中。记住,容器仍然有对响应对象的引用。
- 线程完成后,容器将响应对象转换为HTTP响应,将其发送回客户端,然后删除请求和响应对象。
servlet
的三个名字
- Client-known URL name
- Deployer-known secret internal name
- Actual file name
Mapping servlet names 的好处在于题高 flexibility 和 security.
- 目录有改动时,重新mapping即可,不必改变客户端代码
- 不让别人知道server的真实目录,否则用户可以不经过正确的网页进行浏览,通过输入真是路径,直接在服务器文件目录中导航。
用 Deployment Descriptor (DD) 把 URLs 映射到 servlets。
<servlet>
: internal name → a fully-qualified class name<servlet-mapping>
: internal name → public name
<web-app>
</web-app>
注:这里仍然没有提到 servlet 的真实路径。实际上,Container有一套复杂的规则来匹配 URL 和 Java class 在服务器上的位置,那是后话了。
此外 DD 还能定义 web app 的其他方面,包含但不限于
- security roles
- error pages
- tag libraries
- initial cofiguration information
- J2EE server
总之,DD 提供了一种声明式的机制,
- 最大限度地减少触碰已经通过测试的代码,
- 使得不改源码就能 customize 你的 app,
- 不用重新编译就以适配不同的资源(比如数据库),
- 更容易地维护动态安全信息,如访问控制列表和安全角色,
- “这意味着即使是那些不是Java程序员的人也可以自定义您的Java Web应用程序,而不必将您从热带假期拖回来”。
Model-View-Controller (MVC)
业务逻辑不仅与分开,甚至都不知道有 presentation。业务逻辑作为可重用的 Java class 独立存在,且与视图毫不相干。业务逻辑不能写在servlet中。
不局限于Servlet& JSP,业务逻辑和表示的清晰分离在任何其他类型的应用程序中都是有效的。
需求总时在变化,不能假设前端只用JSP,如果切换到 Swing GUI 呢?故,MVC是必要的。
View | Controller | Model |
---|---|---|
JSP | Servlet | DB |
负责表示 | 从请求中获取用户输入,并找出它对模型的意义 | 保存真实的业务逻辑和状态 |
思考:如何解决每一个业务逻辑配一套M-V-C,造成的servlet代码重复的问题。
J2EE 应用服务器 与 Tomcat 的区别
J2EE Application Server
=Web Container
+EJB Container
.Tomcat
is aweb Container
, not a full J2EE application server, becauseTomcat
dose not have anEJB Container
.- A J2EE 1.4 Server includes the Servlet spec 2.4, JSP spec 2.0, and EJB spec 2.1.