JSP概述
什么是JSP
JSP和Servlet都是由SUN公司提供的动态Web资源开发技术。
JSP看起来像一个HTML,但和HTML不同的是,JSP中可以书写Java代码,可以通过Java代码展示动态的数据。
静态Web资源:任何人在任何条件下访问时,看到的都是相同的效果,这样的资源叫做静态Web资源。(html、css、js等)
动态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执行过程
访问服务器中的JSP文件,其执行过程为:
-
当浏览器请求服务器中的某一个JSP文件(例如:localhost/09-jsp/test.jsp),服务器会根据请求资源的路径去寻找该文件:
-
如果找到了,JSP翻译引擎会将JSP翻译成一个Servlet程序(JSP----> xxx.java----> xxx.class),然后Servlet程序再执行,执行的结果是向浏览器输出一个HTML网页!
-
如果没有找到,服务器将会响应一个404页面,通知浏览器请求的资源不存在。
访问服务器中的HTML文件,其执行过程为:
-
当浏览器请求服务器中的某一个HTML文件时(例如:localhost/09-jsp/test.html),服务器会根据请求资源的路径去寻找该文件:
-
如果找到了,服务器会将html文件的内容作为响应实体发送给浏览器,浏览器再解析html并显示在网页上。
-
如果没有找到,服务器将会响应一个404页面,通知浏览器请求的资源不存在。
-
修改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> -
JSP语法
模版元素
模板元素是指写在JSP中的html内容
或者除了JSP特有内容以外的其他内容称之为模板元素
模板元素在翻译后的Servlet中,被out.write原封不动的发送给浏览器,由浏览器负责解析并显示。
-
JSP表达式
格式:
<%= 常量、变量、表达式 %>
作用:计算表达式的结果,将结果输出到浏览器中,由浏览器负责解析并显示。
<%= "Hello JSP..." %>
<% String name = "林青霞"; %>
<%= name %>
<%= 100+123 %>
<%= Math.random() %> -
JSP脚本片段
格式:
<% 若干Java语句 %>
作用:在翻译后的Servlet中,将脚本片段中的Java语句复制粘贴到Servlet的对应的位置执行。例如:
在JSP中代码如下:
<!-- 在页面上输出5行"hello JSP" -->
<%
for(int i=0; i<5; i++){
out.write("Hello JSP...<br/>");
}
%> - 在翻译后的Servlet中代码如下:
- ...
for(int i=0; i<5; i++){
out.write("Hello JSP...<br/>");
}
... - 另外,在某一个脚本片段中的Java代码可以是不完整的,但是在JSP中所有的脚本片段加在一起,必须是完整符合Java语法。例如,在JSP中代码如下:
- <% for(int i=0;i<5;i++){ %>
Hello JSP~~~<br/>
<% } %> - 在翻译后的Servlet中:
- for(int i=0;i<5;i++){
out.write("\r\n");
out.write("\t\t\tHello JSP~~~<br/>\r\n");
out.write("\t");
} -
JSP注释
格式:<%-- JSP注释内容 --%>
作用:(1)为代码添加解释说明 (2)将一些暂时不需要执行的代码注释掉。
在JSP翻译时,注释内容不会参与翻译,而是直接被丢弃
面试题:考察JSP中的JSP注释、Java注释、html注释
<%--
<% out.write( "aaaaa<br/>" ); %>
--%>
<% //out.write( "bbbbb<br/>" ); %>
<!--
<% out.write( "ccccc<br/>" ); %>
--> -
问题:(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标签库或者其他的自定义标签库
后面讲解JSTL标签库时会讲解!
JSP标签技术
在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成jsp页面结构的混乱,导致后期难于维护,并且代码难以复用。
于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐,JSP2.0以后不要在JSP页面中出现任何一行java代码。
-
EL表达式
格式:
${ 常量/表达式/变量 }
(放在EL中的变量得先存入域中,才可以获取变量的值)作用:(1)计算放在其中的表达式的结果,将结果输出在当前位置。
(2)主要作用:用于从域对象中获取数据,将获取到的数据输出在当前位置。
域对象:pageContext、request、session、application
1、获取常量、表达式、变量的值(变量得先存入域中)
-
${ "hello el" }
hello el <br/>
${ 100+123 }
${ 12*12 > 143 ? "yes" : "no" } <br/><%
String name = "马云";
request.setAttribute( "name123" , name );
%>
${ 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); -
-
<%-- 获取从Servlet转发带过来的域中的数组中的元素 --%>
${ names[0] } <%-- 刘德华 --%>
${ names[1] } <%-- 郭富城 --%>
${ names[2] } <%-- 张学友 --%>
${ names[3] } <%-- 黎明 --%> -
3、获取作用域中map集合中的元素
Servlet中的代码:
//声明一个map集合,为集合添加元素, 并将map集合存入到域中
Map map = new HashMap();
map.put( "name" , "尼古拉斯赵四" );
map.put( "age" , 28 );
map.put( "addr", "中国" );
request.setAttribute( "map1", map );
//将请求转发到jsp, 在JSP中获取域中的数组中的元素
request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response); -
-
${ map1.name } <%-- 尼古拉斯赵四 --%>
${ map1.age } <%-- 28 --%>
${ 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() } --%>
<hr/>
<%-- user.name 底层调用的仍然是 getName()方法--%>
${ user.name }
<%-- user.age 底层调用的仍然是 getAge()方法--%>
${ user.age }
<%-- user.addr 底层调用的仍然是 getAddr()方法--%>
${ user.addr }JSTL标签库
JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;
JSTL标签库和EL配合使用可以取代JSP中大部分的Java代码;
在使用JSTL标签库之前需要完成:
-
导入JSTL的开发包
-
其中常用的标签如下:
1、<c:set></c:set>
-- 用于往域中添加属性,或者修改域中已有的属性值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", "张三"); --%>
<c:set var="name" value="张三" scope="request"/>
${ name }<% String job = "java开发工程师"; %>
<c:set var="job" value="<%= job %>" scope="request"/>
${ job }<c:set var="name" value="张三丰" scope="request"/>
${ name }2、<c:if></c:if>
-- 构造简单的 if…else…结构语句c:if 标签属性总结:
test属性 -- 指定一个布尔表达式,当表达式的结果为true时,将会执行(输出)c:if标签中的内容,如果表达式结果为false,将不会输出c:if标签中的内容代码示例:往域中存入一个成绩, 根据成绩判断成绩所属的等级
-
<c:if test="${ 3>5 }">yes</c:if>
<c:if test="${ 3<=5 }">no</c:if>
<hr>
<!-- 根据成绩判断成绩所属的等级 -->
<c:set var="score" value="-35"/>
<c:if test="${ score>=80 and score<=100 }">您的成绩属于: 优秀!</c:if>
<c:if test="${ score>=60 and score<80 }">您的成绩属于: 中等!</c:if>
<c:if test="${ score>=0 and score<60 }">您的成绩属于: 不及格!</c:if>
<c:if test="${ score<0 or score>100 }">您的成绩有误!</c:if>3、<c:forEach></c:forEach>
-- 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.(1) 遍历域中数组或集合中的元素
(2) 遍历域中map集合中的元素
(3) 遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中
c:forEach 标签属性总结:
-
(1)items: 指定需要遍历的集合或数组
(2)var: 指定用于接收遍历过程中的每一个元素
(3)begin: 指定循环从哪儿开始
(4)end: 指定循环到哪儿结束
(5)step: 指定循环时的步长, 默认值是1
(6)varStatus: 用于表示循环遍历状态信息的对象, 这个对象上有如下属性:
first属性: 表示当前遍历是否是第一次, 若是, 则返回true;
last属性: 表示当前遍历是否是最后一次, 若是, 则返回true;
count属性: 记录当前遍历是第几次
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- jsp的表达式符号,其中可以写java代码,可以将结果输出 -->
<%=Math.random() %>
<!-- 从request对象的map集合中取数据-->
<%=request.getAttribute("name") %>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
package com.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestParam extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//获取输出流,向浏览器响应数据
PrintWriter out = response.getWriter();
/**
* 获取请求中的参数:
* 1.需要保证浏览器发请求访问当前Servlet时,请求中特有参数
* 2.request.getParameter(String paramName)
* 根据请求参数的名字(username)获取对应的参数值(张飞)
* 3.request.getParamValues(String paramName)
* 根据请求参数的名字获取的所有参数值组成的数组
*/
//获取请求中的username和age
String username=request.getParameter("username");
System.out.println(username);
String age=request.getParameter("age");
System.out.println(age);
String[] like=request.getParameterValues("age");
System.out.println(Arrays.toString(like));
out.write("测试request获取请求参数.....");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestParam02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//获取输出流,向浏览器响应数据
PrintWriter out = response.getWriter();
//处理POST提交中文参数时的乱码问题
request.setCharacterEncoding("utf-8");
/**
* 获取请求中的user和like
* alt+shift+L--抽取本地变量
*/
String user = request.getParameter("user");
System.out.println(user);
String[] like = request.getParameterValues("like");
System.out.println(Arrays.toString(like));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* author: bjzhangsz@tedu.cn
* datetime: 2021年2月23日 下午11:42:53
*/
public class TestScope extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//====================================
System.out.println("TestScope.doGet方法执行了....");
//往request对象的map集合中存入数据
request.setAttribute("name", "刘德华");
/**
* 将请求转发给index.jsp(转发时会将request对象中的map集合中的数据也带过去)
* localhost:8080/day08-reqres/TestScope
* localhost:8080/day08-reqres/index.jsp
* http://localhost/day08-reqres/index.jsp
*/
request.getRequestDispatcher("index.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* author: bjzhangsz@tedu.cn
* datetime: 2021年2月23日 下午11:54:59
*/
public class TestWriter extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write("你好");//utf-8
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu.forward;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//获取输出流,向浏览器响应数据
PrintWriter out = response.getWriter();
//==================================================
System.out.println("AServlet.doGet方法执行了.....");
/**
* 从当前Servlet将请求转发到BServlet
* http://localhost:8080/day08-reqres/AServlet
* http://localhost:8080/day08-reqres/BServlet
*/
request.getRequestDispatcher("BServlet").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu.forward;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//获取输出流,向浏览器响应数据
PrintWriter out = response.getWriter();
//==================================================
System.out.println("BServlet.doGet方法执行了.....");
//由BServlet给出回应
out.write("Hello BServlet...."+new Date());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu.redirect;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//获取输出流,向浏览器响应数据
PrintWriter out = response.getWriter();
//==================================
System.out.println("CServlet.doGet方法执行了....");
/**
* 1.从当前Servlet重定向到DServlet-reqres/CServlet
* http://localhost:8080/day08-reqres/CServlet
* http://localhost:8080/day08-reqres/DServlet
*/
//response.sendRedirect("DServlet");
response.sendRedirect("http://localhost:8080/day08-reqres/DServlet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.tedu.redirect;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//获取输出流,向浏览器响应数据
PrintWriter out = response.getWriter();
//======================================
System.out.println("DServlet.doGet方法执行了....");
//向浏览器做出响应
out.write("Hello DServlet..."+new Date());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>day14-jsp</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
<%@ 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>
<h3>1.JSP的表达式:其中可以写常量/变量/表达式</h3>
<%="Hello JSP" %>
Hello JSP<br/>
<%=12*34>400 ? "yes" : "no" %>
<%=12*34 %>
<%-- 在eclipse中编辑JSP文件,经常会出现报错(有语法错误)
判断是否报错的方法:将报错的整行代码选中--剪切--保存文件,
再将剪切的代码粘贴回原位置,再保存
--%>
<% String name="马云"; %>
<%=name %>
<h3>JSP的脚本片段</h3>
<%-- out是JSP的九大隐式对象之一
相当于response.getWriter()
page/request/response/config/application/exception/
pageCountext/out/session
--%>
<%
for(int i=0;i<5;i++){
out.write("Hello JSP<br/>");
}
%>
</body>
</html>
<%@page import="com.tedu.pojo.User"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表达式</title>
</head>
<body>
<h1>1、获取常量、表达式、变量的值(变量得先存入域中)</h1>
${"Hello EL" }
${123+321 }
${Math.random() }
<hr/>
<%
String name="韩少云";
//往request域中添加属性,属性名是字符串,属性值可以是任意类型
request.setAttribute("name123", "孙尚香");
%>
jsp表达式:<%=name %>
<hr/>
EL表达式:${name123 }
<%--
在EL表达式中书写变量,并不会直接获取这个变量的值,而是根据变量的
名字(例如:name),到四大作用域中寻找该名称对应的属性值,并且寻找
的顺序是按照域的范围大小,按照从小到大的顺序去寻找,如果找到了就
直接输出该属性对应的值(即使后面还有,也不会再找了);如果找不到,就
什么也不输出!
域的范围从小到大的顺序是:
pageCountext<request<session<application
--%>
<h1>2、获取作用域中数组或集合中的元素</h1>
<%
//声明一个数组,并设置初始值,再将数组存入到域中
String[] nameArr={"刘沛霞","齐雷","刘昱江","张久军","陈子枢"};
request.setAttribute("names", nameArr);
%>
${names[0] }
${names[1] }
${names[2] }
${names[3] }
${names[4] }
<%--
如果将上面的数组换成集合存入域中,通过EL获取域中的集合中的元素,格式不变!
--%>
<h1>3、获取作用域中map集合中的元素</h1>
<%
//声明一个map集合,并往map中添加元素,再将map集合存入域中
Map<String,Object> map=new HashMap<String,Object>();
map.put("name", "尼古斯.赵四");
map.put("age", 35);
map.put("addr", "中国");
request.setAttribute("map", map);
%>
${map.name }
${map.age }
${map.addr }
<h1>4、获取作用域中JavaBean对象的属性值</h1>
<%
//声明一个user对象,并给对象的属性赋值,再将user对象存入域中
User u1=new User();
u1.setName("郭富城");
u1.setAge("18");
u1.setAddr("中国香港");
request.setAttribute("user", u1);
%>
<%-- ${user.getName() }
${user.getAge() }
${user.getAddr() } --%>
<%--下面的写法是上面的简写形式,调用的仍然是对应的getXxxx方法 --%>
${user.name }
${user.age }
${user.addr }
</body>
</html>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入JSTL标签库中核心标签库-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL标签库</title>
</head>
<body>
<h3>1.c:set标签--往域中添加属性或者修改已有的属性值</h3>
<%--
实例:往域中添加一个属性,属性名为name,属性值为"张三"
request.setAttribute("name","张三")
--%>
<%--
如果不指定scope属性,默认是存入到pageContext域中
--%>
<c:set var="name" value="张三" scope="request"/>
<%--
如果不指定scope属性,默认是存入到pageContext域中
--%>
<c:set var="name" value="李四" scope="page"/>
${pageScope.name }
${requestScope.name }
<%--如果往同一个域中添加两次同名的属性,但值不同,后面的值会覆盖前面的 --%>
<c:set var="name" value="张三丰" scope="request"/>
${requestScope.name }
<h3>2.c:if标签--用于构造简单的if...else结构</h3>
<%--
实例:判断成绩所属的等级
--%>
<c:set var="scope" value="85" scope="request"/>
<%--
test属性指定一个布尔值,如果为true,则输出C:if标签中的内容,否则就不输出
--%>
<c:if test="${scope>=80 && scope <=100}">您的成绩为:优秀</c:if>
<c:if test="${scope>=60 && scope <80}">您的成绩为:中等</c:if>
<c:if test="${scope>=0 && scope <60}">您的成绩为:不及格</c:if>
<c:if test="${scope<0 || scope >100}">成绩不合法!</c:if>
<h3>3.c:forEach标签--用于遍历数组或者集合,或者执行指定次数的循环</h3>
<h3>1.遍历域中的数组或集合中的元素</h3>
<%
//声明一个数组,并往数组中添加一些元素,将数组存入到域中
String[] nameArr={"张三","李四","王五","赵六"};
request.setAttribute("names", nameArr);
//for(String name:nameArr){}
%>
<c:forEach items="${names }" var="name">
${name }<br/>
</c:forEach>
<h3>2.遍历域中的map集合中的元素</h3>
<%
//声明一个map集合,并往map中添加元素,再将map集合存入域中
Map<String,Object> map=new HashMap<String,Object>();
map.put("name", "尼古斯.赵四");
map.put("age", 35);
map.put("addr", "中国");
request.setAttribute("map", map);
%>
<c:forEach items="${map }" var="entry">
${entry }<br/>
</c:forEach>
<hr/>
<c:forEach items="${map }" var="entry">
${entry.key }:${entry.value}<br/>
</c:forEach>
<h3>3.遍历1-100之间所有的整数,将是3的倍数的数值输出</h3>
<c:forEach begin="1" end="100" var="i" step="1">
${i%3==0 ? i : "" }
</c:forEach>
<hr/>
<c:forEach begin="1" end="100" var="i" step="1">
<c:if test="${i%3==0 }">${i }</c:if>
</c:forEach>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>day14-jsp....index.html....</h1>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>day14-jsp....index.jsp....</h1>
<%=Math.random() %>
</body>
</html>
package com.tedu.pojo;
/**
* 用于封装用户信息的类--POJO
* POJO(Plain Old Java Object)简单Java对象
* @author huawei
*
*/
public class User {
private String name;
private String age;
private String addr;
//如果要添加有参构造函数,一定要将无参的构造函数也加上
//提供对应的get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}