• 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验证
             验证码

  • 相关阅读:
    Java动态代理设计模式
    AOP的相关概念
    如何解决表单提交的中文乱码问题
    怎么防止重复提交
    http的响应码200,404,302,500表示的含义分别是?
    JSP三大指令是什么?
    说一下 session 的工作原理?
    session 和 cookie 有什么区别?
    说一下 JSP 的 4 种作用域?
    jsp有哪些内置对象?作用分别是什么?
  • 原文地址:https://www.cnblogs.com/gaochaojin/p/4822684.html
Copyright © 2020-2023  润新知