1、把Java放到HTML中,JSP应运而生。

2、Servlet本身并没有main()方法,所以必须要有其他Java程序去调用它,这个Java程序就是Web容器(Container)。Tomcat就是一个容器。

3、容器能提供什么?

  • 通信支持 -不用再写ServerSocket了
  • 生命周期管理 -容器控制着Servlet的生与死
  • 多线程支持 -容器会自动地为它接收的每一个Servlet请求创建一个新的Java线程
  • 声明方式实现安全
  • JSP支持 -容器负责把JSP代码翻译成Java

4、容器如何处理请求?

Ⅰ、用户发出一个指向Servlet的请求。

Ⅱ、容器“看出”这个请求指向Servlet,于是创建两个对象HttpServletRequest、HttpServletResponse。

Ⅲ、容器找到这个Servlet,为其创建或者分配一个线程,并传入上述两个对象。

Ⅳ、容器调用Servlet的service()方法。

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if(method.equals("GET")) {
lastModified = this.getLastModified(req);
if(lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
} if(ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if(method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if(method.equals("POST")) {
this.doPost(req, resp);
} else if(method.equals("PUT")) {
this.doPut(req, resp);
} else if(method.equals("DELETE")) {
this.doDelete(req, resp);
} else if(method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if(method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
} }

Ⅵ、根据请求的不同,service()会调用不同的方法,假设请求对应doGet()方法:

import javax.servlet.http.*;
import java.io.*;
import java.util.Date; public class Ch1Servlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
Date today = new Date();
out.println("<html>" +
"<body>" +
"<h1 align=center>Hello Servlet</h1>"
+ "</br>" + today + "</body>" + "</html>"
);
}
}

Ⅶ、doGet()方法生成动态页面,并把它写入response里。

Ⅷ、线程结束,容器把response对象转换为一个HTTP响应,然后清理不再用的对象。

5、容器是如何找到Servlet的?

    <servlet>
<servlet-name>Chapter1 Servlet</servlet-name>
<servlet-class>Ch1Servlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>Chapter1 Servlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

作为程序员,我们做且仅做的一件相关的事情就是编写web.xml(DD)。可以看到,一个servlet具有三个名字:文件路径名(相对于classes文件夹);部署名(秘密的内部名,即servlet-name);面向客户的URL名。为什么要建立这样的名字映射呢?主要是出于提高Web应用的灵活性和安全性。

6、使用部署描述文件(DD,deployment descriptor)的优点。

最新文章

  1. Android开发学习—— 消息队列
  2. 使用TortoiseGit 来进行日常操作
  3. [No000064]python 变量命名规范
  4. swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)
  5. linux命令:ln
  6. ADO.net 扩展属性
  7. 高效的网络流dinic算法模版
  8. android studio 安装总结
  9. java 知识 链接
  10. ASP.Net零碎
  11. MVC3/4/5/6 布局页及Razor语法及Route路由配置
  12. php数组根据某一个键值,把相同键值的合并生成一个新的二维数组
  13. OpenCV——PS 滤镜, 浮雕效果
  14. Linux 系统从入门到精通的学习大纲;
  15. HDFS架构及原理
  16. 点击iframe窗口里的超链接,打开新页面的方式
  17. c#中委托和事件区别
  18. 背水一战 Windows 10 (72) - 控件(控件基类): UIElement - UIElement 的位置, UIElement 的布局, UIElement 的其他特性
  19. Linux之Ubuntu与Windows更改默认启动顺序[转载]
  20. C#防止WebBrowser在新窗口中打开链接页面

热门文章

  1. 一步一步安装Git控件版本工具
  2. Vimium、CrxMouse配置信息
  3. CSV转PDF(C++)
  4. php 使用curl 进行简单模拟提交表单
  5. Using Notepad++ To Quickly Format XML
  6. Win8 IIS 安装和部署网站问题
  7. 红黑树C++实现
  8. &lt;pre&gt;标签让&lt;textarea&gt;标签的内容原样输出
  9. 搭建SVN和eclipse添加svn插件
  10. salt常用命令、模块、执行