目录
JSP概述
JSP 介绍
由SUN公司提供的动态web资源的开发技术,看起来非常像html,但是可以在JSP页面中写java代码。
所以JSP是一种动态web资源开发技术。
JSP本质上就是一个Servlet。
思考:JSP技术产生的原因?(了解)
JSP的出现是为了解决Servlet在响应时不适合向外输出完整页面、以及解决html无法展示动态数据的问题
(1)Servlet本质上是一段java代码,非常适合处理逻辑,但是处理的结果不太适合由Servlet向外输出(不适合输出完整的html页面)。
(2)HTML是用于开发网页的一门技术,可以用来展示数据。但是HTML开发出来的页面本质上就是一个文档(静态资源),无法展示动态的数据。
(3)JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据。所以JSP的出现既可以解决Servlet不适合向外响应一个完整的页面又可以解决html无法展示动态数据的问题。
JSP 执行过程
通过浏览器访问一个JSP文件,很多人会误以为,服务器是直接将JSP文件响应给浏览器,浏览器直接解析JSP从而显示网页内容。
这个理解的错误的! 因为JSP中包含JSP特有的元素,并且其中可能会包含Java代码,这些内容浏览器是无法解析的。
JSP的执行过程图解:JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的网页内容,其实就是翻译后的Servlet在向外输出!

JSP语法
模版元素
直接写在jsp页面中的html内容称之为jsp页面中的模版元素
除了JSP特有的内容之外的其他内容都是模板元素
模版元素在翻译过来的Servlet中被out.write()原样输出到浏览器中

模版元素在JSP翻译后的Servlet中直接被out.write原样输出. 如下:

JSP 表达式
格式: <%= 表达式 %> 其中可以书写常量、变量、表达式。
作用: 执行表达式, 将结果再原样发送给浏览器
JSP表达式在翻译后的Servlet中是执行表达式的值再原样输出到浏览器,例如
(1)在JSP页面编写内容如下:
<%= request.getContextPath() %> <br/>
<%= "Hello...JSP..." %> <br/>
(2)在翻译后的Servlet中翻译如下:


