jsp 笔记

作者: 持续进步者 | 来源:发表于2016-10-22 22:11 被阅读51次

    jsp概述

    • jsp全称是 Java Server Page,它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。jsp实际上就是servlet
    • jsp = html+java
    • jsp 主要用于显示数据

    jsp 的原理

    翻译-> 编译 -> 执行
    demo.jsp 翻译成 _demo_jsp.java
    _demo_jsp.java 编译 _demo_jsp.class

    jsp作用

    • Servlet:控制器。重点编写java代码逻辑(获取表单数据,处理业务逻辑,分发转向)。
    • jsp: 代码显示模板,重点在于显示数据

    jsp的基本语法

    jsp模板元素

    • jsp 页面中的HTML内容称之为jsp模板元素。
    • jsp 模板元素定义了网页的骨架,即定义了页面的结构和外观。

    jsp脚本

    1,jsp 脚本片段

    语法
    <%
        //多行java代码
    %>
    <% 
        out.write("hello"); 
        out.write("142");
    %>
    
    注意
    • jsp 脚本片段只能初心java代码,不能出现其他模板元素,jsp引进在翻译jsp页面中,会将jsp脚步片段中的jva代码原封不动的放倒servlet中的_jspService方法中
    • jsp 脚本片段的java代码必须严格遵循java语法 每行语句结束要有(;).
    • 多个脚本之间的变量可以相互访问

    2 jsp表达式

    jsp用于将程序的数据输出到客户端

    语法
    <%=变量表达式%>
    <%=2+8 %>
    
    注意
    jsp表达式中的变量和表达式后面**不能有(;)**
    

    3,定义全局成员和静态块

    语法
    <%!  %>
    <%!
        int i=0;
    %>
    <%
        int j=0;
    %>
    <%
        out.write(" i= "+(i++)+"   j= "+(j++));
    %>
    
    注意
    i 是全局变量每次都会加1
    j 每次请求都会初始化
    

    jsp 注释

    • jsp注释<%-- 被注释的内容 --%> 特点:安全,省流量
    • 网页注释: 特点:不安全,费流量
    • 在查看源码时网页注释会显示出来 jsp注释不会显示

    jsp 三个指令

    jsp指令是为jsp引擎二设计的,他们并不直接产生任何输出,而只是告诉浏览器如何处理jsp页面的其余部分。在jsp2.0规范中定义了三个指令

    • page 指令
    • include指令
    • taglib 指令
    语法
    <%@ 指令 属性名1=“值1” 属性名2=“值2”  属性名3=“值3”>
    或者
    <%@ 指令 属性名1=“值1”%>
    <%@ 指令 属性名2=“值2”%>
    <%@ 指令 属性名3=“值3”%>
    
    <%@ page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
    

    1,page

    作用
    用于定义jsp页面的各种属性,page指令最好是放在整个jsp页面的起始位置。
    
    属性
    • 属性含义
    属性 定义
    language="java" 指定JSPContainer用什么语言来编译,目前只支持Java语言。默认为JAVA
    extends=”className” 定义此JSP网页产生的Servlet是继承哪个
    import=”importList” 定义此JSP网页要使用哪些Java API
    session = "true false" 决定此页面是否使用session对象,默认为ture
    buffer=”none size in kb” 决定输出流(Input stream)是否又缓冲区。默认为8kb
    isThreadSafe=”true false” 是否支持线程。默认为true
    errorPage=”url” 如果此页发生异常,网页会重新指向一个url
    isErrorPage=”true false” 表示此页面是否为错误处理页面。默认为false
    contentType=”text/html;charset=gb2312” 表示MIME类型和JSP的编码方式
    pageEncoding=”ISO-8859-1” 编码方式
    isELLgnored=”true false” 表示是否在此JSP页面中EL表达式。true则忽略,反之false则支持。默认为false
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"  errorPage="error.jsp" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        int i= 10/0;
    %>
    </body>
    </html>
    

    error.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>错误页面</title>
    </head>
    <body>
    errorMesg:
    <% out.write(exception.getMessage());%>
    
    </body>
    </html>
    

    web.xml配置error 页面
     <error-page>
      <error-code>500</error-code>
      <location>/error.jsp</location>
    </error-page>
    

    2,include

    • 静态包含:把其他资源包含到当前页面
      <% include file="/header.jsp"%>
      <% include file="/footer.jsp"%>

    • 动态包含
      <jsp:include page="/foorer"></jsp:include>

    • 两者的区别:翻译的时间段不同

      • 静态在翻译时就把两个文件合并
      • 动态不会合并文件,当代码执行到include时,才包含另外一个文件内容
      • 能用静态就不用动态

    header.jsp 
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    我是是头部
    

    index.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ include file="/header.jsp" %>
    我是内容
    <%@ include file="/footer.jsp" %>
    

    footer.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    我是底部
    
    </body>
    </html>
    

    3,taglib

    • 作用:在jsp页面中导入jstl标签库。替换jsp中的java代码片段
    • <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

    jsp 六个动作

    • 1,<jsp:include > 动态包含
    • 2,<jsp:forward> 请求转发
    • 3,<jsp:param> 设置请求参数
    • 4,<jsp:useBean> 创建一个对象
    • 5,<jsp:setProperty> 给指定的对象属性赋值
    • 6,<jsp:getProperty> 取出指定对象的属性值
    <jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean>
         <jsp:setProperty property="name" name="stu1" value="jerry"/>
         <jsp:getProperty property="name" name="stu1"/>
         
     <!-- http://localhost:8080/test.jsp?name=123 -->
     <jsp:forward page="/7.jsp">
        <jsp:param value="123" name="name"/>
        <jsp:param value="333" name="pwd"/>
     </jsp:forward>`
    

    jsp 9个内置对象

    • 指在jsp的<%= %> 和<% %> 中可以直接使用的对象
    对象名 类型 说明
    request javax.servlet.http.HttpServletRequest
    response javax.servlet.http.HttpServletResponse
    session javax.servlet.http.HttpSession 由session="true" 开关
    application javax.servlet.ServeletContext
    exception java.lang.Throwable 由 isErrorPage="false"开关
    out javax.servlet.jsp.JspWriter 字符串输出流,相当于PrintWriter对象
    page java.lang.Object 当前对象this 当前servlet实例
    pageContext javax.servlet.jsp.PageContext
    config javax.servlet.ServletConfig

    pageContext

    1, 本身也是一个域对象,他可以操作其他三个域对象(request session application)的数据
    • void setAttribute(String name,Object o);
    • Object getAttribute(String name);
    • void removeAttribute(String name);
    • 操作其它域对象的方法
    • void setAttribute(String name,Object o,int Scope);
    • Object getAttribute(String name,int Scope);
    • void removeAttribute(String name,int Scope);
    • scpoe的值:
    • PageContext.PAGE_SCOPE
    • PageContext.REQUEST_SCOPE
    • PageContext.SESSION_SCOPE
    • PageContext.APPLICATION_SCOPE
    • findAttribute(String name);自动从page request session application一次查找,找到了就取值,介乎查找

    ####### 例
    pageContext.setAttribute("test", "page",PageContext.PAGE_SCOPE);
    request.setAttribute("test", "request");
    session.setAttribute("test","session");
    application.setAttribute("test", "application");

    2,它可以创建其他的8个隐士对象
    <%
        pageContext.getSession();
        pageContext.getRequest()
        pageContext.getOut()
        //...
    %>
    
    3,提供了简易方法
    • pageContext.forward("2.jsp");
    • pageContext.include("2.jsp");

    四大域对象,开发中使用场景

    • PageContext:pageContext 数据存放在当前页面有效。开发时使用较小
    • ServletRequest: request 数据存放在一次请求(转发)内有效,使用非常多。
    • HttpSession: session 存放的数据在一次会话中有效,使用比较多。
    • ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,尽量少用

    EL的具体功能

    • 获取数据
    • 运算
    • 隐式对象:11个

    获取数据

    EL表达式只能获取存在4个作用域的数据
    ${u} 原理:pageContext.findAttribute("u");
    url>name=lihao 
    ${param.name}
    
    获取对于 null这样的数据,在页面中表现为空字符串
    点(.) 运算符相当于调用了getter方法,点后面跟的是属性名
    <% 
        Book book = new Book("1", "android 开发大全", 29, "王子阳");
        request.setAttribute("book",book);
    %>
    
    ${book.name }
    
    []运算符:点能做的,它也能做;他不能做的,点不一定能做
    ${book.name } === ${book['name'] } === ${book["name"] }
    

    运算

    empty
        判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
        <%
            String str = null;
            pageContext.setAttribute("str", str);
            
            String str1= "";
            pageContext.setAttribute("str1",str1);
            
            String str2="abc";
            pageContext.setAttribute("str2",str2);
            
            List<String> list1 = new ArrayList<String>();
            pageContext.setAttribute("list1", list1);
            
            List<String> list2 = new ArrayList<String>();
            list2.add("aa");
            pageContext.setAttribute("list2",list2);
    
        %>
        ${ empty str } -----true <br/>
        ${ empty str1 } -----true <br/>
        ${ empty str2 } -----false <br/>
        ${ empty list1 } -----true <br/>
        ${ empty list2 } -----false <br/>
        ${ empty str ? "str为空":"有值" }
    
        赋值 ${test = index+4 }
        取值 ${test}
    

    隐式对象

    EL 隐式对象引用名称 类型 jsp内置对象名称 说明
    pageContext javax.servlet.jsp.PageCOntext pageContent 一样的
    pageSope java.util.Map<String,Object> 没有对应的 pageContext返回中存放的数据,页面范围
    requestScope java.util.Map<String,Object> 没有对应的 请求范围数据
    sessionScope java.util.Map<String,Object> 没有对应的 会话范围数据
    applicationScope java.util.Map<String,Object> 没有对应的 应用范围数据
    param java.util.Map<String,Object> 没有对应的 一个请求参数
    paramValues java.util.Map<String,Object> 没有对应的 重名请求参数
    header java.util.Map<String,Object> 没有对应的 一个请求消息头
    initParam java.util.Map<String,Object> 没有对应的 web.xml中全局参数
    cookie java.util.Map<String,Object> 没有对应的 key:cookie对象的name值

    jstl

    • jstl 是什么
    • jstl 解决什么问题
    • jstl 如何使用

    jstl 是什么

    jstl(JSP Standard Tag Library,JSP标准**标签库**)是一个不断完善的开放源代码的jsp标签库,是由apache的jakarta小组来维护的。
    

    jstl 解决什么问题

    处理jsp 页面的逻辑处理。比如判断,循环等。
    

    jstl 如何使用

    在jsp页面添加taglib指令才能使用jstl标签
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="core"%>
    使用  jstl标签  
    
    语法 <prefix:命令 test=""></prefix:命令>
    <core:if test="${num>3}"></core:if>
    

    常用标签
    通用标签 set out remove
    设置变量:<core:set var="num" value="${10+5 }" scope="page"></core:set>
    输出数据:<core:out value="${num }"></core:out>
    移除变量:<core:remove var="num"/><br/>
    移除后输出设置默认值: <core:out value="${num }" default="默认值"></core:out>
    
    条件标签 if choose(switch)
    <%
        pageContext.setAttribute("num", 5);
        pageContext.setAttribute("index", 5);
    %>
    
    • if
      <core:if test="${num>3}"> ${num} </core:if>
    • choose
    <core:choose>
        <core:when test="${num==1 }">
        num = 1
    </core:when>
        <core:when test="${num==2 }">
        num=2
    </core:when>
        <core:when test="${num==3 }">
        num=3
    </core:when>
        <core:when test="${num==5 }">
        num =5
    </core:when>
        <core:otherwise>
        默认值
    </core:otherwise>
    </core:choose>
    
    迭代器 foreach
    • 普通循环

      • var 声明变量

      • begin 初始化

      • end 结束条件

      • step 步长
        <core:forEach var="i" begin="1" end="10" step="2">
        ${i }

        </core:forEach>

    • 循环数据

      • items 获取到集合
      • varStatus 元素的信息
      • var 单个数据
    例1
    <%
        List<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("cccc");
        pageContext.setAttribute("list", list);
    
        Map<String, String> map = new HashMap<String, String>();
        map.put("a", "A");
        map.put("b", "B");
        map.put("c", "C");
        map.put("d", "D");
        map.put("e", "E");
        pageContext.setAttribute("map", map);
    %>
    <core:forEach items="${list }" var="l">
        ${l }
    </core:forEach>
    
    例2
    <table border="1px">
        <tr>
            <th>key</th>
            <th>内容</th>
            <th>索引</th>
            <th>计数</th>
            <th>是否第一个</th>
            <th>是否最后一个</th>
        </tr>
    <core:forEach items="${map }" var="m" varStatus="vs">
    
        <tr>
            <td>${m['key'] }</td>
            <td>${m['value'] }</td>
            <td>${vs.index }</td>
            <td>${vs.count }</td>
            <td>${vs.first }</td>
            <td>${vs.last }</td>
        </tr>
    </core:forEach>
    
    </table>
    

    相关文章

      网友评论

        本文标题:jsp 笔记

        本文链接:https://www.haomeiwen.com/subject/dpvhuttx.html