<pre>

 

day10

 

上节内容回顾

         1jsp的入门

                   *jsp里面如何嵌入java代码

                   **有三种 <%!  %>  <%= %> <%  %>

 

                   *jsp就是servlet,最终也会被编译成servlet,放到tomcatwork目录里面

 

         2el入门

                   *获取域对象里面的值

                   *${域对象的名称}

 

         3cookie

                   *cookie分类

                   **有两种:会话级别的cookie和持久性的cookie(使用方法setMaxAge方法)

 

                   *创建cookienew Cookie("","")

                   *cookie回写到浏览器里面 response.addCookie(cookie);

 

                   *销毁持久性的cookie

                   第一:创建一个和要删除cookie相同名称的cookie,值""

                   第二:设置有效时长是0

                   第三:设置有效路径

                   第四:把cookie回写到浏览器内存

 

         4session

                   *session是服务器端技术,依赖于cookie

 

                   *session的创建、销毁

                   **创建:执行request.getSession()

                   **销毁有三种

                   *tomcat里面进行配置、先编码再解码

                   **第三种:调用方法

 

                   *禁用cookie之后,使用session

                   **在地址后面加一个;jsessionid=id

 

 思维导图

wKioL1WalG6TcwPhAADsH_VFplU941.jpg

1jsp

         1java  server pagesjava服务器端的页面,jsp运行在服务器(tomcat里面)

         *之前学过servletsun公司开发用于动态网站的技术,还有一个jsp

         **先有的servlet,因为servlet如果向页面输出内容太麻烦了,所以sun公司开发jsp可以方便向页面进行输出

 

         2jsp就是servletjsp最终也会被编译成servlet,会放到tomcatwork目录里面

         *jsp在什么时候编译成servlet:请求jsp时候编译成servlet

 

         3jsp组成:html+java代码+jsp自身

         4)在jsp里面要嵌入java代码有三种方式

         第一种:<%!  %>,如果定义变量是成员变量

         第二种:<%=  %>,向页面输出,生成servletservice方法里面out.print("hello" );

         第三种:<%  %>,写java代码,生成的servlet也在service方法里面

 

         4jsp的注释

         *jsp组成:html+java代码+jsp自身

         **html的注释

         **java的注释

         **jsp自身的注释  <%-- jsp自身的注释 --%>

 

         * jsp的源代码阶段:这三类注释都存在

         * jsp编译成servlet之后:html注释和java注释存在,JSP注释会消失。

         * jsp最终向页面输出之后:只是html注释存在

        

         *jsp里面如果嵌入java代码,不能使用html的注释,而要是jsp自身的注释

          <%--

              <%

                   for(inti=0;i<2;i++) {}

               %>

          --%>

 

 

         5jsp的有三个指令

         *jsp指令的语法:首先jsp里面的指令要写在jsp页面最上面(不包括include指令)

                  <%@ 指令的名称  属性的名称="属性的值"%>

         属性名称写的时候严格区分大小写。

         第一个:page指令,设置jsp页面的一些信息

         <%@page 属性名称="属性的值"%>

         *page指令里面的属性

         **language属性:表示jsp支持的语言的类型,目前只支持java

         **extends属性:表示jsp编译成servlet,继承的类,一般不需要修改,默认继承的类HttpJspBase

                   ***原则:可以改变这个继承的类,但是这个类必须要是一个servlet

        

         **session属性:表示在jsp里面是否可以直接使用session对象,属性的值是truefalse

                   ***在默认的情况下,session属性的值是true

         =代码

            <%

               //request.getSession().setAttribute("aa","itheima");

               session.setAttribute("aa","itcast");

             %>

             <%=session.getAttribute("aa")%>

        

         **import属性:表示在jsp导入依赖的包

         =代码(可以分别写,也可以写在一起)

         java不同,jsp快速导包不是ctrl+shift+o,而是将光标放在类名的后面,alt+/

         <%@page import="java.util.Date"%>

         <%@page import="java.util.List,java.util.ArrayList"%>

 

         **bufferjsp输出的缓冲区的大小,默认的值 8kb

         **autoFlushjsp输出如果超出了缓冲区的大小,是否会正常输出

 

 

         **errorPage属性:如果jsp运行的时候出现了异常,设置异常跳转到错误页面(虽然

                                               页面的内容发生了变化,但是地址栏没有发生变化,说明跳转采用的

                                               转发机制

         **isErrorPage属性:在错误页面里面,是否显示错误信息,默认false.

                   ***一般用在程序员调试程序时候,但是如果系统要给客户,isErrorPage一定要设置成false

                   =当在错误页面里面把属性的值设置成true之后,才能在errorPage页面来使用

                   exception这个内置对象。

                   ==编译的servlet里面生成了代码

                       java.lang.Throwable exception =org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);

                       if (exception != null) {

                        response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

                       }

        

         * contentType:设置打开jsp时候浏览器的编码

         * pageEncodingjsp编译成servlet,编译成servlet时候采用的编码

                    pageEncoding="utf-8",默认的编码是iso8859-1

        

         *isELIgnoredjsp里面是否忽略el表示(jsp是否可以使用el表达式),默认值false,表示不忽略(可以使用)

                   **如果想要在jsp里面使用el表达式,需要把这个属性值设置成false。如果设置成true,会把el表达式当做普通文本输出

 

         **重点掌握的属性: session import errorPage pageEncoding

 

 

         第二个:include指令,用于包含页面的指令(静态包含)

                   *支持多层嵌套,这样除了最外层的JSP,其它的JSP页面都可以不用写html代码,

                            直接写内容即可。

                   *在一个jsp里面包含其他的jsp里面内容

                   *语法: <%@ include 属性="属性值"%>

                   =  <%@ include file="head.jsp"%>

                  

                   *注意一:当包含某个jsp页面时候,在包含的的页面里面不需要写html的代码了,只需要写包含的内容

                   *注意二:include指令的file属性里面不能写参数,即加上?id=1等等内容。

                   *注意三:在includefile属性里面不能写变量

                   *注意四:在includefile属性里面路径不能加项目名。   

                  

                   *jsp最终要编译成servlet,有多个jsp页面,最终会编译成几个servlet

                            *使用include指令包含多个页面,最终会编译成一个servlet

                            *静态包含相当于代码复制把多个jsp里面的内容复制到一个jsp里面,生成一个servlet

 

 

         第三个:taglib指令

                   *作用:经常和jstl标签库一起使用,替代页面中的<% %>

                   *语法:<%@ taglib uri="jstl标签库的路径"prefix="标签库的别名"%>

 

         *掌握程度:

         第一:知道jsp里面有三个指令以及这三个指令的名称

         第二:三个指令分别可以做什么以及如何做

 

         问题:jsp里面有哪些指令?

         答:jsp里面有三个指令,这三个指令分别是 pageincludetaglib

             page指令可以设置页面的信息,里面重要的属性是sessionimporterrorPagepageEncoding

             include表示包含其他的jsp页面

             taglib可以和jstl使用替代页面中<%%>

 

 

         6jsp的内置对象

                   *什么是内置对象:在jsp里面可以直接使用的对象称为内置对象

                   *jsp里面有九个内置对象

                   request就是servlet里面HttpServletRequest对象,代表请求,域对象,获取提交的数据,获取客户机信息

                   response:就是servlet里面HttpServletResponse对象,代表响应,回写cookie,向页面输出

                   sesssion:就是servlet里面HttpSession对象,域对象

                   config就是servlet里面ServletConfig对象,获取servlet名称,获取初始化参数

                   application:是servlet里面的ServletContext对象,域对象,获取全局初始化参数,读取web项目中文件

 

                   exception代表异常对象

                            *如果想要使用,必须要把属性isErrorPage设置成ture才可以使用

                             java.lang.Throwable exception =org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);

                                if (exception != null) {

                                 response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

                                }

 

                   page代表jsp编译成servlet,当前运行的servlet这个对象

                   out向页面输出的对象

                            * outresponse.getWriter()区别

                            **out使用的是JspWriterresponse.getWriter()使用的是 PrintWriter

                           

                            *outresponse.getWriter()输出机制

                            **产生两个缓冲区outresponse

                            ***out不能直接向页面输出,把out里面的值放到response缓冲区里面,通过response向页面输出

 

                   pageContext****

                            第一:本身就是一个域对象

                                     **pageContext只是在jsp里面可以使用,当前页面。

                                     **设置值 setAttribute(String name, Object value)

                                     **取值 getAttribute(String name)

                                     =代码

                                         <%

                                               pageContext.setAttribute("msg","itcast100");

                                          %>

                                         <%=pageContext.getAttribute("msg") %>

 

                            第二:pageContext可以向域对象里面设置值

                                     *servletContext(在jsp里面application)、sessionrequest

                                    

                                     1)设置值的方法:setAttribute(String name, Object value, int scope)

                                               第三个参数:表示是哪个域

                                               *使用pageContext的常量表示不同的域

                                               *如果是application,使用APPLICATION_SCOPE

                                               *如果是session,使用SESSION_SCOPE

                                               *如果是request,使用REQUEST_SCOPE

                                               *如果是pageContext,使用PAGE_SCOPE

 

                                     2取值的方法:getAttribute(String name,int scope)

                                               第二个参数:表示是哪个域

                                               *使用pageContext的常量表示不同的域

                                               *如果是application,使用APPLICATION_SCOPE

                                               *如果是session,使用SESSION_SCOPE

                                               *如果是request,使用REQUEST_SCOPE

                                               *如果是pageContext,使用PAGE_SCOPE

                                     =代码

                                          <%

                                               pageContext.setAttribute("app","appvalue", pageContext.APPLICATION_SCOPE);

                                               pageContext.setAttribute("sess","sessvalue",pageContext.SESSION_SCOPE);

                                               pageContext.setAttribute("req","reqvalue", pageContext.REQUEST_SCOPE);

                                               pageContext.setAttribute("page1","page1value", pageContext.PAGE_SCOPE);

                                           %>

                                           <%=pageContext.getAttribute("app",pageContext.APPLICATION_SCOPE) %>

                                          <%=pageContext.getAttribute("sess",pageContext.SESSION_SCOPE) %>

                                          <%=pageContext.getAttribute("req",pageContext.REQUEST_SCOPE) %>

                                           <%=pageContext.getAttribute("page1",pageContext.PAGE_SCOPE) %>

                                    

                                     3findAttribute(String name) 方法(注意这个方法是pageContext对象

                                               所特有的方法)

                                     *表示从域对象里面获取值,如果多个域对象里面的值相同的,得到域范

                                     围小的里面的值《** 如果只设置 application域的属性值,在360

                                     览器中获取不到值!!****

 

                                     *四个域对象!!!!!!!!!!!!!!!!!!!!!!!!!

                                     **pageContext:范围当前的页面有效(这个域对象只是在jsp里面使用)

                                     **request:范围一次请求

                                     **session:范围是一次会话

                                     **application:范围是整个web项目

                                                                                                                                                    

                            第三:pageContext可以获取其他八个内置对象

                            *只需要得到pageContext,就可以得到jsp里面的其他的八个内置对象

                            *  <%

                                     pageContext.getRequest();

                                     pageContext.getResponse();

                                     pageContext.getSession();

                                     //....

                              %>

 

                            *掌握程度:九个内置对象是什么,九个内置对象分别可以做什么

 

 

         ==========================================================================================

         上午内容的总结

         1jsp的三个指令

                   *page includetaglib

        

         2jsp的九个内置对象

                   request

                   response

                   session

                   config

                   application

                   exception

                   page

 

                   out

                            *outresponse输出机制

                   pageContext

                            *第一:域对象,这个域对象只能在jsp里面使用

                            *第二:向其他域对象里面设置值

                            *第三:获取其他的八个内置对象

 

 

         7jsp的动作标签

         (代码位置:/day10/WebRoot/jsp

                   *语法: <jsp:标签名称属性="属性值"></jsp:标签名称>

                   *jsp里面可以实现的一些功能

                   *jsp里面有六个动作标签

                   第一类:与javabean没有关系的动作标签(有三个)

                   **<jsp:forward></<jsp:forward>:实现在jsp里面转发的操作(注意路径不能有项目          )

                            ***<jsp:forward   page="/jsp/hello.jsp" ></jsp:forward>

                            ***类似于servlet里面执行request.getRequestDispatcher(...).forward(....);

 

                   ** <jsp:include></jsp:include>: 表示包含页面(动态包含)

                            ***有多个jsp,多个jsp会编译成几个servlet

                            ***有多个jsp会编译成多个servlet

                            =代码 <jsp:include page="head.jsp"></jsp:include>

                            **已经有一个include标签的jsp页面,不能再被其它的jsp页面的jsp:forward

                            jsp:include页面使用。

                           

                   ** <jsp:param></jsp:param>: 传递参数

                            ***一般用在有路径的动作标签里面

                            ***类似于get提交

                            ****http://127.0.0.1/day10/login?id=1

                            =代码

                               <!-- 使用动作标签实现转发 -->

                                <!-- 类似于进行转发的操作,在地址后面添加参数hello.jsp?id11=zhangsan -->

                                <jsp:forwardpage="/jsp/hello.jsp">

                                     <jsp:paramvalue="zhangsan" name="id11"></jsp:param>

                                </jsp:forward>

                            ****标签中有中文提交的数据乱码。

                   第二类:与javabean有关系的动作标签(有三个)

                   **<jsp:useBean>: 表示设置要操作哪一个javabean

                   **<jsp:setProperty>: javabean里面设置值

                   **<jsp:getProperty>: javabean里面获取值

 

 

2javabean******

         1)什么是javabean:就是一个java类,这个java类要遵循一定的书写规范

         *书写规范

         第一个规范:javabean里面需要有一个公开的没有参数的构造方法

         第二个规范:javabean里面的属性私有的

         第三个规范:javabean里面的属性需要通过公开的方法暴露出来(setget方法)

 

         2javabean主要的功能是用于存储数据的(封装数据)

         *通过set方法向javabean里面设置值,通过get方法从javabean里面获取值

 

         3)如何向javabean里面封装数据

         *创建一个页面,在页面里面写表单,表单提交到一个servlet里面去,在servlet里面获取表单的数据,

         使用下面的三种方式把数据封装到javabean里面

 

         *第一:使用传统方式向javabean里面封装数据

         (代码位置/day10/src/cn/itheima/servlet/Bean1Servlet.java

         =代码

                   //创建Person的对象

                   Personp = new Person();

                   //使用Person里面set方法设置值

                   p.setUsername(username);

                   p.setAge(age);

                   System.out.println(p.toString());

 

         *第二:使用jsp的动作标签向javabean里面设置值

         (代码位置/day10/WebRoot/javabean/bean02.jsp

         *     ** <jsp:useBean>: 表示设置要操作哪一个javabean

                   **<jsp:setProperty>: javabean里面设置值

                            **简写方式: <jsp:setProperty property="*"name="p1"></jsp:setProperty>

                            **要求:表单输入项的name的值必须要和javabean里面的属性名称一样

 

                   **<jsp:getProperty>: javabean里面获取值

                            **使用这个标签时候,没有* 的效果,只能一个一个去取值

 

         **当在jsp里面写<jsp:useBean id="p1" class="cn.itheima.bean.Person"scope="page"></jsp:useBean>

         生成下面的代码:

          cn.itheima.bean.Person p1 = null;

               p1 = (cn.itheima.bean.Person)_jspx_page_context.getAttribute("p1",

              javax.servlet.jsp.PageContext.PAGE_SCOPE);

               if (p1 == null){

                   p1= new cn.itheima.bean.Person();

                   _jspx_page_context.setAttribute("p1",p1, javax.servlet.jsp.PageContext.PAGE_SCOPE);

               }

                  

         =代码

              <jsp:useBean id="p1"  class="cn.itheima.bean.Person"scope="page"></jsp:useBean>

  

                   <%--     <jsp:setPropertyproperty="username" name="p1"></jsp:setProperty>

             <jsp:setPropertyproperty="age" name="p1"></jsp:setProperty>--%>

            

             <!-- 简写方式向javabean里面设置值

                   要求:表单输入项的name的值必须要和javabean里面的属性的名称要一样

             -->

             <jsp:setProperty property="*"name="p1"></jsp:setProperty>

            

             <jsp:getPropertyproperty="username" name="p1"></jsp:getProperty>

              <jsp:getPropertyproperty="age" name="p1"></jsp:getProperty>

 

 

         *第三:小型的框架BeanUtils,通过这个框架向javabean里面设置值

         (代码位置/day10/src/cn/itheima/servlet/Bean2Servlet.java

                   *要求:表单输入项的name的值必须要和javabean里面的属性的名称一致

 

                   *如果使用jsp动作标签只能在jsp里面使用,不能在servlet里面使用。

                   如果想要在servlet实现类似的效果,需要实现一个小型的框架来实现

 

                   *使用框架 BeanUtils封装数据到javabean(类库)

                   **这个框架不是javaee的一部分,如果想要使用首先导入jar包,beanutils需要两个jar

                   *beanutilsApache组织开发框架,用于封装数据到javabean

                  

                   *使用类org.apache.commons.beanutils包里面的类 BeanUtils

                   *框架里面使用的方法 populate(Object bean, Map properties)

                   **通过这个方法完成数据封装到javabean

                   **这个方法里面传递两个参数:

                   ***第一个参数是要封装的javabean对象

                   ***第二个参数是map集合,使用getParameterMapmap值,这个map值的结果是key是表单输入项name的值,

                   value是输入的值

 

                   *如何向web项目中导入jar

                   **导入方式:复制jar包,复制到web项目里面的一个文件夹 WEB-INF/lib 下面就可以了

 

                   =代码

                   //创建javabean对象

                   Personperson = new Person();

                   try{

                            BeanUtils.populate(person,request.getParameterMap());

                   }catch (Exception e) {

                            e.printStackTrace();

                   }

 

 

3el表达式

         1el表达式用于获取域对象里面的值

         *语法: ${域对象值的名称}

 

         2el表达式如何获得域对象值

         (代码/day10/WebRoot/el/el01.jsp

         *首先创建jsp页面,在jsp里面分别向四个域对象里面设置值

         *使用el表达式获取四个域对象里面的值

 

         =代码一:

             <%

                   application.setAttribute("app","appvalue");

                   session.setAttribute("sess","sessvalue");

                   request.setAttribute("req","reqvalue");

                   pageContext.setAttribute("page","pageValue");

              %>

              <!-- 使用el表达式获取 -->

              ${app }

              ${sess }

              ${req }

              ${page }

          

          * 向四个域对象里面设置值,名称都相同

          ** 获取四个域对象里面相同名称的值,在el表达式里面加上一个scope

          = 代码二:

               <%

                   application.setAttribute("itheima","appvalue1");

                   session.setAttribute("itheima","sessvalue1");

                   request.setAttribute("itheima","reqvalue1");

                   pageContext.setAttribute("itheima","pageValue1");

              %>

              <!-- 获取四个域对象里面名称相同的值-->

              <!-- 获取pageContext域里面的值 -->

              ${pageScope.itheima }

              <!-- 获取request域里面的值 -->

              ${requestScope.itheima }

              <!-- 获取session域里面的值 -->

              ${sessionScope.itheima }

              <!-- 获取servletcontext域里面的值 -->

              ${applicationScope.itheima }

 

 

         3el表达式如何获取域对象里面的数组、集合、对象的值

         *向域对象里面放数组,如何取值?

         **数组的下标开始位置是0

         **使用el表达式获取下标不存在,返回空字符串""

         (代码/day10/WebRoot/el/el02.jsp

         =代码

             <!-- 向域对象放数组,取值的方法 -->

             <%

                   String[]arr = {"lucy","jack","mary"};

                   //把数组放到域对象里面

                   request.setAttribute("arr",arr);

              %>

              <!-- 使用el表达式获取域对象里面的数组的值

                   也是通过数组的下标取值

              -->

              ${arr[10] }

        

         *向域对象里面放list集合

         (代码/day10/WebRoot/el/el02.jsp

         **使用下标获取,使用el表达式获取下标不存在,返回空字符串""

         **使用el表达式不能获取set集合里面的值,set集合无序的

         =代码

              <%

                   List<String>list = new ArrayList<String>();

                   list.add("AAAA");

                   list.add("BBBB");

                   list.add("CCCC");

                   //list集合放到域对象里面

                   request.setAttribute("list",list);

               %>

               <!-- 使用el表达式获取域对象里面的list集合的值

                   也是使用下标获取

               -->

               ${list[20] }

          

           * listset的区别

 

 

         *向域对象里面放map集合

         (代码/day10/WebRoot/el/el02.jsp

         *使用域对象名称.key的名称,得到value

         =代码

              <%

                   Map<String,String>map = new HashMap<String,String>();

                   map.put("NAME","ZHANGSAN");

                   map.put("AGE","100");

                    map.put("ADDR","TIANJIN");

                   //map集合放到域对象里面

                   request.setAttribute("map",map);

               %>

                <!-- 使用el表达式获取域对象里面的map -->

                ${map.NAME }

                   ${map.AGE}

                    ${map.ADDR }

        

 

         *获取域对象里面的对象的属性的值

         (代码/day10/WebRoot/el/el03.jsp

         **使用域对象名称.属性的名称

         =代码

             <%

                   Personp1 = new Person();

                   p1.setUsername("WAGNWU");

                   p1.setAge("200");

                   //p1放到域对象里面

                   request.setAttribute("person",p1);

              %>

              <!-- 使用el表达式获取person对象里面的属性的值-->

              ${person.username }

              ${person.age }

 

========================================================

         今天内容的总结

         1)掌握jsp里面如何嵌入java代码

         2)掌握jsp里面三个指令

                   *pageincludetaglib(和jstl标签库使用,替代页面中的<%%>

         3)掌握jsp里面九个内置对象

                   *九个内置对象是什么,九个内置对象做什么事情

                   *out对象:out输出机制

                   *pageContext对象

                            =域对象

                            =向其他的域对象里面设置值

                            =获取其他的八个内置对象

         4)掌握四个域对象的范围

                   *applicationsessionrequestpageContext

        

         5)掌握jsp里面的六个动作标签

                   *第一类:与javabean无关的标签(会用)

                   *第二类:与javabean有关的标签有三个(******

                            =<jsp:useBean>

                            =<jsp:setProperty>

                            =<jsp:getProperty>

 

         6)掌握javabean

                   *什么是javabean(遵循的规范)

                   *javabean作用:封装数据

 

                   *如何向javabean里面封装数据(三种)(****

                            **如果使用beanutils框架首先导入jar

                            **如果向web项目中导入jar

                           

         7el表达式

                   *el表达式获取域对象里面的值(全写的方式)

                   *el表达式获取域对象里面的数组、listmap、对象里面的属性的值的操作

 

===================================================

         完成任务:

         1)背下来jsp三个指令,九个内置对象,六个动作标签,四个域对象

         2)把封装数据到javabean代码至少写一遍

         3)把使用el表达式获取域对象里面值,和对象里面的数组、listmap、对象里面的属性的值的代码至少写一遍

 

 

 

 

 

 

 

</pre>