JSP 脚本片段
格式:<% 若干java语句 %>
在翻译过来的servlet中,脚本片段中的Java代码被复制粘贴到对应的位置执行
翻译前:
<% for(int i=0; i<5; i++){ %>
Hello JSP~~~~~<br/>
<% } %>
翻译后:
for(int i=0; i<5; i++){
out.write("\r\n");
out.write("\t\tHello JSP~~~~~<br/>\r\n");
out.write("\t");
}
需要注意的是: 在某一个脚本片段中的java代码可以是不完整的,但是要求在翻译过来的servlet中整体的代码必须是完整符合java语法的.
<% //可以书写若干条Java语句
for(int i=0;i<5;i++){
out.write("Hello JSP<br/>");
}
//out相当于response.getWriter()
%>
<%-- 之所以可以按照下面的方式书写, 是因为在JSP翻译
后的Servlet中, 就没有脚本片段的区分了, 所以在JSP中
多个脚本片段之间的内容可以互相访问 --%>
<% for(int i=0;i<5;i++){ %>
Hello JSP<br/>
<% } %>
JSP 注释
格式: <%-- JSP注释 --%>
例如:<%-- out.write("aaa"); --%> 被JSP注释注释的内容,在翻译的过程中被抛弃,不会被翻译。
注意: 注释不能交叉嵌套!!
<% String name = "刘德华"; %>
<%= name %> ---> 输出刘德华
<%--
<% name = "马德华"; %>
--%>
<%= name %> ---> 输出刘德华
提示: 在JSP中最好还是使用JSP注释, 使用html注释可能会出现注释不了的情况:
<% String name1 = "刘德华"; %>
<%= name1 %> ---> 输出刘德华
<!--
<% name1 = "马德华"; %>
-->
<%= name1 %> ---> 输出马德华
JSP指令
JSP指令格式:<%@ 指令名称 若干属性声明... %>
JSP指令的作用:不会直接产生输出,JSP指令是用来指挥JSP解析引擎如何来翻译当前JSP页面中其他部分的内容(除指令意外的其他内容,例如模版元素、jsp表达式等)
- page指令
-- 用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般情况下最好放在JSP页面的最前面
格式: <%@ page ... %>
(1) <%@ page pageEncoding="UTF-8"%> -- 用来通知JSP解析引擎使用指定的编码来翻译JSP。如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致。
(2) <%@ page import="..."%> -- 为JSP翻译后的Servlet指定所依赖的jar包.例如:
<%@page import="java.util.Date"%>
<%@page import="java.io.File" %>
<%@page import="java.sql.DriverManager"%>
- include指令
-- 可以实现页面包含的效果,即页面的合并效果
格式:<%@ include file="" %>
- taglib指令
在使用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 <hr/>
${ 100+123 } ${ (23*54) > 1250 ? 23*54 : 1250 } <hr/>
<%
//声明一个变量name, 并将变量存入域中
String name = "张三";
request.setAttribute("name1", name);
%>
${ name1 }
在EL中书写变量, 会通过变量名(name1)到四个域中去
寻找指定名称(name1)属性值, 如果找到就返回属性值,
如果找不到, 就什么也不输出。
寻找时按照域的范围大小, 按照从小到大的顺序去寻找,
找到就输出,找不到就接着往后查找,最终还找不到,就
什么也不输出!
pageContext<request<session<application
(2)获取域中的数组或集合中的数据
<%
//声明一个数组,并将数组存入到域中
String[] names = {"刘德华","郭富城","张学友","黎明"};
request.setAttribute( "ns", names );
//下面通过EL获取域中数组中的元素
%>
${ ns[0] } <br/>
${ ns[1] } <br/>
${ ns[2] } <br/>
${ ns[3] } <br/>
(3)获取域中的map集合中的数据
<%
//声明一个Map集合,并将map集合存入到域中
Map map = new HashMap();
map.put("name", "阿凡达");
map.put("age", 20);
map.put("addr", "北京");
request.setAttribute( "map1", map );
%>
${ map1.name } <br/>
${ map1.age } <br/>
${ map1.addr } <br/>
(4)获取域中的JavaBean/POJO中的数据
<%
//创建一个Account对象, 并存入域中
Account acc = new Account(1, "john", 3000);
request.setAttribute("account", acc );
%>
${ account.getId() }
${ account.getName() }
${ account.getMoney() } <hr/>
<%-- 在EL中 对象.getXxx() 可以简化为 对象.xxx --%>
${ account.id }
${ account.name }
${ account.money } <hr/>
在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、<c:set></c:set> -- 往四大作用域中添加域属性,或者修改四大作用域中已有的属性
(1) 往四大作用域中添加一个域属性
<%-- request.setAttribute("name", "张三"); --%>
<c:set var="name" value="张三" scope="request"/>
${ name }
(2) 修改四大作用域中已有的属性
如果重复添加相同的属性,值会发生覆盖,相当于修改.
<c:set var="name" value="张三丰" scope="request"/>
${ name }
(3) 修改作用域中Map集合中的属性(了解)

c_set标签属性总结:
(1)var -- 指定存入作用域中的属性名称
(2)value -- 指定存入作用域中属性的值
(3)scope -- 指定将属性存入哪一个作用域中
可取值: a)page表示pageContext域 b)request表示request域
c)session表示session域 d)application表示ServletContext域
2、<c:if></c:if> -- 构造if…else…语句
<c:if test="${3>5}">yes</c:if>
<c:if test="${!(3>5)}">no</c:if>
test属性用于指定判断的条件,注意:JSTL中没有提供else对应的标签
3、<c:forEach></c:forEach> -- 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.
(1) 遍历域中数组或集合中的元素
<%
//声明一个数组, 并将数组存入域中
String[] names = {"王海涛","齐雷","陈子枢"};
request.setAttribute("names", names);
%>
<c:forEach items="${names}" var="name">
${ name }
</c:forEach>
(2) 遍历域中map集合中的元素
<%
//声明一个Map, 并将Map存入域中
Map map = new HashMap();
map.put("name", "关羽");
map.put("age", "38");
map.put("addr", "中鼎大厦B座");
request.setAttribute("map", map);
%>
<c:forEach items="${ map }" var="entry">
${ entry.key } : ${ entry.value } <br/>
</c:forEach>
(3) 遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中
<c:forEach begin="0" end="100" var="i" >
${ i%3==0? i : "" }
</c:forEach>
c_forEach标签属性总结:
(1)items: 指定需要遍历的集合或数组
(2)var: 指定用于接收遍历过程中的元素
(3)begin: 指定循环从哪儿开始
(4)end: 指定循环到哪儿结束
(5)step: 指定循环时的步长, 默认值是1
本文深入讲解JSP技术,包括其背景、执行流程、语法、标签技术及与EL、JSTL的配合使用,旨在帮助开发者掌握JSP动态网页开发。
2606

被折叠的 条评论
为什么被折叠?



