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

  • 相关阅读:
    Photoshop 基础七 位图 矢量图 栅格化
    Photoshop 基础六 图层
    Warfare And Logistics UVALive
    Walk Through the Forest UVA
    Airport Express UVA
    Guess UVALive
    Play on Words UVA
    The Necklace UVA
    Food Delivery ZOJ
    Brackets Sequence POJ
  • 原文地址:https://www.cnblogs.com/xkxf/p/6846969.html
Copyright © 2011-2022 走看看