jsp基础复习

1.项目在Tomcat的配置:在tomcat的conf文件夹下的server.xml中加入如下代码:
   jsp基础复习_第1张图片 
2.http请求方法
    <1>GET方法用于获取由Request-URI所标识的资源信息,常见形式是:-GET Request-URI HTTP/1.1 ,通过在浏览器地址中直接输入网址的方式访问网页的时候,浏览器采用
           GET方法向服务器获取资源。
    <2>POST方法用于向服务器发送清求时,要求服务器接受附加在请求后面的数据。POST方法常用于表单提交。
           POST: /login.jsp HTTP/1.1 (CRLF)
           Accep:image/gif(CRLF)(.....)
           Host:www.sample.com(CRLF)(......)
           .....
            Cache-Control:no=cache(CRLF)
           (CRLF)
            username=hello&password=12345
3.jsp详细内容:嵌入代码的html页面 JSP(java server pages)
   <1>所有程序操作都在服务器执行,网络上传送给客户端的仅是得到的结果,这样大降低了对客户浏览器的要求,即使客户浏览器不支持java,也可以访问jsp页面。 
   <2>JSP执行过程:如图所示:
          jsp基础复习_第2张图片
         jsp基础复习_第3张图片
 <3>jsp最终都会转换成Servlet去执行
 <4>jsp语法概述:
      a.jsp原始代码中包含了JSP元素和Template (模板) data两部分
         a_1:Template Data:JSP引擎不处理的部分,即标记<%%>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端浏览器
         a_2:JSP元素是指将由JSP引擎直接处理的部分,这一部分必须符合JAVA语法,否则将会导致编译错误。 
         jsp基础复习_第4张图片
      b.JSP语法分为三种不同的类型:
         b_1:编译器指令(DIRECTIVE):例如<%@ page import="java.io.*" %>
                   ----包括:”包含指令“ ”页指令“ ”taglib指令“
                   ----编译器指令包含在”<@%...%>“卷标里
                   ----两个主要的指令:Page  include 
                                       --- include:包含指令<%@ include file="文件的相对路径//绝对路径" %>,包含静态页面
                                       --- page指令:<%@ page import="" pageEncoding=""%>作用于整个JSP页面,同样包括静态的包含文件,不能作用于动态的包含文件,如"
                                                                  <jsp:include>"
                                                                  可以在一个页面上用多个”<%@page %>“指令,但是其中的属性只能用一次,不过也有例外,那就是import属性,类比于java中的
                                                                  import语句
                                                                 <%@page%>指令可以放于JSP页面的任何地方,但是为了JSP的可读性,通常放于JSP页面的顶部。
                                      --- taglib指令:用于定制标签库<%@ taglib  uri="" prefix="" %>
                                      --- <jsp:forward>指令:用于转向页面,在该指令后面的所有代码都没有机会执行,因为页面的流程已经转向新的页面。下图打印不会执行
        jsp基础复习_第5张图片jsp基础复习_第6张图片
                                    --- <jsp:include>指令:包含一个静态或动态文件,可以向被包含的jsp文件发送参数,而<%@ include ..%>不能向包含页面传送参数。
                                   

         b_2:脚本语法(SCRIPTING):
              b_2_1:主要包括以下内容:
             ----”HTML注释“:<!--comments-->  发送到客户端同时也显示,如果其中嵌入jsp脚本,其中的脚本仍然会执行。
             ----"隐藏注释":<%--comments--%>这种注释发送到客户端但是不显示
             ----"声明"<%! declaration;[declaration;]......%>,jsp转换成Servlet后,如果代码没有进行修改,Servlet是单例的,只在内存中加载一次。声明中声明的变量,转化成
                      Servlet的
