JSP (EL、JSTL) 的使用方法!


JSP (EL、JSTL) 的使用方法!_第1张图片


  • JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

  • 它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。

JSP (EL、JSTL) 的使用方法!_第2张图片


文章目录

    • 一、JSP概述
      • (一)什么是JSP
      • (二)JSP执行过程
      • (三)修改JSP模版
    • 二、JSP语法
      • (一)模版元素
      • (二)JSP表达式
      • (三)JSP脚本片段
      • (四)JSP注释
      • JSP指令
    • 三、JSP标签技术
      • (一)EL表达式
      • (二)JSTL标签库



一、JSP概述


(一)什么是JSP

JSP和Servlet都是由SUN公司提供的动态Web资源开发技术。

JSP看起来像一个HTML,但和HTML不同的是,JSP中可以书写Java代码,可以通过Java代码展示动态的数据。

1. 静态Web资源:任何人在任何条件下访问时,看到的都是相同的效果,这样的资源叫做静态Web资源。
		(html、css、js等)
2. 动态Web资源:不同的人,在不同的条件下访问时,看到的都是不同的效果,这样的资源叫做动态Web资源。	
		(Servlet、jsp、php、.NET等)

JSP本质上是一个Servlet程序

思考1:为什么要学习JSP?

  • Servlet是一段Java程序,适合处理业务逻辑,但是Servlet不适合向浏览器输出一个html网页。
  • html可以作为页面返回,但是html是一个静态Web资源,无法展示动态数据。
  • 而JSP也是页面的开发技术,也可以作为页面返回,并且JSP中可以书写Java代码,可以通过Java代码展示动态的数据。
  • 因此,JSP的出现即解决了Servlet不适合输出页面的问题,也解决了HTML无法展示动态数据的问题!

思考2:为什么说JSP本质是一个Servlet?

  • 在JSP第一次被访问时,会翻译成一个Servlet程序。
  • 访问JSP后看到的html网页,其实是翻译后的Servlet执行的结果。
  • (也就是说,访问JSP后看到的网页,是JSP翻译后的Servlet输出到浏览器的!!)

(二)JSP执行过程

2.1 访问服务器中的JSP文件,其执行过程为:

  1. 当浏览器请求服务器中的某一个JSP文件(例如:localhost/09-jsp/test.jsp),服务器会根据请求资源的路径去寻找该文件:
  2. 如果找到了,JSP翻译引擎会将JSP翻译成一个Servlet程序(JSP----> xxx.java----> xxx.class),然后Servlet程序再执行,执行的结果是向浏览器输出一个HTML网页!
  3. 如果没有找到,服务器将会响应一个404页面,通知浏览器请求的资源不存在。

2.2 访问服务器中的HTML文件,其执行过程为:

  1. 当浏览器请求服务器中的某一个HTML文件时(例如:localhost/09-jsp/test.html),服务器会根据请求资源的路径去寻找该文件:
  2. 如果找到了,服务器会将html文件的内容作为响应实体发送给浏览器,浏览器再解析html并显示在网页上。
  3. 如果没有找到,服务器将会响应一个404页面,通知浏览器请求的资源不存在。

(三)修改JSP模版

修改JSP模版步骤: 点击菜单栏中的 window --> Preferences,出现如下窗口:

JSP (EL、JSTL) 的使用方法!_第3张图片

点击edit编辑JSP模版,修改为如下:

<%@ page language="java" pageEncoding="UTF-8"%>







${cursor}



二、JSP语法


(一)模版元素

模板元素是指写在JSP中的html内容

或者除了JSP特有内容以外的其他内容称之为模板元素

模板元素在翻译后的Servlet中,被out.write原封不动的发送给浏览器,由浏览器负责解析并显示。

JSP (EL、JSTL) 的使用方法!_第4张图片

(二)JSP表达式

  • 格式:<%= 常量、变量、表达式 %>

作用: 计算表达式的结果,将结果输出到浏览器中,由浏览器负责解析并显示。

<%= "Hello JSP..." %>
<% 
	String name = "大佬"; 
%>
<%= name %>
<%= 100+123 %>
<%= Math.random() %>

