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表达式的代码 }
作用域范围:(下面是按作用域由大到小排名)
- ServletContext:作用域时整个web项目;即这个web项目里的所有Servlet都可以访问。
- Session:只要浏览器不关闭就有效。就算是访问不同的虚拟地址也可以。但只能保留30分钟。
- Request:只要是地址栏不变,不刷新,就有效,即只能请求一次。转发也有效。但是重定向就无效了。因为转发的地址栏不变,重定向的地址栏发生变化了。
- PageContext:只在jsp本页面有效。
EL取出域对象数据
- application.setAttribute(String key,Object value) EL取出 ${applicationScope.key}
-
EL取出 ${sessionScope.key}
-
EL取出 ${requestScope.key}
-
EL取出 ${pageScope.key}
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运算符
- 算数运算符 + - * / %
- 逻辑运算符 && || !
- 比较运算符 > < >= <=
- Null运算符 empty
- 三元运算符
<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>
- EL表达式----JSP11个隐式对象----EL函数----JSTL核心标签if,foreach
- 18、EL表达式、JSP标签、JSTL标签、自定义标签
- jsp版本2.1 servlet版本2.5 el表达式、jstl标签学习以及自定义标签(用标签实现业务逻辑和jsp页面的分离)
- jsp,el表达式,jstl标准标签库
- JSP页面中EL表达式语言和jstl标签库的使用详解
- java web javaEE ,jsp EL表达式和JSTL标签if-else if-else四种用法
- JSP基础:六、EL表达式、JSTL标签和乱码解决
- JSP中的EL表达式和JSTL标签库
- JavaWeb12-JSP, EL表达式,JSTL标签
- jstl标签技术(jsp standard tag library:jsp标准标签库)
- java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库
- Servlet,JSP,过滤器和监听器,四个作用域和九个内置对象,EL表达式语言,自定义标签,JSTL
- JSP页面JSTL提供的函数标签EL表达式操作字符串的方法
- 【郭林专刊】JSP中JSTL提供的函数标签EL表达式操作字符串的方法
- JSP和El表达式和JSTL标签库使用
- IT忍者神龟之jsp标签、EL表达式、JSTL标签、函数、自定义标签
- jsp脚本、jsp标准动作、EL表达式、JSTL标签
- jsp中的el表达式和jstl标签模拟循环输出数据库中的数据
- 【郭林专刊】JSP中JSTL提供的函数标签EL表达式操作字符串的方法
- 【第47天】EL表达式、JSTL标签(c标签)、JSP的分页