成员变量,每个用户每次访问的都是同一个成员变量,脚本段中定义的变量,转换成方法的局部变量,每个用户每次访问JSP页面都会新生成新的变量。
     jsp基础复习_第7张图片   jsp基础复习_第8张图片jsp基础复习_第9张图片
             ----”表达式“:后面不需要加分号,用于在页面上输出信息,语法格式:<%=expression%>
             ----”脚本段“:里面任何合法的java代码,<%%>
         b_3:动作语法(ACTION):<jsp:forward><jsp:getProperty><jsp:include>
      c.***JSP内置对象:
          request(请求对象);response(响应对象);pageContext(页面上下文对象);
          session(会话对象);application(应用程序对象);out(输出对象);
          config(配置对象);page(页面对象);exception(异常对象)
          jsp基础复习_第10张图片
 
         c_1:out对象:out.print().out.println()----源代码换行   <br>----页面换行,代表了向客户端发送数据的对象,与response对象不同,通过out对象发送的内容是浏览器要显示
                                   的内容,是文本一级的,可以通过out对象直接向客户端写一个由程序动态生成的html文件,常用的方法除了print和println()之外,还包括
                                  clear(),clearbuffer(),flush(),getBufferSize()和getRemaining(),这是因为out对象内部包含了一个缓存区,需要一些对缓存区进行操作的方法。
         c_2:request对象:代表来自客户端的请求,例如在表单中提交的信息,是最常用的对象。方法中使用较多的是
                                          getParameter(),getParameterNames(),getParameterValues(),通过这几个方法来获取请求对象中所包含的参数值。
                                          其中getParameter()是getParameterValues()的特例,表示请求参数值只有一个,如果请求的参数值有多个,则使用getParameterValues(),在多选框中
                                          需要使用getParameterValues()。
                                          ---getAttribute(String name):以对象的形式返回特定名称的属性值。如果所给的名称的属性不存在将返回空值 。
                                          ---getParameter(String name)和getAttribute(String name)区别:getParameter()是服务器端获取用户请求发送过来的参数,是客户端和服务器端的
                                              交互getAttribute()获取的是服务器端已经设置过的信息,与服务器的setAttribute()方法相对应,getAttribute()方法是服务器内部执行的,对客户是不公
                                              开的。
                                          ---request对象内数据的存活范围就是在request对象的存活范围内,当客户端向服务端发送一个请求,服务端向客户端返回一个响应后,该请求对象
                                              就被销毁了;之后再向服务端发送新的请求进,服务器会创建新的request对象,该对象与之前的request对象没有任何关系,因此也无法获得在之前
                                              request对象中存放的任何数据。
         c_3:response对象:代表对客户端的一个响应,也就是说可以通过"response"对象来组织发送到客户端的数据,但是由于组织的方式比较底层,不建议使用,需要向客户
                                               端发送文字时直接使用"out"对象。通常用于文件下载。与服务器连接是一个TCP/IP的过程。
                                          ---sendRedirect(String fileName):该方法用于重定向,如果参数fileName中加“/",则是相对于Servlet容器的根路径(http://localhost:8080)寻找资源,不加
                                              "/"则是相对于当前访问uri寻找路径.重定向会服务器发送两个请求,第一个请求为用户提交表单的请求,第二次请求是sendRedirect所带参数指定
                                               的资源。
                                     jsp基础复习_第11张图片两次请求
                                             
                                          ---requestDispatcher的forward(request,response)称之为请求转发,从始到终均为一个请求。
                                              jsp基础复习_第12张图片
                                           ---RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispathcer()方法得到的,是属于请求对象的方法。
                                           ---sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束,服务器开
                                               始向客户端返回执行的结果。
                                          
         c_4:pageContext对象:页面上下文对象,代表当前页面运行的一些属性,常用的方法findAttribute(),getAttribute(),getAttributesScope(),getAttributeNamesInScope(),该内
                                               置对象,在项目所面临的情况比较复杂时,会用到页面属性辅助处理,一般Servlet容器会使用该对象。
         c_5:session对象:代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用。
                         ----使用session的原因:首先HTTP是基于请求-响应模式的无状态协议,它不会保存用户访问的任何相关信息,Web Server对每个客户端请求也都没有历史记忆
                                ,因此采用Session来保存客户端的状态信息。
                         ----session对象内数据的存活范围也就是session对象的存活范围(只要浏览器不关闭,session对象就会一直存在),因此在同一个浏览器窗口中,无论向服务器
                               发送多少个请求,session对象只有一个。
                         -----登录后通常会使用session,用于存放用户的相关信息。
         c_6:config对象:提供一些配置信息,常用的方法有getInitParameter()和getInitParameterNames(),以获得servlet初始化的参数,通常用于Servlet中,在jsp中使用很少。
         c_7:page对象:正在运行的jsp文件所产生的类对象,不建议使用
         c_8:exception对象:代表了jsp文件运行时产生的异常对象,此对象不能在jsp文件中直接使用,而只能在使用了”<%@ page isErrorPage="true"%>“的jsp文件中使用。
         c_9:application对象:ServletContext类的一个实现对象。存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在,在整个服务器运行过程中
                                                application对象只有唯一的一个,会被所有的访问用户共享。getRealPath(String filename)--返回文件对应服务器上的真实路径。
         小结:request,session及application对象的范围是逐个增加的,request只在一个请求范围内;session是在浏览器窗口的范围内;application则是在整个服务器运行的过
                     程中。
 <4>表单的验证:客户端验证---------服务端验证
 <5>JavaBean:可以重复使用,跨平台的组件(有图形界面,无图形界面)
       a.MVC设计模式(Model,View,Controller)
           Model---模型完成实际处理的组件
           View---视图
           Controller-控制器
           jsp基础复习_第13张图片
    b.声明JavaBean:<jsp:useBean id="myBean" class="com.it.bean.MyBean" scope="session" />,如果Bean已经在别的“<jsp:useBean>”标记中创建,则当使用这个已经创建
       过的Bean时,id的值必须与原来的那个id值一致,否则意味着创建同一个类的两个对象。
       获取JavaBean的属性值:<jsp:getProperty property="" name=""/>
       设置JavaBean的属性值:<jsp:setProperty property="" name="" value=""/>  param与value属性不能共存
    c.JavaBean的范围:scope属性决定了JavaBean对象存在的范围,scope的可选值:page,request,session.application
      c_1:page范围:客户每次请求访问JSP页面时,都会创建一个JavaBean对象,JavaBean对象的有效范围是客户请求访问的当前JSP网页。
                                   JavaBean对象在以下两种情况下都会结束生命周期:
                                   客户请求访问的当前JSP网页通过<forward>标记请求转发到另一个文件
                                   客户请求访问的当前JSP页面并向客户端发回响应。
      c_2:request范围:客户每次请求访问JSP页面时,都会创建一个JavaBean对象,有效范围
                                    客户请求访问的当前JSP网页
                                    和当前jsp网页共享同一个客户请求的网页,即当前网页中<%@ include%>指令,以及<forward>标记包含的其他JSP文件
                                    当所有共享同一个客户请求JSP页面执行完毕并向客户端发回响应时,生命周期结束。
      
      c_3:session范围:Java对象被创建后,存在于整个Session的生命周期内,同一个Session中的JSP文件共享JavaBean对象
              
      c_4:application范围:存在于整个web应用的生命周期,web应用的所有jsp文件都能共享同一个生命周期。
 
 
 <6>Servlet详细概述:
    a.定义:java servlet是和平台无关的服务端组件,它运行在Servlet容器中,Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户通信采用请求响应
    b.功能:
                   创建并返回基于客户请求的动态HTML页面,
                   创建可嵌入到现有HTML页面中的部分HTML页面(HTML页面片断),
                   与其他服务器资源(如数据库或基于Java的应用程序)进行通信;
     c.框架:由两个java包组成
                    javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类;
                    javax.servlet.http包:定义了采用Http协议通信的HttpServlet类
              核心:javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。
     d.Servlet源码解析:
       每个Servlet必须要实现Servlet接口,GenericServlet是个通用的,不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于GenericServlet,因此HttpServlet也
       实现了Servlet接口,所以自定义的Servlet只需集成HttpServlet父类。
       Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现,实现方式是将ServletRequest与ServletResponse转换为HttpServletRequest与
       HttpServletResponse,转换完毕后,会调用HttpServlet自定义的service方法,在该service方法中,首先得到请求的方法名,然后根据方法名调用对应的doXXX方法,请求
       为GET,就去调用doGet方法,请求方法为POST,就去调用doPost方法。在HttpServlet类中提供的doGet,doPost等方法直接返回错误信息,所以我们需要在自己定义的
      Servlet中重写这些方法。request----org.apache.catiliana.connector.RequestFacade(Tomcat中的类)
       jsp基础复习_第14张图片jsp基础复习_第15张图片