(三)JSP脚本片段

  • 格式:<% 若干Java语句 %>

作用:在翻译后的Servlet中,将脚本片段中的Java语句复制粘贴到Servlet的对应的位置执行。

例如:

在JSP中代码如下:


<%
	for(int i=0; i<5; i++){
		out.write("Hello JSP...
"); } %>

在翻译后的Servlet中代码如下:

...
for(int i=0; i<5; i++){
	out.write("Hello JSP...
"
); } ...

另外,在某一个脚本片段中的Java代码可以是不完整的,但是在JSP中所有的脚本片段加在一起,必须是完整符合Java语法。

例如,在JSP中代码如下:

<% for(int i=0;i<5;i++){ %>
		Hello JSP~~~
<% } %>

在翻译后的Servlet中:

for(int i=0;i<5;i++){ 
  out.write("\r\n");
  out.write("\t\t\tHello JSP~~~
\r\n"
); out.write("\t"); }

演示代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用jsp开发的第一个网站</title>
</head>
<body>
	<h1>保护环境,从我做起</h1>
	<!-- jsp的表达式(可以存放常量,变量,表达式) -->
	<%= "hello jsp..." %><br/>
	<%= 100+123%><br/> 
	<%= Math.random() %><br/>
	<hr />
	
	<!-- jsp的脚本片段(不带等号"=") -->
	<% String name = "孙尚香"; %>
	<!-- jsp表达式 -->
	<%= name %><br/>
	<hr />
	
	<!-- out 是jsp的内置对象,不用声明,也不用获取.可以直接使用 -->
	<%
		/* 输出五行hello jsp!!! */
		for(int i=0;i<5;i++){
			out.write("hello jsp!!!
"
); } %> <hr /> <% for(int i=0;i<5;i++){ %> Hello JSP~~~<br/> <% } %> <hr /> </body> </html>

(四)JSP注释

  • 格式:<%-- JSP注释内容 --%>

但是里面可以包含HTML的注释和Java的注释

作用:
(1)为代码添加解释说明
(2)将一些暂时不需要执行的代码注释掉。

在JSP翻译时,注释内容不会参与翻译,而是直接被丢弃

面试题:考察JSP中的JSP注释、Java注释、html注释

(1)jsp注释:
<%-- 
<% out.write( "aaaaa
" ); %> --%> (2)Java注释: <% //out.write( "bbbbb
" ); %> (3)HTML注释:

问题:
(1)上面输出的三行内容,在访问时,会显示哪一行内容?----> 答:都不会显示!!!

  • 第一行被JSP注释给注释了,JSP注释的内容不会参与翻译,也不会执行,更不会发送给浏览器,也不会在浏览器上显示。

  • 第二行被Java注释给注释了,放在脚本片段中的内容会参与翻译,会将其中的Java代码复制到翻译后的Servlet中,但由于代码被注释了,所以不会执行,也不会发送给浏览器,更不会在浏览器上显示。

  • 第三行被html注释给注释了,html注释在JSP中是模板元素,注释本身会发送给浏览器,注释中的脚本片段会参与翻译,其中的java代码也会执行,也会将内容(ccccc)发送给浏览器,但由于发送到浏览器后的ccccc被html注释包裹,因此也不会显示在浏览器上。

(2)上面输出的三行内容,哪一行会发送到浏览器中?(不管是否显示)

  • 其中第三行内容会发送到浏览器中,但不会显示,因为前后有html注释。

JSP指令

指令的格式:<%@ 指令名称 若干属性声明... %>

指令的作用:用于指挥JSP解析引擎如何将一个JSP翻译成一个Servlet程序。

1、page指令:用于声明JSP的基本属性信息(比如JSP使用的编码,JSP使用的开发语言等)

  • <%@ page language="java"%>
    language属性用于指定当前JSP使用的开发语言,目前只有java语言支持

  • <%@ page import="java.util.Date"%>
    import属性用于导入包,如果不导入包,在使用其他包下的类时,就需要在类名前面加上包路径,例如:java.util.Date date = new java.util.Date();

  • <%@ page pageEncoding="UTF-8"%>
    pageEncoding属性是用于指定当前JSP使用的编码,Eclipse工具会根据这个编码保存JSP文件。
    保证pageEncoding属性指定的编码和JSP文件保存时使用的编码相同,可以避免JSP文件出现乱码!

2、taglib指令:用于引入JSTL标签库或者其他的自定义标签库


三、JSP标签技术

在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成jsp页面结构的混乱,导致后期难于维护,并且代码难以复用。

于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐,JSP2.0以后不要在JSP页面中出现任何一行java代码。

(一)EL表达式

格式:${ 常量/表达式/变量 } (放在EL中的变量得先存入域中,才可以获取变量的值)

作用:
(1)计算放在其中的表达式的结果,将结果输出在当前位置。

(2)主要作用:用于从域对象中获取数据,将获取到的数据输出在当前位置。

  • 域对象:pageContextrequestsessionapplication

1、获取常量、表达式、变量的值(变量得先存入域中)

${"Hello EL"}
${ 12 * 34 > 365 ? "yes":"no"}
${Math.random()}

<% String name = "鲁班七号"; //request.setAttribute("name123", name); session.setAttribute("name123", "后羿"); %> ${name123} <%= request.getAttribute("name123") %> <%-- 在EL表达式中书写变量,底层会根据变量名到四个作用域中寻找该名称的属性值 如果找到对应的属性值, 就直接返回, 输出到当前位置; 如果找不到就接着寻找 直到找完四个作用域, 最后还找不到就什么都不输出! 到四个作用域中寻找的顺序为: pageContext->request->session->application --%>

2、获取作用域中数组或集合中的元素

Servlet中的代码:

//声明一个数组, 为数组添加元素, 并将数组存入到域中
String[] names = {"刘德华", "郭富城", "张学友", "黎明" };
request.setAttribute( "names", names );
//将请求转发到jsp, 在JSP中获取域中的数组中的元素
request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);

JSP中的代码:

<%-- 获取从Servlet转发带过来的域中的数组中的元素 --%>
${ names[0] } <%-- 刘德华 --%>
${ names[1] } <%-- 郭富城  --%>
${ names[2] } <%-- 张学友 --%>
${ names[3] } <%-- 黎明 --%>

3、获取作用域中map集合中的元素

Servlet中的代码:

//声明一个map集合,为集合添加元素, 并将map集合存入到域中
Map map = new HashMap();
map.put("name","赵四");
map.put("age", 30);
map.put("addr", "CN");
request.setAttribute( "map1", map );
//将请求转发到jsp, 在JSP中获取域中的数组中的元素
request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);

JSP中的代码:

${ map1.name } <%-- 赵四 --%>
${ map1.age } <%-- 30 --%>
${ map1.addr } <%-- 中国 --%>

4、获取作用域中JavaBean对象的属性值

Bean:指可重用的组件
JavaBean:指Java中可重用的组件
业务Bean:专门用于处理业务逻辑(例如:处理注册请求时,在将用户的注册信息保存到数据库之前,需要对注册薪资进行校验)
实体Bean:是专门用于封装数据的(例如:User user = new User() ...)

Servlet中的代码:

//声明一个User对象, 为对象的属性赋值, 并将User对象存入到域中
User u1 = new User();
u1.setName( "刘德华" );
u1.setAge( 18 );
u1.setAddr( "中国香港" );
request.setAttribute( "user" , u1 );

//将请求转发到jsp, 在JSP中获取域中的数组中的元素
request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);

