JSP&EL&JST

JSP&EL&JSTL
了解JSP的作用
jsp常用内置对象
EL表达式学习
JSTL标签库学习
第一章 JSP
1、概述
1.1 JSP引入
在前几天的登录案例中,登录失败后为了能够响应登录的错误信息。我们特意创建了一个LoginErrorServlet用来
动态地拼接错误信息。
【代码如下】

  1. LoginErrorServlet:登录失败,手动拼接login.html页面,并将错误信息动态地添加进去。
  2. 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中书写代码
    【需求】
  3. 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
  4. 将这个字符串展示在浏览器上;
    【参考代码】demo01.jsp
    <%@ page contentType=“text/html;charset=UTF‐8” language=“java” %>
Title <%@ page contentType="text/html;charset=UTF‐8" language="java" %> 我的第一个JSP页面 <%‐‐html代码‐‐%>

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(" jsp文件运行原理\r\n"); out.write("\r\n"); out.write("\r\n"); out.write('\r'); out.write('\n'); 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); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); } 脚本片段指的是一段java代码。书写格式:<% java 代码 %> 【示例】 demo02.jsp 【被翻译后的源码】 方式二:脚本声明 脚本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就行需要一个 新的技术——脚本声明. 脚本声明的格式:<%! 书写Java代码 %> 【示例一】声明成员变量 demo02.jsp <%@ page contentType="text/html;charset=UTF‐8" language="java" %> jsp‐demo1 <%‐‐脚本片段‐‐%> <% System.out.println("hello"); out.println("out"); out.println("任何类型"); out.write(65); response.getWriter().println(); response.getWriter().write('c'); %> <%@ page contentType="text/html;charset=UTF‐8" language="java" %> Title 【被翻译后的代码】成员变量 【示例二】声明成员方法 demo02.jsp 【被翻译后的代码】成员方法 <%‐‐声明全局变量‐‐%> <%! int num = 10; public void test(){ } %> <%@ page contentType="text/html;charset=UTF‐8" language="java" %> Title <%‐‐声明一个成员方法‐‐%> <%! public void test(){ } %> demo02.jsp运行的效果图 方式三:脚本表达式 虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要 使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response向页面输出内容 ——这个就是脚本表达式。 脚本表达式的格式:<%= 内容 %> 等价于:out.print(内容) 【示例】在页面输出信息 <%@ page contentType="text/html;charset=UTF‐8" language="java" %> Title <%‐‐脚本表达式:直接在页面输出内容‐‐%> <%= "传智播客" %> 【被翻译后的代码】 【注意】不要同时使用脚本表达式和response同时往页面输出信息,会出现顺序不一致。如下代码: 【打印结果】 【小结】 1. 脚本表达式 <%= str %> :在页面输出内容,在service方法中起作用; 2. 脚本片段 <% %> :在service方法中,原样输出的代码片段; 3. 脚本声明: <%! String str = "黑马程序员" %> :定义成员变量; write() 和println()区别 (1)、write():仅支持输出字符类型数据,字符、字符数组、字符串等 (2)、print():可以将各种类型(包括 Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出 response.getWriter().println();和out.write(65);区别 <%@ page contentType="text/html;charset=UTF‐8" language="java" %> Title <%‐‐脚本表达式:直接在页面输出内容‐‐%> <%= "传智播客" %> <% response.getWriter().println("黑马程序员"); %> response.getWriter().println(); response.getWriter().write('c'); (1)、out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。 (2)、执行原理不 同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的 缓冲区后再输出,response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。 (3)、out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,而 response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷 新页面。形象的比喻:当我们调用response.getWriter()这个对象同时获得了网页的画笔,这时你就可以通过这个 画笔在网页上画任何你想要显示的东西。 4、JSP页面常用对象 我们发现,我们在JSP页面中书写的代码最终都会翻译到_jspService()方法中,我们发现这个方法中有两个入参: HttpServletRequest对象 ,HttpServletResponse对象 。所以说,JSP的本质就是一个Servlet。我们可以直接 在JSP页面上使用这两个对象。 【需求】登录页面改造 改造登录后在页面上显示session中的信息 【思路】 1. 登录成功后直接重定向到一个jsp页面; 2. 在jsp页面上使用request对象获取session中的值; 【代码】 LoginServlet中,登录成功之后,直接重定向到demo05.jsp页面: 【JSP页面】demo05.jsp <%@ 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" %> Title <% User user = (User) request.getSession().getAttribute("user"); String username = user.getUsername(); JSP作用:给浏览器生成响应信息; JSP特点:动态网页,html+java,由服务器来运行的。本质上是一个Servlet; 书写Java代码的三种方式: 脚本片段:java代码片段,在service方法中起作用。格式:<% System.out.println("hello") %>; 脚本表达式:直接在页面输出内容,在service方法中起作用,等价于out.print(内容)。格式:<%= "传智 播客"%> 脚本声明:定义成员变量,方法。在当前类中都起作用。 JSP页面常用的对象:request,response; 第二章 EL表达式 1、EL概述 1.1 引入 回顾刚刚改造的登录案例,发现在success.jsp获取session中的信息写了很多的java代码: 因为,脚本表达式在JSP页面上书写起来比较麻烦。而在页面上取值在开发中使用的又比较多,所以Sun公司为了 简化在页面上的取值操作。 【需求】使用EL表达式改造demo05.jsp页面的取值操作 %> <%=username%>登陆成功!
${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" %> Title <% User user = (User) request.getSession().getAttribute("user"); String username = user.getUsername(); %> <%=username%>登陆成功!
${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" %> 域对象 <% pageContext.setAttribute("page","pageContext存放的值"); 2.3 EL表达式搜索数据 EL表达式取值的时候也可以不指定域,如果取值的时候不指定域对象。就会按照从page域--->request域--- >session域--->servletContext域从小到大逐级根据name属性值查找。 demo07.jsp request.setAttribute("request","request存放的值"); session.setAttribute("session","session存放的值"); application.setAttribute("application","application存放的值"); %> 取pageContext:${pageScope.page}
取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" %> 域对象访问顺序 <% pageContext.setAttribute("pageone","pageContext存放的值"); request.setAttribute("pageone","request存放的值"); session.setAttribute("pageone","session存放的值"); application.setAttribute("pageone","application存放的值"); 2.4 EL表达式从cookie中取值 demo08.jsp 温馨提示:要去访问Java代码CookieServlet,才能将cookie存储到浏览器中 %> <%‐‐ 从小到大 page request session application ‐‐%> ${pageone} ${sessionScope.pageone} <%‐‐ Created by IntelliJ IDEA. User: admin Date: 2018/8/1 Time: 10:13 To change this template use File | Settings | File Templates. ‐‐%> <%@ page contentType="text/html;charset=UTF‐8" language="java" %> cookie <% Cookie[] cookies = request.getCookies(); %> 获取单个cookie
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" %> 运算符 <% session.setAttribute("n1","10"); session.setAttribute("n2","20"); session.setAttribute("n3",10); session.setAttribute("n4",20); %> ${n1 + n2}
${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" %> JSTL引入 <% List list = new ArrayList<>(); list.add("金庸"); list.add("古龙"); list.add("天蚕土豆"); session.setAttribute("items",list); %> <% for (String str : list){ %> 小姐姐
<% } %> 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页面中书写"

猜你喜欢

转载自blog.csdn.net/weixin_43912494/article/details/87970309