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

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>

猜你喜欢

转载自blog.csdn.net/qq_45083975/article/details/92676700
今日推荐