JSP中的代码:

<%-- 
${ user.getName() }
${ user.getAge() }
${ user.getAddr() } --%>

<%-- user.name 底层调用的仍然是 getName()方法--%> ${ user.name } <%-- user.age 底层调用的仍然是 getAge()方法--%> ${ user.age } <%-- user.addr 底层调用的仍然是 getAddr()方法--%> ${ user.addr }

5、整体演示代码:
在测试JavaBean时,先创建了一个User类

package com.tedu.pojo;

/**
 * @author Daniel
 * 	POJO:Plain Ordinary Java Object,简单java对象,用于封装数据
 * 		比如:我们为了发呢告状用户信息所创建的user就是一个POJO
 * 	Bean:计算机语言中,表示可重用的组件
 * 	JavaBean:使用java语言编写的可重用组件(Service、Dao、POJO)
 * 		service、Dao:业务Bean,专门用于处理业务逻辑
 * 		POJ:实体Bean.专门用于封装数据
 * 
 */
public class User {
	
	private String name;
	private Integer age;
	private String addr;
	
	public String getName() {
		System.out.println("User.getName()");
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
}

EL表达式的测试代码:

<%@page import="com.tedu.pojo.User"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" pageEncoding="UTF-8"%>



	
	EL表达式


	

EL(Expression Language)表达式

1、获取常量、表达式、变量的值(变量得先存入域中)

${"Hello EL"}
${ 12 * 34 > 365 ? "yes":"no"}
${Math.random()}

<% String name = "鲁班七号"; //request.setAttribute("name123", name); session.setAttribute("name123", "后羿"); %> ${name123} <%-- 在el中书写变量(name123),底层会根据变量的名称,到四大作用域中寻找该名称对应的属性值 如果能找到,就直接输出这个属性值;如果找不到,就什么也不输出. 在寻找时,遵循的顺序是:pageContext,request,session,application --%>

2、获取作用域中数组或集合中的元素

<% //声明一个字符串数组,将数组存到request域中. String[] names = {"刘德华", "郭富城", "张学友", "黎明"}; request.setAttribute("name", names); %> ${name[0]}
${name[1]}
${name[2]}
${name[3]}

3、获取作用域中map集合中的元素

<% //声明一个Map集合,并将Map存入到request域中 Map map = new HashMap(); map.put("name","赵四"); map.put("age", 30); map.put("addr", "CN"); request.setAttribute("map1", map); %> ${map1.name}
${map1.age}
${map1.addr}

4、获取作用域中JavaBean对象的属性值

<% //创建一个User类的实例 User user = new User(); user.setName("阿凡达"); user.setAddr("北京"); user.setAge(24); request.setAttribute("user", user); %> ${user.getName()} ${user.getAge()} ${user.getAddr()}
${user.name} ${user.age} ${user.addr}

(二)JSTL标签库

JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;

JSTL标签库和EL配合使用可以取代JSP中大部分的Java代码;

在使用JSTL标签库之前需要完成:

