JSP

1.1JSP介绍
由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无法展示动态数据的问题。
1.2JSP执行过程
通过浏览器访问一个JSP文件,很多人会误以为,服务器是直接将JSP文件响应给浏览器,浏览器直接解析JSP从而显示网页内容。
这个理解的错误的! 因为JSP中包含JSP特有的元素,并且其中可能会包含Java代码,这些内容浏览器是无法解析的。

JSP的执行过程图解:JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的网页内容,其实就是翻译后的Servlet在向外输出!
在这里插入图片描述

1.3修改JSP模版
修改JSP模版步骤: 点击菜单栏中的 window --> Preferences,出现如下窗口:
在这里插入图片描述
点击edit编辑JSP模版,修改为如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title></title>
</head>
<body>
	${cursor}
</body>
</html>

2JSP语法
2.1模版元素
直接写在jsp页面中的html内容称之为jsp页面中的模版元素
除了JSP特有的内容之外的其他内容都是模板元素
模版元素在翻译过来的Servlet中被out.write()原样输出到浏览器中
比如:
在这里插入图片描述
模版元素在JSP翻译后的Servlet中直接被out.write原样输出. 如下:
在这里插入图片描述
2.2JSP表达式
格式: <%= 表达式 %> 其中可以书写常量、变量、表达式。
作用: 执行表达式, 将结果再原样发送给浏览器
JSP表达式在翻译后的Servlet中是执行表达式的值再原样输出到浏览器,例如
(1)在JSP页面编写内容如下:

<%= request.getContextPath() %> <br/>
<%= "Hello...JSP..." %> <br/>

(2)在翻译后的Servlet中翻译如下:
在这里插入图片描述
在这里插入图片描述
2.3JSP脚本片段
格式:<% 若干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/>
<% } %>

2.4JSP注释:
格式: <%-- JSP注释 --%>

例如:<%-- out.write(“aaa”); --%> 被JSP注释注释的内容,在翻译的过程中被抛弃,不会被翻译。
注意: 注释不能交叉嵌套!!
2.5JSP指令
JSP指令格式:<%@ 指令名称 若干属性声明… %>
JSP指令的作用:不会直接产生输出,JSP指令是用来指挥JSP解析引擎如何来翻译当前JSP页面中其他部分的内容(除指令意外的其他内容,例如模版元素、jsp表达式等)
1、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"%>

2、include指令
– 可以实现页面包含的效果,即页面的合并效果
格式:<%@ include file="" %>
试一试: 创建三个JSP文件(分别为_header.jsp、_footer.jsp、cart.jsp、order.jsp),在cart.jsp、order.jsp中分别包含_header.jsp和_footer.jsp,在浏览器中访问cart.jsp和order.jsp。

(1)_header.jsp

<%@ page pageEncoding="utf-8"%>
<h1 style="text-align:center;height:80px;color:#fff;background:red;">
	header(网页的头部)
</h1>

(2)_footer.jsp

<%@ page pageEncoding="utf-8"%>
<h1 style="text-align:center;height:100px;background:yellow;">
	footer(网页的尾部)
</h1>

(3)cart.jsp

<%@ page pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
</head>
<body>
	<!-- 将头部包含进来 -->
	<%@include file="/_header.jsp" %>
	
	<h1 style="text-align:center;height:300px;color:#fff;background:blue;">
		cart:购物车页面的主体
	</h1>
	
	<!-- 将尾部包含进来 -->
	<%@include file="/_footer.jsp" %>
</body>
</html>

(4)order.jsp

<%@ page pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
</head>
<body>
	<!-- 将头部包含进来 -->
	<%@include file="/_header.jsp" %>

	<h1 style="text-align:center;height:300px;color:#fff;background:green">
		order:订单页面的主体
	</h1>
	
	<!-- 将尾部包含进来 -->
	<%@include file="/_footer.jsp" %>
</body>
</html>

3、taglib指令

在使用JSTL标签库中的标签时, 在当前JSP中要引入JSTL标签库: 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

需要注意: 在引入之前还需要导入JSTL相关的jar包
在这里插入图片描述
3JSP标签技术
在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成页面非常的混乱,难于维护。
于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐,JSP2.0以后不要在JSP页面中出现任何一行java代码。
3.1EL表达式
EL表达式在JSP中可以非常方便的获取数据,可以代替JSP页面中的JSP表达式(<%= %>)
语法结构: ${ 表达式 }
主要作用: 主要用于用于获取域(request域)中的数据
a) EL只能获取域中的数据,不能往域中添加数据或修改域中已有的数据!
b) EL只能获取域中的数据,不能遍历数据(比如数组或集合)!!!

EL表达式提供了如下功能:
1、EL可以获取常量/变量(必须存入域中)/表达式的值
在这里插入图片描述
2、EL可以获取域中的数组或集合中的数据
在这里插入图片描述
获取域中集合中的数据和获取数组的方式相同. 这里不再举例
3、EL可以获取域中的Map集合中的数据。
在这里插入图片描述
EL表达式的作用: 在Web开发中, 实现很多功能的时候, 都是由Servlet接收请求、处理请求,但是处理的结果应该交给JSP显示,此时我们可以在Servlet中将请求处理的结果存入request域中,再通过转发将Request域带到JSP中,再通过EL表达式将request域中的数据取出来, 显示在网页上

3.2JSTL标签库
JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;
JSTL标签库和EL配合使用取代JSP中大部分的Java代码;

在使用JSTL标签库提供的标签之前:
(1)如果缺少JSTL的jar,还需要将JSTL的jar包导入项目中,如下: 导入JSTL的jar包

(2)在JSP中通过taglib指令引入JSTL标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

其中常用的标签如下:
1、<c:set></c:set> – 往四大作用域中添加域属性,或者修改四大作用域中已有的属性
(1) 往四大作用域中添加一个域属性
在这里插入图片描述
(2) 修改四大作用域中已有的属性
如果重复添加相同的属性,值会发生覆盖,相当于修改.
在这里插入图片描述
(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值