zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记1

    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)的优点。

  • 相关阅读:
    使用mustache js模板引擎
    Application Cache API (二)
    scrollMonitor 滚动事件
    NPM中的那些库
    lodash 函数功能 boilerjs
    SeaJS 里版本号和时间戳管理的最佳实践
    开源前端框架纵横谈
    URI.js – 全能的URL操作库
    执行用户定义例程或聚合 "" 期间出现 .NET Framework 错误:
    一般ALV错误有两种情况
  • 原文地址:https://www.cnblogs.com/xkxf/p/6846969.html
Copyright © 2011-2022 走看看