您的位置:首页 > Web前端 > JavaScript

web开发(九)JSP技术、EL表达式、JSTL标签库

2019-06-17 18:48 155 查看

JSP技术

JSP称为Java的动态服务器端网页技术,(Java Server Page).

Java程序直接嵌入到了HTML中,页面称为jsp页面

Java嵌入HTML方式

<% java代码 %> :在方法中写代码(局部位置)

<%! java代码 %>:在成员位置写代码(成员位置)

<%= java代码 %> :向页面中输出数据(IO流技术) 相当于:System.out.println(“在控制台输出”)

代码演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- < % java代码 %> :在方法中写代码(局部位置) -->
<%
//相当于在java的局部位置写代码(方法中)
int a = 10;
String s = "abc";
//System.out.println(a);
//System.out.println(s);
%>

<!-- < %! java代码 %>:在成员位置写代码(成员位置) -->
<%!
/*
我是一个成员变量
*/
double d = 5.5;
%>

<!-- < %= java代码 %> :向页面中输出数据(IO流技术) System.out.println("在控制台输出") -->
<%-- jsp页面特有的注释,只在jsp页面的文件中可以看到--%>
<%=a%>
<%=s%>
<%=d%>

</body>
</html>

JSP页面的执行原理

jsp页面,执行的时候被转成.java文件,编译为.class

转换后目录:

C:\Users\xxx.IntelliJIdea2017.3\system\tomcat_xx\work\Catalina\localhost\web04\org\apache\jsp\jsp

D:\develop\tomcat\apache-tomcat-8.5.32\work\Catalina\localhost\web04\org\apache\jsp\jsp

JSP本质就是Servlet,使用service方法获取请求,回复响应

JSP中的注释

  • <!-- HTML中的注释 -->
    JSP中存在,翻译后的.java存在,在浏览器中右键查看源代码存在

  • <% // /* Java自己注释%> JSP中存在,翻译后的.java存在,在浏览器中右键查看源代码没有

  • <%-- JSP特有注释 --%> 只在JSP源代码中出现

脚本片段使用注意事项

  • 脚本片段可以分开书写,最终是组合在一起的,示例:

jsp代码演示(循环打印五次Hello World!!!):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书写java代码的三种方式</title>
</head>
<body>
<%-- 脚本片段 --%>
<% for(int j = 0 ; j < 5 ;j++){%>
Hello World!!!<br>
<%}%>
</body>
</html>
效果:

JSP九大内置对象

  • request
  • response
  • ServletContext对象,在JSP写对象,只能写 application
  • ServletConfig对象,在JSP写对象,只能写config
  • HttpSession session:域对象存储数据,作用域只要浏览器不关闭,数据就一直有效(默认值30分钟)
  • JspWriter out:字符输出流 ,可以在jsp页面中输出数据
  • Object page:当前对象,就是当前的Servlet,就是this
  • pageContext 最小域对象,作用范围是当前页面
  • exception异常:在页面中输出异常信息

注意:

JSP页面中有一个内置对象pageContext:作为域对象使用

EL表达式有一个内置对象pageContext:获取JSP页面的9大内置对象(request对象)

EL表达式中 pageContext.request:获取JSP的内置对象request

注意这两个pageContext不是一个同一个,相当于java中同名但是不同包的类(Date)

cookie内置对象,获取浏览器中的Cookie数据(了解)

cookie.cookie的键名.value

EL表达式

EL表达式介绍

EL表达式语言,直接出现JSP页面中

EL表达式可以减少<% %>书写,比如上面的循环打印五次Hello World!!!

EL作用: 从域对象取出数据

语法 ${ el表达式的代码 }

作用域范围:(下面是按作用域由大到小排名)

  1. ServletContext:作用域时整个web项目;即这个web项目里的所有Servlet都可以访问。
  2. Session:只要浏览器不关闭就有效。就算是访问不同的虚拟地址也可以。但只能保留30分钟。
  3. Request:只要是地址栏不变,不刷新,就有效,即只能请求一次。转发也有效。但是重定向就无效了。因为转发的地址栏不变,重定向的地址栏发生变化了。
  4. PageContext:只在jsp本页面有效。

