servlet&jsp

Servlet

   (1)servlet基础
       1)什么是servlet?

         SUN公司制定的一种用来扩展web服务器功能的组件规范。

         a.用来扩展web服务器功能
         web服务器(比如apache)只能够处理静态资源的请求,不能够处理动态资源的请求。
         注: 静态资源指的是需要事先将html文件写好,并存放到web服务器上。
         b.组件规范
             1)什么是组件?
            符合一定规范,实现部分功能,并且需要部署到相应的容器里面才能运行的软件模块。
             2)什么是容器?
            符合一定规范,提供组件的运行环境的程序。servlet是一个组件,需要部署到servlet容器里面才能运行。

       2)如何写一个servlet? (最原始写法)

          step1,创建一个java类,实现Servlet接口或者继承HttpServlet抽象类。(一般情况下都是使用继承HttpServlet抽象类的方法)

          step2,编译。

          step3,打包。

          创建一个具有如下结构的文件夹
             appname(应用名)
                WEB-INF
                    classes(放class文件)
                    lib(可选,放jar文件)
                    web.xml(描述文件 url-pattern)
           step4,部署
            将step3创建好的文件夹拷贝到容器。
            注:可以使用jar命令将step3创建好的文件夹压缩成一个以".war"为后缀的文件然后再拷贝。
          step5,访问
            启动容器之后,打开浏览器,输入 http://ip:port/appname/url-pattern

       使用myeclipse开发一个简单的servlet
            step1,启动myeclipse,集成tomcat。
            step2,创建一个web工程
            step3,编写Servlet类
            step4,修改web.xml,添加上servlet描述
            step5,部署
            step6,访问

       3)servlet是如何运行的?

          比如,在浏览器地址栏输入http://ip:port/web01/hello
          step1,浏览器依据ip,port建立连接。
          step2,浏览器将相关的数据打包(请求数据包)发送给servlet容器。
          step3,容器解析请求数据包,并且将解析之后的数据添加到request对象,同时,还会创建一个response对象。
          step4,容器创建servlet对象,并调用该对象的service方法(会将request和response对象作为参数传递过来)。
            注:可以利用request提供的方法来获得请求数据包中的数据(比如请求参数),并且可以将处理结果放到response。
          step5,容器从response获取处理结果并打包(响应数据包),然后发送给浏览器。
          step6,浏览器解析响应数据包,生成相应的页面。

             servlet
        4)http协议(了解)

        (1)什么是http协议? 
         由w3c制订的一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的数据包的结构。
        1)如何通信?
            step1,建立连接
            step2,发送请求
            step3,发送响应
            step4,关闭连接

http
        2)特点
            "一次请求,一次连接"。 即如果浏览器要发送新的请求,需要重新建立新的连接。
        3)优点
            web服务器可以利用有限的连接为尽可 能多的请求服务。
       (2)数据包的结构
        1)请求数据包
            请求行: 请求方式 请求资源路径 协议和版本 GET /favicon.ico HTTP/1.1
            消息头: 是一些键值对,一般是由w3c制订的,有特定的含义。比如浏览器可以发送  "user-agent"消息头,告诉服务器,

                       浏览器的类型和版本。

                       User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
            实体内容: 只有发送post请求时,才会有数据。 即请求参数。
        2)响应数据包
            状态行: 协议和版本 状态码 状态描述
                    200  正确
                    500  系统错误
                    404  找不到资源
            消息头:服务器也可以发送一些消息头
                        给浏览器,比如通过发送
                        "content-type"消息头告诉浏览器
                        ,服务器返回的数据类型。
            实体内容:程序的处理结果,浏览器解析
                            实体内容中的数据,生成相应的
                            页面。 
       (3)两种请求方式
        1)get请求
            a.哪一些情况下,浏览器会发送get请求?
                a1.点击链接
                a2.直接输入请求地址
                a3.表单默认提交方式
            b.特点
                b1.将请求参数添加到请求资源路径的后面,所以,只能提交少量的数据。
                b2.将请求参数显示在浏览器地址栏,不安全(比如路由器会记录包含了请求参数的地址)。
        2)post请求
            a.哪一些情况下,浏览器会发送post请求?
                设置表单的提交方式为post。
            b.特点
                b1.将请求参数添加到实体内容里面,可以提交大量的数据。
                b2.不会将请求参数显示在浏览器地址栏,相对安全。
                    注:不管什么请求方式,都不会对请求参数加密,所以,对于敏感数据,一定要加密处理。

          
   (2)servlet核心
        1)如何获得请求参数值?

        (1)String request.getParameter(String paramName);               
        注意:
            a.请求参数名称必须与实际发送的参数名称一致,如果不一致,会获得null值。
            b.该方法有可能返回""。
        (2)String[] request.getParameterValues(String paramName);
        注意:
            a.有多个参数名相同时,使用该方法。
            b.对于多选框,如果没有选择任何的选项,则获得null值。
        2)表单包含有中文参数,如何处理?

        (1)乱码问题产生的原因
        表单提交的时候,浏览器会对中文参数值进行编码,而服务器端,默认会使用iso-8859-1来解码。
        注:会使用打开该表单所有的页面时的字符集来编码。
        (2)解决方式
         step1,浏览器端,使用指定的字符集来编码。
         <meta http-equiv="content-type" content="text/html;charset=utf-8">
         step2,服务器端,使用对应的字符集来解码。
             方式一
                 request.setCharacterEncoding("utf-8");
             注:只针对post请求有效。
             方式二

                 String uname = request.getParameter("uname");
                 uname = new String(uname.getBytes("iso-8859-1"),"utf-8");   
        3)servlet输出中文,如何处理?

        (1)乱码问题产生的原因
        out.println方法在默认情况下,会使用iso-8859-1来编码。
        (2)解决方式
        response.setContentType("text/html;charset=utf-8");       
        这行代码的作用:
           作用1:设置content-type消息头的值。 
           作用2:out.println方法会使用指定的字符集来编码。
        4)容器如何处理请求资源路径?

        比如,在浏览器地址栏输入http://ip:port/web04-3/abc.html
        浏览器会将"/web04-3/abc.html"作为请求资源路径发送给容器。
        step1,容器依据"/web04-3"(应用名)找到应用所在的文件夹。
        step2,容器默认认为访问的是一个servlet,所以,容器会去查找web.xml文件,找到匹配的servlet。
        1)精确匹配
            即要求<url-pattern>/abc.html</url-pattern>
        2)通配符匹配
            即使用"*"匹配零个或者多个字符。
            比如 <url-pattern>/*</url-pattern>
        3)后缀匹配
            即使用"*."开头,后接多个字符。
            比如 <url-pattern>*.do</url-pattern> 表示匹配所有以.do结尾的请求。
        step3,如果找不到匹配的servlet,则容器会查找相应的文件。 
        5)如何将多个servlet合并成一个?

        step1,使用后缀匹配,比如
        <servlet-mapping>
            <servlet-name>ActionServlet</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
        step2,分析请求资源路径,依据分析的结果来选择相应的分支来处理。
        String request.getRequestURI();

        
        6)转发与重定向

         重定向

        (1)什么是重定向?
        服务器通知浏览器向一个新的地址发送请求。
        注: 服务器可以发送一个302状态码和一个Location消息头(包含了一个地址,即重定向地址),浏览器收到之后,会立即向
               重定向地址发送请求。
        (2)怎样重定向?
         response.sendRedirect(String url);
         注:重定向之前,容器会先清空response缓存的所有数据。
        (3)特点
         a.重定向地址是任意的。
         b.重定向之后,浏览器地址栏的地址会发生改变。

         redirect 

        转发

        (1)什么是转发?
        一个web组件将未完成的处理交给另外一个web组件继续做。
        常见的场景:
            servlet将处理结果交给jsp来展现。
        注:web组件指的是servlet或者jsp。
        (2)如何转发?
          step1,绑订数据到request
          request.setAttribute(String name,Object obj);
          step2,获得转发器。
          RequestDispatcher rd = request.getRequestDispatcher(String uri);
          step3,转发
          rd.forward(request,response);
          注:该方法有可能返回null。
                  Object request.getAttribute(String name);    
        (3)特点
         a.转发之后,浏览器地址栏的地址不变。
         b.转发的目的地必须是属于同一个应用。

        forward

        重定向与转发的区别:

        (1)能否共享request
        转发可以,重定向不行。
        注:当容器收到请求之后,会立即创建request和response,当容器发送响应之后,会立即销毁这两个对象。
        (2)浏览器地址栏地址有无变化
         转发不变,重定向会变。
        (3)目的地有无限制
         转发有限制(同一个应用),重定向不限。

        
        7)servlet的生命周期

       (1)什么是servlet的生命周期?
       容器如何创建servlet对象,如何对其进行初始化处理,如何调用该对象来处理请求,以及如何销毁该对象的整个过程。
       (2)分成哪几个阶段?
         1)实例化
             a.什么是实例化?
                 容器创建servlet对象
             b.什么时候实例化?
                 b1.容器收到请求之后。
                 b2.容器启动之后,事先创建好。
                      需要配置<load-on-startup>参数。
                 注意,容器在默认情况下,对于某个类型的servlet,只会创建一个实例。
         2)初始化
             a.什么是初始化?
                 容器调用servlet对象的init(ServletConfig config)方法。
             b.init方法只会执行一次。
             c.GenericServlet的init方法
                 将容器传递过来的ServletConfig保存下来,并且提供了一个方法(getServletConfig)来获得该对象。
                 注:可以通过override init()方法来实现自己的初始化处理逻辑。
             d.初始化参数
             step1,配置
             <init-param>
                  <param-name>company</param-name>
                  <param-value>中信证券</param-value>
              </init-param>   
              step2,读取
                  ServletConfig提供的getInitParameter方法。
         3)就绪
             a.什么是就绪
              容器调用servlet对象的service方法处理请求。
             b.HttpServlet的service方法
              依据请求类型(get/post)调用对应的doGet/doPost方法。
              注:可以通过override doGet/doPost或者override service方法来实现请求处理逻辑。
         4)销毁
             a.什么是销毁 
                 容器在删除servlet对象之前,会先调用该对象的destroy方法。
             b.该方法只会执行一次。

        (3)相关的几个类与接口
         1)Servlet接口
             a.init(ServletConfig config)
             b.service()
             c.destroy()
         2)GenericServlet抽象类
             实现了Servlet接口中的部分方法(init,destory)
         3)HttpServlet抽象类
             继承了GenericServlet,实现了service方法。

servlet_life
       

        8)servlet的线程安全问题
        9)servlet上下文(ServletContext)
    (3)状态管理
        1)什么是状态管理?

         将浏览器与web服务器之间多次交互当作一个整体来看待,并且将多次交互所涉及的数据(即状态)保存下来。
        2)Cookie

        a.什么是Cookie?
            服务器临时保存在浏览器端的少量的数据。
        b.cookie的工作原理
                浏览器访问服务器时,服务器将少量数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据保存下来;
                当浏览器再次访问服务器时,会将之前保存的数据以cookie消息头的方式发送给服务器。
        c.添加cookie
                Cookie c = new Cookie(String name,String value);   
                response.addCookie(c);    
        d.读取cookie
                Cookie[] request.getCookies();
                注:该方法有可能返回null。
                String cookie.getName();
                String cookie.getValue();

         cookie
        3)Session

        (1)什么是session?
        服务器端为维护状态而创建的一个特殊的对象(session对象)。
        (2)session的工作原理
        浏览器访问服务器时,服务器会创建session对象(有一个唯一的id,称之为sessionId),服务器会将这个sessionID以cookie的方式
        发送给浏览器。
        当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器端可以通过这个sessionId找到对应的session对象。
       (3)如何获得session对象?
        1)方式一
        HttpSession s = request.getSession(boolean flag);
            a.flag为true时:查看请求当中是否有sessionId,如果没有,则创建session对象;如果有,依据sessionId查找相应的 session对象,

            如果找到了则返回,找不到,创建一个新的session对象。
            b.flag为false时:查看请求当中是否有sessionId,如果没有,返回null;如果有,依据sessionId查找相应的session对象,

            如果找到了则返回,找不到,返回null。   
        2)方式二
        HttpSession s = request.getSession();等价于 request.getSession(true);
       (4)HttpSession提供的几个重要方法
         String getId();
         setAttribute(String name,Object obj);
         Object getAttribute(String name);
         removeAttribute(String name);
       (5)session超时
         1)什么是session超时
           服务器会将空闲时间过长的session对象删除掉。
           注:为了节省内存空间资源。
         2)服务器缺省超时限制
                 一般30分钟。
              可以修改
            <session-config>
                 <session-timeout>30</session-timeout>
            </session-config>
       注:不建议修改
        3)setMaxInactiveInterval(int seconds);修改session的缺省时间限制
     (6)删除session
        session.invalidate()

        count

session
    (4)数据库访问
        1)如何使用jdbc访问数据库?
        2)使用dao访问数据库
    (5)过滤器与监听器
        1)什么是过滤器?

        servlet规范当中定义的一种特殊的组件,用来拦截容器的调用过程。
        2)如何写一个过滤器?

        step1,实现Filter接口。
        step2,在doFilter方法里面,编写拦截
        处理逻辑。
        step3,配置(web.xml)
        3)过滤器的优先级

        如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来执行。
        4)初始化参数

        step1,配置
        <init-param>
              <param-name>illgalStr</param-name>
              <param-value>猪</param-value>
        </init-param>

        step2,读取
          String FilterConfig
          .getInitParameter(String paramName)

        过滤器的优点
        1,在不修改程序代码的基础上,增加新的功能。
        2,将多个组件相同的处理逻辑集中写在一个类里面(即过滤器),方便代码的维护。

filter
        5)什么是监听器?

        servlet规范当中定义的一种特殊的组件,用来监听容器产生的事件并进行处理。
        注:主要有两大类事件
        1)生命周期相关的事件
            容器创建或者销毁了request,session,servlet上下文产生的事件。
        2)绑订数据相关的事件
            容器调用了request,session,servlet上下文的setAttribute,removeAttribute产生的事件。
        6)如何写一个监听器?

        step1,依据要监听的事件类型选择相应的监听器接口。
          注:比如要监听session的创建和销毁,应该实现HttpSessionListener接口。
        step2,在接口方法当中,实现监听处理逻辑。
        step3,注册(web.xml配置监听器)
    (6)典型案例
         员工管理
         登录
         session验证
         验证码

原文地址:https://www.cnblogs.com/gaochaojin/p/4822684.html