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}
- 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运算符
- 算数运算符 + - * / %
- 逻辑运算符 && || !
- 比较运算符 > < >= <=
- 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>