  • 导入JSTL的开发包

JSP (EL、JSTL) 的使用方法!_第5张图片

  • 在使用JSTL标签库的JSP中引入JSTL(taglib指令)

JSP (EL、JSTL) 的使用方法!_第6张图片


其中常用的标签如下:

1、 – 用于往域中添加属性,或者修改域中已有的属性值

c:set 标签属性总结:

(1)var -- 指定存入作用域中的属性名称
(2)value -- 指定存入作用域中属性的值
(3)scope -- 指定将属性存入哪一个作用域中,默认值是page,表示pageContext域
可取值: a)page表示pageContext域 b)request表示request域
	c)session表示session域 d)application表示ServletContext域

代码示例:

<%-- request.setAttribute("name", "张三"); --%>

${ name }

<% String job = "java开发工程师"; %>

${ job }


${ name }

2、 – 构造简单的 if…else…结构语句

c:if 标签属性总结:

test属性 -- 指定一个布尔表达式,当表达式的结果为true时,将会执行(输出)c:if标签中的内容,如果表达式结果为false,将不会输出c:if标签中的内容

代码示例:往域中存入一个成绩, 根据成绩判断成绩所属的等级

yes
no

您的成绩属于: 优秀! 您的成绩属于: 中等! 您的成绩属于: 不及格! 您的成绩有误!

3、 – 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.

(1) 遍历域中数组或集合中的元素

<%
	String[] names = {"大佬","小弟","弟中弟","都是弟弟"};
	request.setAttribute("name", names);
%>


	${vs.count},${str}

(2) 遍历域中map集合中的元素

<%
//声明一个Map集合,并将Map存入到request域中
	Map map = new HashMap();
	map.put("name","赵四");
	map.put("age", 30);
	map.put("addr", "CN");
	
	request.setAttribute("map1", map);
	//Entry key=value
