JSP&EL&JST
JSP&EL&JSTL
了解JSP的作用
jsp常用内置对象
EL表达式学习
JSTL标签库学习
第一章 JSP
1、概述
1.1 JSP引入
在前几天的登录案例中,登录失败后为了能够响应登录的错误信息。我们特意创建了一个LoginErrorServlet用来
动态地拼接错误信息。
【代码如下】
- LoginErrorServlet:登录失败,手动拼接login.html页面,并将错误信息动态地添加进去。
- LoginErrorServlet:手动拼接html页面,动态展示登录错误信息。
【结论】
在Servlet中,能够直接获取后台服务器中的数据:获取数据方便
通过拼接字符串的形式,给浏览器响应html:操作麻烦,效率太低 ,阅读性差。
如果能够有一个既能直接书写html代码,又能书写Servlet代码的页面。就能够在客户端和服务端直接进行数据交
互了。
1.2、JSP是什么
//3.给浏览器生成响应信息
//如果能查到数据
if (userList != null && userList.size() > 0) {
//登录成功 重定向到成功页面
response.sendRedirect("/success.html");
}else{
//登录失败给浏览器生成提示信息 并由LoginErrorServlet处理错误信息
request.setAttribute(“loginErrorMsg”, “用户名或密码错误”);
request.getRequestDispatcher("/loginErrorServlet").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//获取错误信息
String loginErrorMsg = (String) request.getAttribute(“loginErrorMsg”);
//处理响应乱码
response.setContentType(“text/html;charset=utf‐8”);
//获取输出流
PrintWriter out = response.getWriter();
//拼接登录的html页面
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println(""+loginErrorMsg+"
");
out.println(“用户名:
”);
out.println(“密码:
”);
out.println("");
out.println("");
out.println("");
out.println("");
}
JSP全名为Java Server Pages,中文名叫java服务器页面,其本质是一个简化的Servlet 设计,它是由Sun 公司倡
导、许多公司参与一起建立的一种动态网页 技术标准。其实就是一个既能书写Servlet代码又能书写HTML代码的文
件。
1.3 创建JSP文件
在web目录下,新建一个jsp文件,点击鼠标右键New — JSP—给这个文件取个名字。
【图1 创建JSP】
文件内容如下:
1.4 在JSP中书写代码
【需求】 - 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
- 将这个字符串展示在浏览器上;
【参考代码】demo01.jsp
<%@ page contentType=“text/html;charset=UTF‐8” language=“java” %>
Hello JSP
System.out.println("hello World!"); 【运行结果】启动tomcat,并且访问这个jsp页面 【控制台输出】 在浏览器看到 format格式的日期 2、JSP的运行原理 我们通过浏览器访问到的jsp页面,最终访问的是tomcat服务器中的jsp页面。所以,我们可以到tomcat中查看一下 上面案例中的jsp页面是怎么样的一种存在。IntilliJ IDEA借助tomcat发布web项目的机制是动态发布(为每一个 web项目创建一个单独的发布文件)。我们可以通过tomcat其中日志中的CATALINA_BASE路径找到我们当前这个 JSP页面在tomcat中的位置: 【图1 IDEA发布项目的路径】 找到这个目录后,会看到以下3个文件夹: 【图2 文件目录】 <%‐‐java代码‐‐%> <% System.out.println("hello jsp"); Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss"); String format1 = format.format(date); out.println(format1); %> hello jsp 我们打开C:\Users\admin.IntelliJIdea2017.3\system\tomcat\Tomcat_8_5_311_day05目录发现有两个文件: 【图3 JSP被翻译后的代码】 打开demo01_jsp.java文件后,发现我们在JSP页面上写的代码都在_jspService方法中: 1. <% %> 中书写的代码被直接解析成java代码; 2. html部分都被out.write("")方法以字符串的形式拼接,然后响应给浏览器; 3. 在这个java文件中有个_jspService,这个方法有两个参数request,response。由此可看出JSP本质上就是一 个Servlet。 3、JSP中书写java代码的三种方式 在JSP页面的body标签中,可以直接书写html代码和JS代码。但是,如果在JSP页面中书写java代码。必须遵循固定 的格式,才能够生效;JSP页面中书写java代码有三种方式:1.脚本片段;2.脚本声明;3.脚本表达式; 方式一:脚本片段 out.write('\r'); out.write('\n'); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("${user.username}登陆成功!
请去主页面 提示:EL表达式从session中取值: ${sessionScope.loginUser.userName} 温馨提示 要去Java中访问LoginServlet,才能访问demo05.jsp页面 【代码示例】demo05.jsp 1.2 EL简介 2、EL取值 <%@ page import="cn.itheima.domain.User" %><%‐‐ Created by IntelliJ IDEA. User: admin Date: 2018/8/1 Time: 9:46 To change this template use File | Settings | File Templates. ‐‐%> <%@ page contentType="text/html;charset=UTF‐8" language="java" %>
${user.username}登陆成功!
请去主页面 EL全称: Expression Language 作用:代替jsp中脚本表达式的功能,简化对java代码的操作,从【域对象】中取值。 EL表达式简化<%= %>方式取值 EL语法表达式的格式:${表达式内容} 域对象 对象名称 说明 page域 pageScope page域指的是当前JSP页面,其中存储的数据只在当前页面有效 request域 requestScope request域:一次请求或请求链中request域 session域 sessionScope session域:一次会话过程中,session域 application域 applicationScope application域:服务启动后整个项目对应的ServletContext域 域对象 取值方式 page域 ${pageScope.xxx} request域 ${requestScope.xxx} session域 ${sessionScope.xxx} application域 ${applicationScope.xxx} 2.1 JSP的四大域对象 JSP的四大域对象指的是:page域,request域,session域,application域。我们通常使用EL表达式从这4个域对 象用取值。以下是这4个域对象的详细信息: 2.2 EL表达式从四大域中取值 EL表达式从指定的域中取值的方式如下: 【需求】 1. 在一个JSP页面中,使用脚本表达式分别往request域,session域,ServletContext域和pageContext域中存 储数据; 2. 使用EL表达式从这4个域中取值; 【参考代码】 demo06.jsp <%‐‐ Created by IntelliJ IDEA. User: admin Date: 2018/8/1 Time: 9:56 To change this template use File | Settings | File Templates. ‐‐%> <%@ page contentType="text/html;charset=UTF‐8" language="java" %>
取request:${requestScope.request}
取session:${sessionScope.session}
取application:${applicationScope.application}
简化方式
${page} <%‐‐ Created by IntelliJ IDEA. User: admin Date: 2018/8/1 Time: 10:03 To change this template use File | Settings | File Templates. ‐‐%> <%@ page contentType="text/html;charset=UTF‐8" language="java" %>
JSESSIONIDname的值${cookie.JSESSIONID.name}
JSESSIONIDvalue的值${cookie.JSESSIONID.value}
name的名称${cookie.name.name}
name的值${cookie.name.value}
运算符 说明 使用示例 结果 + 加 ${n1+n2} 30 - 减 ${n1-n2} -10 * 乘 ${n1*n2} 200 /或div 除 ${n1/n2} %或mod 取余 3、EL运算符 EL表达式获取到值之后可以直接通过运算符进行运算。EL表达式的运算符主要有以下几类:算术运算,关系运 算,逻辑运算,三元运算,empty运算符。 【素材】页面数据准备demo09.jsp 3.1 算术运算 顾名思义,算术运算是进行算术运算的符号,主要包括:加,减,乘,除。具体使用如下表: 【代码示例】demo09.jsp代码片段(全部代码在运算符结束处) <% session.setAttribute("n1","10"); session.setAttribute("n2","20"); session.setAttribute("n3",10); session.setAttribute("n4",20); %> 运算符 说明 使用示例 结果 == 或 eq 等于 equal ${n1 == n2} false != 或ne 不等于 not equal ${n1 != n2} true > 或 gt 大于 greater than ${n1 > n2} false >= 或ge 大于等于 greater than or equal ${n1 >= n2} false < 或 lt 小于 less than ${n1 < n2} true <= 或le 小于等于 less than or equal ${n1 <= n2} true 3.2 关系运算 关系运算符是判断两个数据的大小关系的,关系运算符有:==,!=,<,<=,>,>=。具体使用方法如下: 【代码示例】demo09.jsp <% session.setAttribute("n1","10"); session.setAttribute("n2","20"); session.setAttribute("n3",10); session.setAttribute("n4",20); %> ${n1 + n2}
${n3 * n4}
<%‐‐ 关系运算符 ‐‐%> ${n3 > n4}
${n1 < n2}
${n1 == n3}
运算符 说明 使用示例 结果 && 或 and 逻辑与 ${true && false} false || 或 or 逻辑或 ${true || false} true ! 或 not 非 ${!false} true 3.3 逻辑运算 逻辑运算符包括:&& ,||,!使用方法如下: 参考代码demo09.jsp 3.4 三元运算 EL表达式也支持三元运算符:如,判断n1是否是正数,可以写成如下:参考代码demo09.jsp <%‐‐ 逻辑运算符 与 或 非 ‐‐%> ${false && true}
${!false}
<%‐‐ 三元运算符 表达式1? 表达式2:表达式3; ‐‐%> ${n1 > n2?"正确":"错误"} 3.5 empty运算 empyt运算符对以下数据运算返回true: 1. 字符串:""; 2. 空集合(size=0):List list = new ArrayList(); 3. 空对象(null):Student stu = null; 【代码示例】 demo09.jsp <%‐‐ empty 集合List true 对象=null String ="" ‐‐%> 这是empty表达式使用方法
<% String str = ""; List list = new ArrayList(); User student = null; request.setAttribute("str", str); request.setAttribute("list", list); request.setAttribute("student",student); %> ${not empty str}
${empty list}
${empty student}
【注】not empty可以用在EL表达式中,判断非空的情况。 全部代码demo09.jsp <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page import="cn.itheima.domain.User" %><%‐‐ Created by IntelliJ IDEA. User: admin Date: 2018/8/1 Time: 10:37 To change this template use File | Settings | File Templates. ‐‐%> <%@ page contentType="text/html;charset=UTF‐8" language="java" %>
${n3 * n4}
<%‐‐ 逻辑运算符 与 或 非 ‐‐%> ${false && true}
${!false}
<%‐‐ EL表达式小结: EL:Expression Language; 关系运算符 ‐‐%> ${n3 > n4}
${n1 < n2}
${n1 == n3}
<%‐‐ 三元运算符 表达式1? 表达式2:表达式3; ‐‐%> ${n1 > n2?"正确":"错误"} <%‐‐ empty 集合List true 对象=null String ="" ‐‐%> 这是empty表达式使用方法
<% String str = ""; List list = new ArrayList(); User student = null; request.setAttribute("str", str); request.setAttribute("list", list); request.setAttribute("student",student); %> ${not empty str}
${empty list}
${empty student}
EL语法:${ } 作用:简化脚本表达式的取值,简化<%= request.getAttribute("name") %> ===> ${name} jsp的四大域对象 page域:pageContext pageContext.setAttrubute() pageContext.getAttribute() JSP特有 作 用范围:当前的JSP页面 requst域:request request.setAttribute() request.getAttribute() 作用范围:一次请求和响应 之间 session域: session session.setAttribute() session.getAttribute() 作用范围:会话期间(多次请 求和响应) servletContext域:application application.setAttribute() application.getAttribute() 作用范围: 整个项目; jsp从四大域中取值(指定域对象): ${pageScope.name} ${requestScope.name} ${sessionScope.name} ${applicationScope.name} JSP搜索域对象中的值:page --- request --- session --- servletContext ${name} 运算 算术运算 关系运算 逻辑运算:&& || ! 三元运算 empty运算:empty notempty 空字符串:"" 空对象:null 空集合:list.size = 0; 第三章 JSTL标签库 1、JSTL概述 1.1 、JSTL引入 【案例】在页面中遍历集合,并以红色字体显示出所有的人:demo10.jsp <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %><%‐‐ Created by IntelliJ IDEA. User: admin Date: 2018/8/1 Time: 10:54 To change this template use File | Settings | File Templates. ‐‐%> <%@ page contentType="text/html;charset=UTF‐8" language="java" %>
<% } %> 1.2、JSTL是什么 1.3、JSTL核心标签库 从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重 用性,因此自定义标签在WEB应用中被广泛使用。 许多WEB应用厂商都开发出了自己的一套标签库提供给用户使用,这导致出现了许多功能相同的标签,令网页制作者无所 适从,不知道选择哪一家的好。 为了解决这个问题, Apache Jakarta小组归纳汇总了那些网页设计人员经常遇到的问题, 开发了一套用于解决这些常用问题的自定义标签库, 这套标签库被SUN公司定义为标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL。 使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的 标准提供自己的实现,以获取最佳性能 标签名称 作用 c:out 通常用于输出一段文本内容到客户端浏览器 c:set 用于设置各种Web域中的属性 c:remove 用于删除各种Web域中的属性 c:catch 用于捕获嵌套在标签体中的内容抛出的异常 c:if 用户java代码if(){}语句功能 c:choose 用于指定多个条件选择的组合边界,它必须与c:when和c:otherwise标签一起使用 c:forEach 用户代替java代码for循环语句 c:forTokens 用户迭代操作String字符 c:param 给请求路径添加参数 c:url 重写url,在请求路径添加sessionid c:import 用于在JSP页面中导入一个URL地址指向的资源内容 c:redirect 用于将当前的访问请求转发或重定向到其他资源 2、JSTL标签应用 2.1 安装JSTL 我们知道JSTL标签是将一段java代码功能封装成一个标签来使用。所以,我们使用JSTL标签之前必须导入被封装的 java代码---jar包。JSTL标签库主要依赖以下两个jar包: 我们在IDEA的web项目的WEB-INF目录下创建一个lib文件夹,然后将jar包复制到这个文件夹里。选中这些jar包, 右键---add as library即可将jar包导入到项目中。 2.2 将标签库资源引入JSP页面 在JSP页面中通过以下标签,通过taglib标签引入JSTL资源: 【注意】 1. prefix:是jstl标签在使用的时候的前缀; 2. uri:是标签库的资源路径; 2.3 在JSP页面中使用JSTL标签 在JSP页面中书写"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!