jsp基础复习_第16张图片
    jsp基础复习_第17张图片
 e.生命周期:init(负责初始化Servlet对象)----service(负责响应客户请求)---destroy(当Servlet对象退出生命周期时,负责释放占用资源)
    jsp基础复习_第18张图片
   e_1:初始化分为两步:装载------------>初始化
       e_1_1:装载在下列情况下Servlet容器会装载Servlet:
                   (1)Servlet容器启动时自动装载某些Servlet在web.xml的<Servlet>标签下,添加<load-on-startup>8</load-on-startup>元素,数字代表启动顺序
                   (2)在Servlet容器启动后,客户首次向Servlet发出请求
                   (3)Servlet类文件被更新后,重新装载Servlet
       e_1_2:  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在Servlet的整个生命周期中,init方法只会调用一次       
  e_2:响应客户请求阶段:对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的Service方法
                                               Service方法从ServletRequest对象中获取用户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应结果。
      e_2_1: ServletRequet接口:封装了客户请求信息,如客户请求方式,参数名和参数值,客户端正在使用的协议,以及发出的请求的远程主机信息等,ServletRequest接口
                                                         还为Servlet提供了直接以二进制方式读取请求数据流的ServletInputStream(文件上传) 其子类可以为Servlet提供更多的和特定协议相关的数据,
                                                         如HttpServletRequest提供的读取Http Head信息的方法。主要方法如下
                jsp基础复习_第19张图片
               对于Tomcat6.0.29来说,它会将客户端传过来的参数放在一个HashTable中,该HashTable的定义如下:
                
               对于Tomcat6.0以上版本,会交客户端传过来的参数放在一个HashMapp中,该HashMap定义如下:
                 下图从上到下依次取于Tomcat6.0.35和Tomcat7.0源码:这是一个String ArrayList<String>的健值对
               
                   
    e_2_2:ServletResponse接口:为Servlet提供了返回响应结果的方法,它允许Servlet设置返回数据长度和MIME类型,并且提供输出流ServletOutputStream(文件下载),
              jsp基础复习_第20张图片
 e_3:终止阶段:
           当Web应用被终止时,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servelt容器会首先调用Servlet的destroy方法,在destroy方法中,可以释放
           Servlet所占用的资源。
 e_4:Servlet的多线程处理:Servlet/JSP是以多线程模式执行。
         Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例的成员变量,如果对成员变量进行写入操作,就会导致Servlet的多线程问
         题,即数据不一致。
         jsp基础复习_第21张图片jsp基础复习_第22张图片
             解决Servlet同步问题的方法
                  (1)去除实例变量,使用局部变量
                  (2)使用同步代码块synchronized{}
 