%>

	${entry}

<%-- ${entry.getKey()}:${entry.getValue()}
--%> ${entry.key} : ${entry.value}

(3) 遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中


	${i % 3 == 0 ? i : ""}


${i}

c:forEach 标签属性总结:

(1)items: 指定需要遍历的集合或数组
(2)var: 指定用于接收遍历过程中的每一个元素
(3)begin: 指定循环从哪儿开始
(4)end: 指定循环到哪儿结束
(5)step: 指定循环时的步长, 默认值是1
(6)varStatus: 用于表示循环遍历状态信息的对象, 这个对象上有如下属性:
	first属性: 表示当前遍历是否是第一次, 若是, 则返回true;
	last属性: 表示当前遍历是否是最后一次, 若是, 则返回true;
	count属性: 记录当前遍历是第几次

整体代码示例:

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="com.tedu.pojo.User"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title></title>
</head>
<body>
	<h3>c:set标签:负责往作用域中添加域属性</h3>
	<%--
		往request域中添加一个属性,名称是name,值是张三
		request.setAttribute("name", "张三"); 
	--%>
	<c:set var="name" value="张三" scope="request"></c:set>
	${name}
	
	<hr />
	<%
		//声明一个User对象,通过c:set存入域中
		User user = new User();
	%>
	<c:set var="user" value="<%= user %>"></c:set>
	${user}
	
	<h3>c:if标签</h3>
	<c:set var="score" value="45" scope="request"></c:set>
	
	<!-- 
		test属性中用于定义一个布尔表达式,如果判断结果为true,则会输出c:if标签中的内容
	 -->
	
	<c:if test="${score >= 80 && score <= 100}">优秀</c:if>
	<c:if test="${score >= 60 && score < 80}">良好</c:if>
	<c:if test="${score >= 0 && score < 60}">不及格</c:if>
	<c:if test="${score < 0 && score >= 100}">成绩有误</c:if>
	
	<hr />
	<h3>c:forEach标签</h3>
	<h4>(1)遍历域中数组或集合中的元素</h4>
	<%
		String[] names = {"大佬","小弟","弟中弟","都是弟弟"};
		request.setAttribute("name", names);
	%>
	<!-- 
		items:用于指定要遍历的数组或集合
		var:指定一个变量,用于接收数组中的元素
		varStatus:表示当前循环信息的对象,该对象上有可用的属性
			vs.first:表示当前是否为第一次遍历,如果是第一次,则返回true,否则,返回false
			vs.last:表示当前是否为最后一次遍历,如果是最后一次,则返回true,否则,返回false
			vs.count:表示当前是第几次遍历,返回是一个整数值
		  begin:表示从哪开始遍历,即用于指定起始数值
		  end:表示从哪结束,即用于指定结束数值
		  step:表示步长,默认值为1,i每次都会增长1
	 -->
	<c:forEach items="${name}" var="str" varStatus="vs">
		${vs.count},${str}<br />
	</c:forEach>
	
	
	<h4>(2)遍历域中map集合中的元素</h4>
	<%
		//声明一个Map集合,并将Map存入到request域中
		Map map = new HashMap();
		map.put("name","赵四");
		map.put("age", 30);
		map.put("addr", "CN");
		
		request.setAttribute("map1", map);
		//Entry key=value
	%>
	<c:forEach items="${map1}" var="entry">
		${entry}<br/>
	</c:forEach>
	<br />
	<c:forEach items="${map1}" var="entry">
		<%-- ${entry.getKey()}:${entry.getValue()} <br/> --%>
		${entry.key} : ${entry.value}<br />
	</c:forEach>
	
	<h4>(3)遍历1-100中的整数,将是3的倍数的数值输出到浏览器中</h4>
	<c:forEach var="i" begin="1" end="100" step="1">
		${i % 3 == 0 ? i : ""}
	</c:forEach>
	<hr />
	<c:forEach var="i" begin="1" end="100" step="1">
		<c:if test="${i%3==0}">${i}</c:if>
	</c:forEach>
	
</body>
</html>

JSP (EL、JSTL) 的使用方法!_第7张图片

你可能感兴趣的:(jsp,web)