目录
JSP概述 JSP 介绍
由SUN公司提供的动态web资源的研发科技,看起来非常像html懂球帝APP,但是可以在JSP页面中写java代码。
所以JSP是一种动态web资源研发科技。
JSP本质上就是一个Servlet。
思考:JSP技术造成的缘由?(了解)
JSP的发生是为了缓解Servlet在响应时不合适向外输出完整页面、以及解决html无法展现动态数据的问题
(1)Servlet本质上是一段java代码懂球帝,非常合适处理逻辑,但是处理的结果不太适合由Servlet向外输出(不合适输出完整的html页面)。
(2)HTML是用于研发网页的一门技术jsp网页,可以拿来展示数据。但是HTML开发起来的页面本质上就是一个文档(静态资源),无法展现动态的数据。
(3)JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展现动态的数据。所以JSP的发生又可以缓解Servlet不适宜向外响应一个完整的页面又可以解决html无法展现动态数据的问题。
JSP 执行过程
通过浏览器访问一个JSP文件,很多人会误以为,服务器是直接将JSP文件响应给浏览器,浏览器直接解读JSP从而显示网站内容。
这个理解的出错的! 因为JSP中包括JSP特有的元素,并且其中可能会包含Java代码,这些内容浏览器是能够解读的。
JSP的执行过程图解:JSP在第一次访问时jsp网页,会被翻译成一个Servlet懂球帝,对JSP访问后发现的网站内容懂球帝懂球帝,其实就是翻译后的Servlet在向外输出!
JSP语法 模版元素
直接写在jsp页面中的html内容称之为jsp页面中的模板元素
除了JSP特有的内容之外的其它内容都是模板元素
模版元素在翻译过来的Servlet中被out.write()原样输出到浏览器中
模版元素在JSP翻译后的Servlet中直接被out.write原样输出. 如下:
JSP表达式
格式: 其中可以书写常量、变量、表达式。
作用: 执行表达式, 将结果再原样发送给浏览器
JSP表达式在翻译后的Servlet中是执行表达式的值再原样输出到浏览器,例如
(1)在JSP页面编写内容如下:
<%= request.getContextPath() %>
<%= "Hello...JSP..." %>
(2)在翻译后的Servlet中翻译如下:
JSP脚本片段
格式:
在翻译过来的servlet中,脚本片段中的Java代码被复制粘贴至对应的位置执行
翻译前:
<% for(int i=0; i<5; i++){ %>
Hello JSP~~~~~
<% } %>
翻译后:
for(int i=0; i<5; i++){
out.write("\r\n");
out.write("\t\tHello JSP~~~~~
\r\n");
out.write("\t");
}
需要注意的是: 在某一个类库片段中的java代码可以是不完整的,但是要求在翻译过来的servlet中整体的代码需要是完整符合java语法的.
<% //可以书写若干条Java语句
for(int i=0;i<5;i++){
out.write("Hello JSP
");
}
//out相当于response.getWriter()
%>
<%-- 之所以可以按照下面的方式书写, 是因为在JSP翻译
后的Servlet中, 就没有脚本片段的区分了, 所以在JSP中
多个脚本片段之间的内容可以互相访问 --%>
<% for(int i=0;i<5;i++){ %>
Hello JSP
<% } %>
JSP 注释
格式:
例如: 被JSP注释注释的内容jsp网页,在翻译的过程中被放弃,不会被翻译。
注意: 注释不能交叉嵌套!!
<% String name = "刘德华"; %>
<%= name %> ---> 输出刘德华
<%--
<% name = "马德华"; %>
--%>
<%= name %> ---> 输出刘德华
提示:在JSP中最好还是使用JSP注释,使用html注释可能会出现注释不了的状况:
<% String name1 = "刘德华"; %>
<%= name1 %> ---> 输出刘德华
<%= name1 %> ---> 输出马德华
JSP指令
JSP指令格式:
JSP指令的作用:不会直接造成输出,JSP指令是用来指挥JSP解析引擎如何来翻译当前JSP页面中其它个别的内容(除指令意外的其它内容,例如模版元素、jsp表达式等)
-- 用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般状况下最好放在JSP页面的最前面
格式:
(1) -- 用来通知JSP解析引擎使用选定的编码来翻译JSP。如果想避免JSP乱码,应该应确保JSP文件储存时的编码和pageEncoding指定的编码保持一致。
(2) -- 为JSP翻译后的Servlet指定所依赖的jar包.例如:
<%@page import="java.util.Date"%>
<%@page import="java.io.File" %>
<%@page import="java.sql.DriverManager"%>
-- 可以实现页面包括的效果,即页面的合并效果
格式:
在使用JSTL标签库中的标签时, 在当前JSP中要启用JSTL标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix值可以为任意,但使用JSTL标签库时应用该值作为标签名
需要注意: 在启用之前还必须导入JSTL相关的jar包
JSP 标签技术
在JSP页面中读取大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会导致页面比较的错乱,难于维护。
于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来替代JSP页面中java代码,并且推荐,JSP2.0之后不要在JSP页面中出现任何一行java代码。
EL表达式
格式: ${常量、表达式、变量}变量应该得事先存入域中
作用:主要作用是从域中获得数据,并输出
(1)获取常量、表达式或函数的值(变量应该的现存入域中)
${ "Hello EL" } Hello EL
${ 100+123 } ${ (23*54) > 1250 ? 23*54 : 1250 }
<%
//声明一个变量name, 并将变量存入域中
String name = "张三";
request.setAttribute("name1", name);
%>
${ name1 }
在EL中书写变量, 会通过变量名(name1)到四个域中去
寻找指定名称(name1)属性值, 如果找到就返回属性值,
如果找不到, 就什么也不输出。
寻找时按照域的范围大小, 按照从小到大的顺序去寻找,
找到就输出,找不到就接着往后查找,最终还找不到,就
什么也不输出!
pageContext
(2)获取域中的字段或集合中的数据
<%
//声明一个数组,并将数组存入到域中
String[] names = {"刘德华","郭富城","张学友","黎明"};
request.setAttribute( "ns", names );
//下面通过EL获取域中数组中的元素
%>
${ ns[0] }
${ ns[1] }
${ ns[2] }
${ ns[3] }
(3)获取域中的map集合中的数据
<%
//声明一个Map集合,并将map集合存入到域中
Map map = new HashMap();
map.put("name", "阿凡达");
map.put("age", 20);
map.put("addr", "北京");
request.setAttribute( "map1", map );
%>
${ map1.name }
${ map1.age }
${ map1.addr }
(4)获取域中的JavaBean/POJO中的数据
<%
//创建一个Account对象, 并存入域中
Account acc = new Account(1, "john", 3000);
request.setAttribute("account", acc );
%>
${ account.getId() }
${ account.getName() }
${ account.getMoney() }
<%-- 在EL中 对象.getXxx() 可以简化为 对象.xxx --%>
${ account.id }
${ account.name }
${ account.money }
在EL中借助对象.xxx,例如:
${ account.id }底层代码虽然调用的是account.getId()方法
${ account.name }底层代码虽然调用的是account.getName()方法
JSTL标签库
STL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;
JSTL标签库和EL配合使用替代JSP中大部分的Java代码;
在使用JSTL标签库之前,需要进行下面操作:
(1)需要在项目中导入JSTL的jar包
(2)需要在使用JSTL标签库的jsp中借助taglib指令引入JSTL标签库
其中常用的标签如下:
1、--往四大作用域中添加域属性,或者更改四大作用域中已有的属性
(1)往四大作用域中添加一个域属性
<%-- request.setAttribute("name", "张三"); --%>
${ name }
(2)修改四大作用域中已有的属性
如果重复添加同样的属性,值会出现覆盖,相当于修改.
${ name }
(3) 修改作用域中Map集合中的属性(了解)
c_set标签属性总结:
(1)var --指定存入作用域中的属性名称
(2)value --指定存入作用域中属性的值
(3)scope --指定将属性存入哪一个作用域中
可取值: a)page表示pageContext域b)request表示request域
c)session表示session域d)application表示ServletContext域
2、 --构造if…else…语句
yes
no
test属性用于指定判断的条件,注意:JSTL中没有提供else对应的标签
3、 --对集合或变量等中元素进行循环遍历或者是执行指定数量的循环.
(1)遍历域中字符或集合中的元素
<%
//声明一个数组, 并将数组存入域中
String[] names = {"王海涛","齐雷","陈子枢"};
request.setAttribute("names", names);
%>
${ name }
(2)遍历域中map集合中的元素
<%
//声明一个Map, 并将Map存入域中
Map map = new HashMap();
map.put("name", "关羽");
map.put("age", "38");
map.put("addr", "中鼎大厦B座");
request.setAttribute("map", map);
%>
${ entry.key } : ${ entry.value }
(3)遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中
${ i%3==0? i : "" }
c_forEach标签属性总结:
(1)items:指定需要枚举的集合或变量
(2)var:指定用于接收遍历过程中的元素
(3)begin:指定循环从哪儿开始
(4)end:指定循环至哪儿结束
(5)step:指定循环时的步长,默认值是1