e_5:cookie:用户访问web服务器时,服务器在用户硬盘上存放的信息,服务器可以根据cookie来跟踪用户,一个cookie包含一个key/value
         设置cookie:Cookie cookie=new Cookie(name,value)----response.addCookie(cookie);
         获取cookie:Cookie[] cookies=request.getCookies(),然后借助于循环获取。
e_6:Session详解:
          e_6_1:服务器跟踪客户状态通常有四种方法
                        1)建立含有跟踪数据的隐藏字段
                        2)建立包含额外参数的URL
                        3)使用持续的Cookie
                        4)使用ServletAPI的Session(会话机制)
           e_6-2概念:用于跟踪客户的状态,是在一段时间内,单个客户与web服务器的一连串相关的交互过程。在一个session中,客户可能会请求访问多次同一个网页,也有可
                              能请求访问服务器的其他资源。
           e_6_3运行机制:
                         1)当一个session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态信息。
                         2)Servlet容器为HttpSession分配一个唯一的标志符,称为SessionID,Servlet容器把SessionID作为Cookie保存在客户浏览器中。
                         3)每次客户发出http请求时,Servlet容器可以从HttpServletRequest对象中获取SessionID,然后根据SessionID找到对应的HttpSession对象,从而获取客户的
                               状态信息。 
                           jsp基础复习_第23张图片
      e_6_4:生命周期:
                   1) 当客户第一次访问web应用中支持Session的某个网页时,就会开始一个新的session
                   2)接下来当客户访问这个web应用的不同网页时,始终处于同一个session中
                   3)JSP网页默认都是支持session的,也可以通过显式声明<%@ page session="true"%>
                   4)在以下情况下session会结束生命周期,Servlet容器会释放session所占用的资源
                           a.客户端关闭浏览器(严格来讲这并不能结束session,可以通过调用javascrip中window.onclose监视浏览器的关闭动作,向服务端发送请求删除session);
                           b.Session过期
                           c.服务端调用了session.invalidate()方法
                    5)session过期是指当session开始后,在一段时间内客户没有和web服务器交互,这个session就会失效,HttpSession地setMaxInactiveInterval()方法可以设置
                         session保持不活动的时间,如果超过这一时间session就会失效。
 e_7:过滤器(Filter):可以对servlet容器的请求和响应进行检查和修改,filter本身不生成请求和响应对象,只提供过滤作用
             