EL取出域对象数据

  • application.setAttribute(String key,Object value) EL取出 ${applicationScope.key}
  • session.setAttribute(String key,Object value)
      EL取出 ${sessionScope.key}
  • request.setAttribute(String key,Object value)
      EL取出 ${requestScope.key}
  • pageContext.setAttribute(String key,Object value)
      EL取出 ${pageScope.key}
  • 简化写法 ${key} : EL自动从最小域开始找,一旦找到就不找
  • EL取出域对象数据(String对象)

    <body>
    <%--
    EL表达式取出域对象中的数据
    向域对象存储数据
    EL取出
    
    EL取出不出来,不显示null,显示""
    --%>
    <%
    //ServletContext域对象存储数据
    application.setAttribute("hello","javaApplication");
    //session域对象存储数据
    session.setAttribute("hello","javaSession");
    //request域对象存储数据
    request.setAttribute("hello","javaRequest");
    //pageContext域对象存储数据
    pageContext.setAttribute("hello","javaPageContext");
    %>
    <%-- 取出 ServletContext--%>
    <%=application.getAttribute("hello")%>
    ${applicationScope.hello}  <br>
    
    <%-- 取出 session--%>
    ${sessionScope.hello} <br>
    
    <%-- 取出 request--%>
    ${requestScope.hello}<br>
    
    <%-- 取出 pageContext--%>
    ${pageScope.hello} <br>
    
    ${hello}
    
    </body>

    EL取出域对象数据(自定义对象)

    格式:

    ${对象.成员变量}
    public class Address {
    private String city;
    private String area;
    //构造方法(空参、有参),set/get方法,toString方法。自动生成
    }
    
    public class User {
    private String name;
    private int age;
    private Address addr;
    //构造方法(空参、有参),set/get方法,toString方法。自动生成
    }
    <body>
    <%--
    向域对象存储自定义对象
    EL表达式取出来
    --%>
    <%
    //创建Addr对象,并赋值
    Addr addr = new Addr("北京","昌平");
    
    //创建User对象,并赋值
    User user = new User();
    user.setName("张三");
    user.setAge(20);
    user.setAddr(addr);
    //存储域对象,                    Object参数
    pageContext.setAttribute("user",user);
    %>
    
    <%-- 取出域对象中存储的user对象--%>
    <%-- 因为pageContext.setAttribute第二个参数就是Object类型,所以要强转--%>
    <%=((User)session.getAttribute("user")).getName()%><br/>
    <%=((User)session.getAttribute("user")).getAge()%><br/>
    <%=((User)session.getAttribute("user")).getAddr()%><br/>
    <%=((User)session.getAttribute("user")).getAddr().getCity()%><br/>
    <%=((User)session.getAttribute("user")).getAddr().getArea()%>
    <hr/>
    
    <%--
    取出EL
    EL使用无需强制转换
    EL获取成员变量,不需要调用getXXX()方法
    自己会调用,直接写成员变量名即可
    --%>
    <%--
    使用EL表达式取出域对象中存储的user对象
    ${key}-->${user}:取出的对象就是User对象
    ${对象名.属性名}-->${user.name}:取出属性的方式对象名.属性,默认会调用get方法取出属性的值
    --%>
    ${user}<br/>
    ${user.name}<br/>
    ${user.age}<br/>
    ${user.addr}<br/>
    ${user.addr.city}<br/>
    ${user.addr.area}
    </body>

    EL取出域对象数据(自定义对象存储List)(单列集合)

    格式:

    ${List集合对象[角标]}

    代码演示

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>Title</title>
    </head>
    <body>
    <%-- 存储List<String>数据 --%>
    <%
    List<String> strList = new ArrayList<String>();
    strList.add("aaa");
    strList.add("bbb");
    strList.add("ccc");
    //把list01集合存储到域对象中     Object
    request.setAttribute("strList",strList);
    %>
    
    <%--取出域对象中存储的集合--%>
    <%=pageContext.getAttribute("list01")%><br/>
    <%=((ArrayList<Integer>)pageContext.getAttribute("list01")).get(1)%>
    <hr/>
    <%--
    使用EL表达式取出域对象中存储的集合
    ${集合的key}:取出的集合就是集合类型,不用强转
    ${集合的key[索引]}:取出集合中的元素
    --%>
    ${list01}<br/>
    ${list01[1]}
    </body>
    </html>
    <body>
    <%--
    向域对象存储自定义对象
    EL表达式取出来
    --%>
    <%
    Address addr = new Address();
    Addr addr =  new Addr("北京","昌平");
    
    User user = new User();
    user.setName("张三");
    user.setAge(20);
    user.setAddr(addr);
    
    Address addr2 = new Address();
    addr2.setCity("天津");
    addr2.setArea("武清");
    
    User user2 = new User("李四" , 22 ,addr2);
    
    ArrayList<User> list = new ArrayList<User>();
    list.add(user);
    list.add(user2);
    
    //把list集合存储到域对象中
    pageContext.setAttribute("list",list);
    %>
    
    <%--取出域对象中存储list集合--%>
    <%=(ArrayList<User>)request.getAttribute("list")%><br>
    <%=((ArrayList<User>)request.getAttribute("list")).get(0)%><br>
    <%=((ArrayList<User>)request.getAttribute("list")).get(0).getName()%>
    <%=((ArrayList<User>)request.getAttribute("list")).get(0).getAddr().getArea()%>
    <hr/>
    
    <%--使用EL表达式取出域对象中存储list集合--%>
    ${list}<br>
    ${list[0]}<br>
    ${list[0].name}<br>
    ${list[0].addr.area}<br>
    </body>

    EL取出域对象数据(自定义对象存储Map)(双列集合)

    格式:

    ${Map集合对象.key.成员变量}
    或
    ${Map集合对象[key].成员变量}
    <body>
    <%--
    EL取出域对象数据(自定义对象存储Map)
    --%>
    <%
    Map<String,String> map = new HashMap<>();
    map.put("迪丽热巴","165");
    map.put("古力娜扎","168");
    map.put("马尔扎哈","185");
    //把map集合存储到域对象中      Object
    pageContext.setAttribute("map",map);
    %>
    <%--取出域对象中存储的map集合--%>
    <%=pageContext.getAttribute("map")%><br/>
    <%=((Map<String,String>)pageContext.getAttribute("map")).get("古力娜扎")%>
    <hr/>
    <%--
    使用EL表达式取出域对象中的map集合
    ${map}:取出的就是Map集合不需要强转
    ${map.key}
    ${map["key"]}
    --%>
    ${map}<br/>
    ${map.古力娜扎}<br/>
    ${map["古力娜扎"]}
    <hr/>
    <%
    Map<String,User> map2 = new HashMap<>();
    Addr a1 =  new Addr("北京","昌平");
    User u1 = new User("柳岩",18,a1);
    Addr a2 =  new Addr("北京","海淀");
    User u2 = new User("唐嫣",18,a2);
    map2.put("u1",u1);
    map2.put("u2",u2);
    
    //把map2存储到域对象中          Object
    application.setAttribute("map2",map2);
    %>
    
    <%--取出域对象中存储的map2集合--%>
    <%=application.getAttribute("map2")%><br/>
    <%=((Map<String,User>)application.getAttribute("map2")).get("u2")%><br/>
    <%=((Map<String,User>)application.getAttribute("map2")).get("u2").getName()%><br/>
    <%=((Map<String,User>)application.getAttribute("map2")).get("u2").getAddr().getArea()%><br/>
    <hr/>
    
    <%--使用EL表达式取出域对象中存储的map2集合--%>
    ${map2}<br/>
    ${map2.u2}<br/>
    ${map2["u2"]}<br/>
    ${map2.u2.name}<br/>
    ${map2.u2.addr.area}<br/>
    </body>

    EL内置对象

    内置对象,这个对象内置在EL中,直接使用

    • pageContext内置对象:是EL的内置对象,可以获取其他的JSP内置对象 pageContext.request:获取JSP的内置对象request
    <body>
    <%--
    内置对象
    pageContext 属于JSP的内置对象,最小域对象
    
    pageContext 属于EL内置对象
    可以获取到其他的JSP内置对象
    
    pageContext.request 获取到了JSP中的内置对象request
    
    <form action=" ${pageContext.request.contextPath} "></form>
    
    cookie内置对象,获取浏览器中的Cookie数据
    cookie.cookie的键名.value
    --%>
    ${pageContext.request.contextPath}
    ${cookie.JSESSIONID.value}
    </body>

    EL运算符

    1. 算数运算符 + - * / %
    2. 逻辑运算符 && || !
    3. 比较运算符 > < >= <=
    4. Null运算符 empty
    5. 三元运算符
    <body>
    <%--
    El运算符
    --%>
    ${3==3}<br>
    ${3>=4}<br>
    ${3<5}<br>
    ${3!=3}<br>
    ${3+4}<br>
    ${3==3&&3<4}<br>
    ${3==5||3>4}<br>
    
    <%
    pageContext.setAttribute("num",4);
    %>
    
    ${num>4?"大于4":"不大于4"}  <br>
    
    <%--
    EL判空运算
    empty 判断空
    如果是空,就是true
    
    数组长度>0,就不是空
    长度.length==0
    
    集合size()>0,就不是空
    --%>
    <%
    String[] str = new String[1];
    request.setAttribute("str",str);
    %>
    
    ${ empty str} <br>
    
    <%
    List<String> list = new ArrayList<String>();
    list.add(null);
    request.setAttribute("list",list);
    %>
    ${empty list}
    ${!empty list}
    </body>

    JSTL标签库

    引出JSTL

    <body>
    <%--
    定义两个div
    一个文本显示红色
    一个文本显示蓝色
    定义变量
    判断变量的值>5,显示红色的div
    判断变量的值<=5,显示蓝色的div
    --%>
    <%
    int num =6;
    if(num>5){
    %>
    <div style="color: red">文本是红色</div>
    <%
    }else{
    %>
    
    <div style="color: blue">文本是蓝色</div>
    <%
    }
    %>
    </body>

    JSTL标签库介绍

    jstl标签的基本概述

    JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要替换jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库Core

    本质上是标签,HTML也是标签

    JSTL标签出现目的:减少<%%>

    jsp页面中 < c:if > 就是jstl的核心库的标签名称 < if > html标签

    标签库 标签库的URI 前缀
    Core http://java.sun.com/jsp/jstl/core c
    I18N http://java.sun.com/jsp/jstl/fmt fmt
    SQL http://java.sun.com/jsp/jstl/sql sql
    XML http://java.sun.com/jsp/jstl/xml x
    Functions http://java.sun.com/jsp/jstl/functions fn

    jstl标签的安装

    导入jar包

    javax.servlet.jsp.jstl.jar
    jstl-impl.jar

    使用taglib指令在jsp页面导入要使用的jstl标签库

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    if标签

    c:if标签:判断使用,没有else
    属性: test=true 执行标签体内容

    <body>
    <%--
    c:if标签,判断使用
    属性: test="true"
    执行标签体内容
    
    --%>
    <%
    pageContext.setAttribute("num",4);
    %>
    <c:if test="${num>=5}">
    <div style="color: red">我是红色</div>
    </c:if>
    
    <c:if test="${num<5}">
    <div style="color: blue">我是蓝色</div>
    </c:if>
    </body>

    foreach标签

    c:forEach 作为普通for循环使用,

    作用:用于遍历数组和集合
    属性:
    for(int i=1; i<=5; i++){ }
    属性:
    begin =“1”
    就相当于int i=1
    end =“5”
    就相当于 i<=5
    var =“i”
    用于记录循环遍历的值,会被自动的存储在pageContext域对象中(使用EL取出来)
    step =“2”
    步长 i+=2,不写默认 i++

    <body>
    
    <%--打印5次HelloWorld--%>
    <c:forEach begin="1" end="5">
    HelloWorld<br/>
    </c:forEach>
    <hr/>
    
    <c:forEach begin="1" end="5" var="i">
    HelloWorld ${pageScope.i}<br/>
    </c:forEach>
    <hr/>
    
    <%--打印3次HelloWorld--%>
    <c:forEach begin="1" end="5" var="i" step="2">
    HelloWorld ${i}<br/>
    </c:forEach>
    </body>
    c:forEach 作为增强for循环使用

    作用:用于遍历数组和集合
    for(String s : arr/list){ }
    属性:
    items= " ${数组名/集合名} "
    var=“变量名”
    用来获取数组/集合中元素,会被自动存储在pageContext域对象中(使用EL表达式取出)
    varStatus=" i "
    使用varStatus里边的属性count用来记录循环的次数

    <body>
    
    <%
    int[] arr = {1,2,3,4,5,6};
    //把数组存储到域对象中
    pageContext.setAttribute("arr",arr);
    %>
    <%--使用增强for循环遍历数组--%>
    <c:forEach items="${arr}" var="s">
    ${s}<br/>
    </c:forEach>
    <hr/>
    
    <%
    ArrayList<String> list01 = new ArrayList<>();
    list01.add("貂蝉");
    list01.add("西施");
    list01.add("王昭君");
    list01.add("杨贵妃");
    //把list01集合存储到域对象中
    pageContext.setAttribute("list01",list01);
    %>
    <%--使用增强for循环遍历list01集合--%>
    <c:forEach items="${list01}" var="s" varStatus="i">
    ${s} ${i.count}<br/>
    </c:forEach>
    <hr/>
    
    <%
    ArrayList<Addr> list02 = new ArrayList<>();
    list02.add(new Addr("北京","昌平"));
    list02.add(new Addr("北京","朝阳"));
    list02.add(new Addr("北京","海淀"));
    list02.add(new Addr("北京","东城"));
    //把list02集合存储到域对象中
    request.setAttribute("list02",list02);
    %>
    <%--使用增强for循环遍历list02集合--%>
    <c:forEach items="${list02}" var="addr">
    <%--${addr}<br/>--%>
    ${addr.area}<br/>
    </c:forEach>
    </body>
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: