天天看点

javaWeb_JSP,EL及JSTL的使用

JSP:
    什么是JSP:Java Server Pages (Java服务器端页面.)
    为什么出现JSP:拟补Servlet自身的缺陷.
        JSP = HTML + Java + 自身的指令 标签...`
    JSP的执行原理:
        JSP也会被翻译成Servlet 解析执行.
    JSP的运行脚本:
        <%!   %>    :定义 变量 方法 和 类.   翻译成全局变量、全局方法、内部类. 很少使用.
        <%=   %>    :表达式.不需要写;       翻译成out.println(  );中的内容.
        <%    %>    :定义 变量 不能定义方法. 翻译成service方法内部的代码.

        下面的JSP的代码,在JSP中运行会输出(  C  )
        <%=x %>
        <% x=; %>
        <% int x = ; %>
        <% this.x = ; %>
        <%=x %>
        <%! int x = ; %> 

        A.编译错误   B.10  0   C.0  10   D.0  20

        <%! int x = ; %>       ---- 定义一个全局变量x = 0; 优先翻译.
        <%=x %>                 ---- 输出x  全局变量x   输出0
        <% x=; %>              ---- 将全局变量赋值为 x = 5;
        <% int x = ; %>       ---- 定义局部变量 x = 10;
        <% this.x = ; %>      ---- 全局变量x的值修改为了20;
        <%=x %>                 ---- 输出x是局部变量 

    JSP的注释:
        支持HTML语法:
            * HTML的注释: <!--  注释  -->

        支持Java代码 :
            * Java的注释:
                //          单行注释
                /*  */      多行注释
                /** */      文档注释

        本身JSP注释:
            * JSP注释:
                <%--  JSP注释 --%>

        注释的区别:
            JSP注释:  只会存在于源代码阶段(JSP阶段).翻译成Servlet执行的时候  注释消失了.
            Java注释: 会存在于源代码及Servlet代码接到 当由Servlet生成HTML输出的时候 注释消失了.
            HTML注释: 会存在源代码 及 Servlet的代码 及 生成的HTML页面 都会存在.

    JSP的指令:JSP指令用于提供整个JSP页面的相关信息以及用于JSP页面与容器之间的通信。
        指令:page include taglib.
        语法:<%@ 指令名称 属性名称="属性值" %>

        page指令:
            language:   用于指定在JSP页面中可以使用的语言.目前来讲只能是java. 
            extends:    用于指定JSP最终翻译成Servlet 继承的类.
                * 默认继承:org.apache.jasper.runtime.HttpJspBase 可以修改 但是这个类必须是Servlet
            session:    用于指定JSP是否可以在页面中直接使用session对象. 
                * session默认为true在页面中默认可以直接使用session对象
                生成的servlet中 可以看到有一下两句:
                    HttpSession session = null;
                    session = pageContext.getSession();
                * session值改为false  在页面中不能直接使用session.
            import:     用于指定JSP中 导入的Java类的包.(import属性 在page指令中 可以出现多次的.)
                * 默认导入的包:
                    import java.lang.*;
                    import javax.servlet.*;
                    import javax.servlet.http.*;
                    import javax.servlet.jsp.*;
            buffer和autoFlush: buffer用于指定JSP向页面输出的时候缓冲区的大小.默认 8kb.  
                autoFlush:用于指定超出缓冲区 默认是true 正常输出  如果值改为了false 出现异常
            errorPage和isErrorPage:errorPage:用于指定JSP页面出错了.转向到一个错误提示页面.
                isErrorPage:在错误页面中 查看错误信息. 默认值是false  将其值改为true.将在代码中生成以下代码:
                    Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
                    if (exception != null) {
                      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                    }
                在页面中可以直接使用exception对象.

                企业中配置全局错误页面:(*****)
                    在项目的web.xml中
                    <error-page>
                        <error-code>404</error-code>
                        <location>/404.jsp</location>
                    </error-page>

                    <error-page>
                        <error-code>500</error-code>
                        <location>/500.jsp</location>
                    </error-page>
            contentType和pageEncoding:contentType:用于指定JSP 浏览器默认采用的编码.
                pageEncoding:文件保存的时候 文件被翻译成Servlet的时候采用的字符集编码
            isELIgnored:用于指定JSP页面是否忽略EL表达式.  默认:false  默认不忽略.
                如果将该值改为true 。 不能在页面中使用EL了.

            重点:import contentType和pageEncoding

        include指令:用于页面的包含.(静态包含.)
            <%@ include file=""%>
                file:被包含的页面的路径.
            在包含的时候 被包含的页面 不需要写html的结构.
            file:代表是被包含页面的路径
                * file的值不能是变量.
                * file的值不能传递参数.

            原理:
                相当于代码的拷贝.最后翻译成一个servlet 由该Servlet执行.

        taglib指令: 用于页面引入标签库. 标签库 主要用于替换页面中<%%>
            <%@ taglib uri="" prefix=""%>
                uri:标签库路径.
                prefix:标签库的小名.

        JSP的三大指令:page include taglib.

        (*****)JSP的内置对象:(面试:JSP中内置对象有哪些?常用方法有什么?对象代表的含义?)
            内置对象:在JSP中直接可以使用的对象.
            九个内置对象:
                pageContext、request、response、session、application、out、page、exception、config

                request:HttpServletRequest  代表客户的请求
                response:HttpServletResponse    代表服务器的响应
                session:HttpSession         代表一次回话
                application:ServletContext  针对一个web项目、服务器的一个对象
                exception:Throwable     异常信息
                config:ServletConfig    获得Servlet配置信息   getInitParameter();  getServletName();
                page:Object     代表jsp翻译成Servlet类的对象
                pageContext:PageContext 代表一个域对象,只能在当前页面使用
                out:jspWrite    输出对象

                ***** out对象  和  response.getWriter();  是不是一个对象?
                    肯定不是.out是JspWriter 而response.getWriter()获得PrintWriter.

        JSP的四个作用范围:
                pageContext:page范围.
                request:请求范围.
                session:会话范围.
                application:应用范围.

                ***** page指令  page对象  page范围.

    JSP的标签:(JSP的动作) JSP Action
        语法:
            <jsp:forward>       :转发.
            <jsp:include>       :包含.(动态包含)
                * 动态包含 和 静态包含的区别?
                    动态包含:包含运行结果、编译多次
                    静态包含:相当于直接代码拷贝、编译一次
            <jsp:param>         :传递参数.  (一般不用.)


            以下3个标签与JavaBean有关.
            <jsp:useBean>       :
            <jsp:setProperty>   
            <jsp:getProperty>

            什么叫做JavaBean: 作用封装数据.  JavaBean:就是一个满足了某种特定格式的Java类.
                格式:
                    这个Java类必须具有一个无参的构造函数
                    属性必须私有化。
                    私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
                        setXxxx   getXxxx
            JavaBean的属性:
                * JavaBean的属性是由谁决定的? 由get 或 set方法决定.

            <jsp:useBean>
                id:对当前类 取的唯一标识 .
                class:JavaBean类的全路径 。
                scope:page request session application 创建一个对象 对象放在某个域中.

            <jsp:useBean id="p" class="cn.itcast.bean.Person" scope="page"></jsp:useBean> 翻译后 生成以下的代码.
            cn.itcast.bean.Person p = null;
            synchronized (_jspx_page_context) {
                p = (cn.itcast.bean.Person) _jspx_page_context.getAttribute("p", PageContext.PAGE_SCOPE);
                if (p == null){
                  p = new cn.itcast.bean.Person();
                  _jspx_page_context.setAttribute("p", p, PageContext.PAGE_SCOPE);
                }
            }

            <jsp:setProperty property="id" name="p"/>
            <jsp:setProperty property="name" name="p"/>
            <jsp:setProperty property="sex" name="p"/>
            简写:
            <jsp:setProperty property="*" name="p"/>
                前提:表单中的name的值 于 JavaBean的setXxx满足一致.

            内省:获得JavaBean的属性.及对应属性的读和写的方法.(了解.)
                没有反射底层.

                java.beans.Introspector
                    * static BeanInfo getBeanInfo(Class<?> beanClass)  --- 获得类的信息.
                java.beans.BeanInfo 
                    * PropertyDescriptor[] getPropertyDescriptors() --- 获得类的属性描述.
                java.beans.PropertyDescriptor   
                    * String getName();
                    * Method getReadMethod() 
                    * Method getWriteMethod() 

            BeanUtils:Apache下的一个开源免费的类库. *****会用.
                完成JavaBean的封装.
                核心类:
                BeanUtils 
                    static void populate(Object bean, Map properties) 

                ConvertUtils 
                    static void register(Converter converter, Class clazz) 


EL:结合JSTL的标签库 替换 页面中的<%%>
        语法:${ EL表达式. }

        * 获得域对象值.
            * 传统方式取值.
                <%=pageContext.getAttribute("name") %>
                <%=request.getAttribute("name") %>
                <%=session.getAttribute("name") %>
                <%=application.getAttribute("name") %>
            * 使用EL取值
                ${ pageScope.name }
                ${ requestScope.name }
                ${ sessionScope.name }
                ${ applicationScope.name }
            * EL的简写
                ${name}  :默认从小的范围中找name的值 有没有. 

                EL比传统方式好:如果名称写错了  EL 返回一个 "" 空的字符串  而 传统方式 返回null.

            * 获得域对象中存的数组的值.
                ${ 数组名称[下标] }
            * 获得域对象的List集合的值 .
                ${ list名称[下标]}
            * 获得域对象的Map集合的值 .
                ${ map的名称.key }
            * 获得域对象的对象属性的值 .
                ${ 对象名称.属性名}

                [] 和 . 索引值 使用[]  . 一般是带有属性.(对象中的属性.) 
                    如果map集合的key中有特殊符号 不能使用. 必须是用[] 如 ${ map["ddd.eee"] }

        * 执行运算.
            算数运算:
                ${ n1 + n2 }
            逻辑运行:

            关系运算:

        * 操作web开发常用的对象.
            个.
                param           :相当于request.getParameter();
                paramValues     :相当于request.getParameterValues();
                    * 这两个用来接收参数的.

                header          :获得请求的头信息  request.getHeader("");
                headerValues    :获得一个key对应多个value的情况.
                    * 这两个用来获得请求的头信息.
                cookie          :获得Cookie的信息.
                    * 之前获取Cookie  request.getCookies();  返回一个Cookie的数组.在数组中查找指定名称的Cookie.

                    ${ cookie.history.value } // 获得了名称是history的Cookie的value的值.
                initParam       :获得全局初始化参数.

                pageContext     :就是PageContext内置对象.
        * 调用Java的方法

总结:
    JSP的脚本
        可以写入java代码<% %> <%! %> <%= %>
    JSP的注释
        jsp注释:<%-- --%>:只存在就jsp中
        java注释:<%// /* */ /** */>%:能存到编译后的servlet中,倒也html页面上就没了
        html注释:<!-- -->:一直都会存在
    JSP的指令
        <%@ 指令名称   %>
        三大指令:page include taglib
    JSP的内置对象
        九大内置对象:pageContext request response session application out exception page config
    JSP的动作标签
        <jsp:标签 >
            forward
            include
            param
            userBean
            setProperty
            getProperty

            **** 动态包含与静态包含
                静态包含代码  动态包含结果
    JSP的四个作用范围
        pageContext
        request
        session
        application

JavaBean:java类
    BeanUtils
        导包    
        自定义类型转换器
        BeanUtils.populate(Object obj, Map map);


    EL表达式:
        获取值
            获取四个域对象的值
            **** 获取域对象村的值   数组List Map
        执行运算
            *算术运算
            *关系运算
            *逻辑运算
                *三元运算
        EL中操作web常用的对象
            pageScope
            requestScope
            sessionScope
            applicationScope

            param
            paramValues

            header
            headerValues

            cookie
            initParam

            pageContext