e_7_1:作用:
                         a.在servlet被调用之前检查request对象,修改RequestHeader和Request的内容
                         b.在servlet被调用之后检查response对象,修改ResponseHeader和Response的内容
             e_7_2: 过滤过程:
                         jsp基础复习_第24张图片
             e_7_3:结构--所有的filter必须实现javax.servlet.Filter接口,这个接口包含三个必须实现的方法:init() doFilter(),destroy()
                          init(FilterConfig):Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法,在此方法中可以读取web.xml文件中的过滤器参数
                          doFilter(ServletRequest,ServletResponse,FilterChain):完成实际的过滤操作,当客户请求访问与过滤器关联的URL时,Servlet容器会先调用过滤器的
                                             doFilter方法,FilterChain用于访问后续过滤器
                           destroy:Servlet容器在撤销过滤器实例前调用该方法,同时释放过滤器所占用的资源。
             e_7_4:过滤器的执行流程:
                         jsp基础复习_第25张图片
            e_7_5:串联Servlet过滤器的工作流程:
                        jsp基础复习_第26张图片
e_8:监听器(Listener):web.xml文件中要进行配置
           e_8_1:定义--Listener是Serlvet的监听器,它可以监听客户端的请求,服务端的操作等,通过监听器,可以自动激发一些操作
           e_8_2:常用的监听器接口:
                        a.ServletContextAttributeListener:监听ServletContex属性的操作
                        b.ServletContextListener:监听ServletContext
                        c.HttpSessionListener:监听HttpSession操作,
                             当创建一个Session时,激发session created(HttpSessionEvent)方法,
                             当销毁一个session时,激发sessionDestroyed(HttpSessionEvent)方法
                        d.HttpSessionAttributeListener
            
 
 e_9:小结:
             e_9_1,某些Servlet在web.xml文件中只有<Servlet>元素而没有<Servlet-mapping>元素,这样就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在
                        <Servlet> 中配置一个<load-on-starup>子元素,让容器在启动的时候自动载Servlet,并且调用其init方法完成一些全局性的初始化工作。
             e_9_2:当Servlet容器启动web应用时,为每个web应用创建一个ServletContext对象,可以把ServletContext对象当作服务器组件的共享内存,在ServletContext中
                          可以存放共享数据,它提供了读取或设置共享数据的方法。setAttibute() getAttribute()
             e_9_3:比较Servlet和Jsp:
                          相同之处:可以生成动态网页
                          不同之处:JSP的优点擅长网页制作,生成动态网页,比较直观。其缺点是不容易跟踪与排错
                                              Servlet是纯粹的java语言,擅长于处理流程和业务逻辑,其缺点是生成动态网页不直观
 <7>EL表达式:expression lanuage---->用于jsp语言中,消除jsp页面中的java代码
        a.默认对象:
                     pageContext :使用较少
                     pageScope:Map,包含页面范围内的属性和值 
                     requestScope:Map 包含reques范围内的属性和值 
                     sessionScope:Map 包含session范围内的属性和值 
                     applicationScope:Map包含application范围内的属性和值 
                     param:request.getParameter()
                     paramValues:包含请求参数及他们的属性值数组
                     header:
                     headerValues:
                     cookie:
       b.EL变量:EL存取变量如果没有指定范围,它的默认值会从Page范围找,假如找不到,再依序从Request,Session,Application范围寻找,如果中间找到相应变量返回。
<8>客户化JSP标签:
      a.创建客户化标签的步骤:
           1)创建标签的处理类
           2)创建标签库的描述文件
           3)在JSP文件中引入标签库,然后插入标签
       b.JSP Tag API:
            Servlet容器编译jsp网页时,遇到自定义标签就会调用标签处理类
            标签处理类必须扩展以下两个类之一:
                       javax.servlet.jsp.tagext.TagSuppor
                           doStartTag:容器遇到自定义标签的起始标志时调用该方法,返回一个整数值,用来决定程序的后续流程。
                              返回值:Tag.SKIP_BODY表示标签之间的内容会被忽略
                                           Tag.EVAL_BODY_INCLUDE表示标签之间的内容正常执行。
                               jsp基础复习_第27张图片
                           doEndTag:容器遇到自定义标签的结束标志时调用该方法,返回一个整数值,用来决定程序的后续流程
                              返回值:Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户浏览器上
                                              Tab.EVAL_PAGE表示按正常的流程继续执行JSP网页
                       javax.servlet.jsp.tagext.BodyTagSupport;
       c.标签库的描述文件的后缀名:.tld,--->标准的xml文件,与web.xml文件必须在同一目录下。




          
           

你可能感兴趣的:(jsp,servlet,session,浏览器,服务器,application)