Web阶段(day12 jsp)

day12
jsp
1.jsp概述
    在servlet创建之初,其中会书写页面的html代码,但是这种形式使用起来非常复杂,面对
    繁琐的页面构成,无法灵活书写,所以sun公司决定提出一门新的技术,将html和java
    代码同时放在页面当中。这样就可以检查前台页面与后台页面相互传值和处理逻辑的过程。
    简化了操作。这门技术就是jsp。
    jsp是一门动态资源开发技术。
2.JSP原理
    jsp本质是一个Servlet文件,在初次访问jsp页面的时候,jsp会由jsp翻译引擎翻译成一个Servlet文件。
    实验:tomcat/work/host/.../index_jsp.java,查看其中的类名,继承的类名,下方重写的init destroy service 方法。

3.JSP语法
    3.1 模(mu)板元素
        页面中的html内容,会被当做模板元素输出。
          例:out.write("\">\r\n");
              out.write("   \r\n");
              out.write("<title>My JSP 'index.jsp' starting");
            html内容会通过out.write()输出到页面中,html原有内容不变。
    3.2 jsp脚本表达式
        格式:<%=jsp脚本表达式%>
        out.print(new Date().toLocaleString());
        页面中的jsp脚本表达式会在访问页面时被翻译成Java语句。通过out.print()方法输出在对应位置。输出的内容为表达式计算的结果值。
    3.3 jsp脚本片段
        格式:<%jsp脚本片段%>
        页面中书写的jsp脚本片段,在被翻译到servlet中时,会变成一个java语句,放在对应的位置。脚本片段可以书写的不完整,但是要保证多个脚本片段拼接带来仍然是一个完整的Java语句。否则会导致页面报错,不能正常执行。
    3.4 jsp声明
        格式:<%!jsp声明%>
        页面中jsp声明在被翻译到servlet中时,会变成一个成员变量/方法,存放在类内方法外。这个变量/方法可以被当前servlet文件中使用。
    3.5 jsp注释
        java注释 <% // java %>    java注释在被翻译到servlet中时,仍然为java语句,只不过为注释内容,不会向页面中输出这段内容。
        html注释 <!-- html注释 -->    
        jsp注释 <%-- jsp注释 --%>    jsp注释在被翻译到servlet中时,将完全抛弃其中的内容。注释的内容不会出现在servlet文件中(慎用,可能导致不必要的错误。
    3.6 jsp指令
        jsp指令本身不会产生任何输出,是用来规定jsp翻译引擎如何将页面翻译成servlet文件的。jsp指令出现的位置和数量都是任意的。
        <%@page% 属性名= 属性值> 声明当前jsp页面的基本属性,用于规定页面如何被jsp翻译引擎翻译jsp到servlet。
        import ="" 导入需要使用到的包。(默认导入java.lang*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*)各个包之间用逗号隔开。
        session = "true|false" 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,用于可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费,如果确定jsp中不需要session可以设为false。
        buffer="none|8kb" out隐式对象所使用的缓冲区的大小。
        errorPage = "relative_url" 如果页面出错,将要跳转的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用。在web.xml中添加<error-page>标签,可以全局显示错误友好页面。
        isErrorPage = "true|false" 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象。                     
        pageEncoding = "utf-8" 服务器翻译jsp时使用的编码集,如果想防止jsp乱码,应该保证文件编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致,此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性。
        <%@include%> 用于将两个页面合并输出的指令。
            只有file属性,可通过这个属性引入指定路径的页面。
        <%@taglib%> 用于引入标签库的指令。
4.九大隐式对象。
    page 代表当前servlet的对象(jsp被翻译后的servlet文件)。
    request 代表请求的对象。
    response 代表响应的对象。
    session 代表会话的对象。
    config 代表当前servlet配置信息的对象。
    application 代表当前web应用的对象。
    out 代表输出缓冲区的对象
    exception 代表跳转页面的错误信息的对象。
    pageContext 代表当前页面上下文的对象。
5. pageContext详解
    代表当前jsp页面的执行环境的对象。
    功能一:作为入口获取其他八大隐式对象。
        getException()方法返回exception隐式对象。
        getException方法返回exception隐式对象 
        getPage()方法返回page隐式对象
        getRequest()方法返回request隐式对象 
        getResponse()方法返回response隐式对象 
        getServletConfig()方法返回config隐式对象
        getServletContext()方法返回application隐式对象
        getSession()方法返回session隐式对象 
        getOut()方法返回out隐式对象
    功能二:作为域对象使用。
        域对象:如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,这个对象就称之为域对象。
        setAttribute(String name,Object value);
        getAttribute(String name);
        removeAttribute(String name);
        getAttributeNames();
        生命周期:在访问jsp页面开始的时候,pageContext对象创建,
                  在访问jsp页面结束的时候,pageContext对象销毁。
        作用范围:在整个jsp页面范围内。
        主要功能:在整个jsp页面范围内共享数据。
    功能三:设置其他作用域中的值
        setAttribute(String name,Object value,int scope); // 设置指定域中的域属性。
        getAttribute(String name,int scope); // 获取指定域中的域属性。
        removeAttribute(String name,int scope);
        getAttributeNamesInScope(scope);
        scope可选值:
            PageContext.APPLICATION_SCOPE    代表servletcontext域
            PageContext.SESSION_SCOPE    代表session域
            PageContext.REQUEST_SCOPE    代表request域
            PageContext.PAGE_SCOPE    代表pageContext域
    功能四:自动搜寻域
        findAttribute(String name);
        在四个作用域中,由小到大的搜索指定名称的域属性,如果在某一个域中搜寻到属性,则不会继续搜索更大范围的域。
    功能五:便捷的请求转发
        pageContext.forward(location);

6.四大作用域
    什么是作用域:在一个时间内有一个可以被看见的范围,在这个范围内共享数据,这个范围就称之为作用域。
    由大到小的顺序排列:
    ServletContext --- application --- web应用
        生命周期:web应用加载,servletContext对象产生。
                  web应用移出容器或服务器关闭,servletContext对象销毁。
        作用范围:整个web应用。
        主要功能:在整个web应用的范围内共享数据。
    Session --- session --- 会话范围
        生命周期:在调用request.getSesssion()时,session对象产生。
                  意外身亡:当服务器意外关闭的时候,session对象会被销毁。
                  超时死亡:在web.xml中配置了session的最大生命时长,默认为30分钟。一个session对象,超过30分钟没有任何操作,则服务器会将其销毁。
                  自杀:
        作用范围:整个会话范围。
        主要功能:在整个会话
    request --- request --- 请求
        生命周期:在请求链开始的时候,request对象产生。
                  在请求链结束的时候,reqeust对象销毁。
        作用范围:整个请求链。
        主要功能:在整个请求链中共享数据。
    pageContext --- pageContext --- jsp页面中上下文。
        生命周期:在访问jsp页面开始的时候,pageContext对象产生。
                  在
        作用范围:整个jsp页面。
        主要功能:在整个jsp页面内共享数据。
        
7.JSP标签技术
    7.1jsp标签技术概述
        jsp中既可以书写html内容展示页面,也可以书写Java语句处理逻辑。两者还可以相互嵌套。在代码量较少的时候,较为方便,一旦页面构成复杂,处理的逻辑繁琐,都会导致代码量骤增,使得页面中的html和Java语句的可读性较低。难以维护和管理。所以sun公司提出,将页面中的Java语句都使用标签替代。这样页面中只会出先标签相关的内容,页面可读性会增强,代码的可维护性会提高。
    7.2EL表达式 !!
        EL 全名为Expression Language,用来替代<%=  %>脚本表达式
        EL具有获取数据、执行运算、获取常用开发对象、调用java方法这四方面的功能。javaEE目前内置了EL表达式,可以在jsp页面中直接使用
        EL表达式可以替换全部jsp脚本表达式的内容<%=%>
        EL表达式用法 el表达式只能操作域中属性,el表达式不能进行遍历,el表达式不能设置值。
            ${el表达式}
            a.获取数据
                获取常量数据
                    <h3>el表达式获取常量</h3>
                    <%=123 %>
                    <%=123.123 %>
                    <%="abc" %>
                    <%=true %>
                    <hr/>
                    ${123 }
                    ${123.123 }
                    ${"abc" }
                    ${true }
                获取变量数据
                    <h3>el表达式获取变量</h3>
                     <%=request.getContextPath() %>
                     ${pageContext.request.contextPath}
                获取域中的属性
                    自动搜寻域
                    <%
                         pageContext.setAttribute("name", "朴大胖");
                         request.setAttribute("name","曹二胖");
                         session.setAttribute("name", "鑫三胖");
                         application.setAttribute("name", "李一瘦");
                      %>
                      <%=pageContext.findAttribute("name") %>
                       ${name}  
                    获取指定域的域属性
                         <h3>获取指定域中的域属性</h3>
                         ${pageScope.name }
                         ${requestScope.name }
                         ${sessionScope.name }
                         ${applicationScope.name }
                    删除指定域中数据后再次获取
                    <%
                         pageContext.setAttribute("name", "朴大胖");
                         request.setAttribute("name","曹二胖");
                         session.setAttribute("name", "鑫三胖");
                         application.setAttribute("name", "李一瘦");
                      %>
                    <%pageContext.removeAttribute("name",PageContext.PAGE_SCOPE); %>
                      ${name }
                获取数组
                    <h3>el获取数组</h3>
                     <%
                          String[] s = {"a","b","c"};
                          pageContext.setAttribute("s", s);
                     %>
                     ${s[0] } ${s[1] }
                获取链表 
                    <h3>el获取链表</h3>
                     <%
                          List l = new LinkedList();
                          l.add("abc");
                          l.add(123);
                          pageContext.setAttribute("l", l);
                     %>
                     ${l[0] }
                获取映射 
                    <h3>el获取映射</h3>
                    <%
                         Map map = new HashMap();
                         map.put("name", "caoyang");
                         map.put("height","180");
                         map.put("gender","male");
                         map.put("wife.first","小聋女");
                         pageContext.setAttribute("map", map);
                         pageContext.setAttribute("h", "height");
                    %>
                         ${map.name }
                         ${map["height"] }
                         ${map[h] }
                         ${map["wife.first"] }
                获取javabean对象
                    <h3>el表达式获取javabean</h3>
                    <%
                         Person p = new Person("lishuai",18,"bj");
                         pageContext.setAttribute("p", p);
                    %>
                         ${p.name }
                         ${p["age"] }
                         ${p["addr"] }
            b.执行运算
                关系运算
                    <h4>关系运算</h4>
                         ${3>2 }
                         ${3<2 }
                         ${3==2 }
                         ${3<=2 }
                         ${3>=2 }
                         ${3!=2 }
                逻辑运算
                    ${true or false }
                         ${true and false }
                         ${not(true) }
                         ${!true }
                         ${true && false }
                         ${true || false }
                算术运算
                    <h4>算术运算</h4>
                         ${3+2 }
                         ${3-2 }
                         ${3/2 }
                         ${3*2 }
                         ${3%2 }
                         ${3+"2" }
                         ${3-"2" }
                empty运算
                    <h4>empty运算</h4>
                    <h5>如果对象为null 字符串为空 集合数组没有任何元素 empty操作都会返回true,其他任何内容都会返回false</h5>
                         <%
                             String str = null;
                             pageContext.setAttribute("str", str);
                             String abc = "";
                             pageContext.setAttribute("abc", abc);
                             List list = new ArrayList();
                             //list.add("anc");
                             pageContext.setAttribute("list", list);
                             String[] arrs = {};
                             pageContext.setAttribute("arrs", arrs);
                         %>
                         ${empty str }
                         ${empty abc }
                         ${empty list }
                         ${empty arrs }
                三元表达式运算
                    <h4>el三元表达式</h4>
                         <%
                             List listx = new ArrayList();
                             listx.add("abc");
                             pageContext.setAttribute("listx", listx);
                          %>
                          ${empty listx?"yes":"no" }


            c.获取常用开发对象——el表达式内置的11个隐式对象
                代表作用域的隐式对象:
                    pageScope
                    requestScope
                    sessionScope
                    applicationScope
                代表请求头的隐式对象:
                    header可以获取指定名称的请求头的内容,结果存放在一个Map<String,String>
                    headerValues可以获取请求头的内容,结果存放在一个Map<String,String[]>
                代表请求参数
                    param 可以获取指定名称的请参数的内容,结果存放在一个Map<String,String>
                    paramValues可以获取请求参数的内容,结果存放在一个Map<String,String[]>
                代表初始化配置参数的隐式对象:
                    initParam 可以获取初始化配置参数,将结果存放在一个Map<String,String[]>
                代表cookie信息的隐式对象:
                    cookie可以获取cookie中指定名称的参数,将结果存放在一个Map<String cookieName,cookie>对象
                代表当前页面上下文的隐式对象:
                    pageContext 可以在整个页面内共享数据,结果存放在一个Map<String,Object>
    7.3 jstl标签库 !!!
        <c:set> 设置/修改属性
            设置/修改域中属性:
                <c:set var="a" value="abc" scope="request"></c:set>
                ${a}
                <c:set var="a" value="123" scope="request"></c:set>
                ${a}
            设置/修改map中属性:
                <%
                    Map map = new HashMap();
                    pageContext.setAttribute("map", map);
                 %>
                 <c:set target="${map }" property="name" value="lishuai"></c:set>
                 ${map.name}
                <c:set var="a" value="123" scope="request"></c:set>
                ${a}
                <h4>修改map属性</h4>
                <c:set target="${map }" property="name" value="caoyang"></c:set>
                ${map.name }
            修改javabean中属性值</h4>
                <%
                     Person p = new Person("caoyang",17,"ah");
                     pageContext.setAttribute("p", p);
                %>
                ${p.name }
                <br/>
                修改后:
                <c:set target="${p }" property="name" value="piaoqian"></c:set>
                ${p.name }

        <c:remove> 删除域属性/指定域属性
            <h3>c:remove删除域/指定域属性</h3>
            <c:set var="name" value="谢逊" scope="page"></c:set>
            <c:set var="age"  value="17" scope="page"></c:set>
            <c:set var="name" value="殷天正" scope="request"></c:set>
            <c:set var="name" value="韦一笑" scope="session"></c:set>
            <c:set var="name" value="黛绮丝" scope="application"></c:set>
            <c:remove var="name" scope="page" />
            ${pageScope.name }
            ${requestScope.name }
            ${sessionScope.name }
            ${applicationScope.name }
            <hr/>
            <c:remove var="name"/>
            ${pageScope.age }
            ${pageScope.name }
            ${requestScope.name }
            ${sessionScope.name }
            ${applicationScope.name }
        <c:if> 用于判断结构
            <h3>c:if用于判断结构</h3>
            <%
                pageContext.setAttribute("count", 100);
            %>
            <c:if test="${count == 100 }" var="f">
                count等于100
            </c:if>
            ${f }
            <c:if test="${count > 100 }" var="f1">
                count大于等于100
            </c:if>
            ${f1 }
        <c:choose> 选择判断结构
            <h3>c:choose选择判断结构</h3>
            <c:choose>
                <c:when test="${count <10 }">count小于10</c:when>
                <c:when test="${count <100 }">count大于等于10小于100</c:when>
                <c:when test="${count <1000 }">count大于等于100小于1000</c:when>
                <c:otherwise>count大于等于1000</c:otherwise>
            </c:choose>  
        <c:forEach> 循环遍历结构
            <h3>c:forEach  循环遍历</h3>
            <c:forEach begin="0" end="100" step="2" var="i">
                ${i }
            </c:forEach>
            <hr/>
            <%
                List list = new LinkedList();
                list.add("张无忌");
                list.add("张三丰");
                list.add("张飞");
                list.add("灭绝师太");
                pageContext.setAttribute("list", list);
            %>
            <c:forEach items="${list }" var="e"  step="2">
                 ${e }
            </c:forEach>
            <!-- 遍历0到一百之间的偶数 ,并且他们的总数下标为3的整数将这些数字变为红色-->
            <c:forEach begin="0" end="100" step="2" var="q" varStatus="stat">
                <c:if test="${stat.index%3 == 0 }">
                    <font color="red">${q }</font>
                </c:if>
                <c:if test="${stat.index%3 != 0 }">
                    <font color="blue">${q }</font>
                </c:if>
            </c:forEach>
        <c:forTokens> 用于切割字符串的标签。
            <c:forTokens items="www.tedu.cn" delims="." var="str">
                ${str }
            </c:forTokens>
        <c:catch> 用于捕获异常。
            <h3>c:catch捕获异常</h3>
            <c:catch var="exce">
                <%
                    String str = null;
                    str.toCharArray();
                %>
            </c:catch>
            ${exce }
    7.4自定义标签
        略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值