JSP、EL、JSTL

赛哥

JSP介绍

JSP和Servlet都是由SUN公司提供的一门动态web资源开发技术。
JSP看起来像一个HTML,和HTML不同的是,JSP中可以书写Java代码,可以通过Java代码显示动态数据。
JSP本质上就是一个Servlet。

JSP的由来
1.Servlet本质是一段Java程序,适合处理业务逻辑,不适合向外输出一个(完整的复合规范的)html网页。
2.HTML就是一个页面的开发技术,适合作为网页进行输出,但是html是一个静态Web资源开发技术,无法展示动态数据(HTML+AJAX)。
3.JSP也是一个页面的开发技术,可以输出html网页,并且JSP可以通过Java代码展示动态数据。
JSP的出现,既解决了Servlet不适合输出网页的问题,也解决了HTML无法展示动态数据的问题

为什么说JSP本质是一个Servlet?

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

JSP的执行流程

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

JSP表达式

格式:<%= 常量、变量、表达式 %>
作用:计算表达式的结果,将结果输出到浏览器中,由浏览器负责解析并显示。

<%= "Hello JSP..." %>
<% String name = "林青霞"; %>
<%= name %>
<%= 100+123 %>
<%= Math.random() %>

注意:JSP表达式中可以书写符合Java语法的代码,但是不能写Java语句(内部不能写分号;)
JSP脚本片段
格式:<% 若干Java语句 %>

<!-- 在页面上输出5行"hello JSP" -->
<%
    for(int i=0; i<5; i++){
        out.write("Hello JSP...<br/>");
    }
%>

JSP注释
格式:<%-- 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指令
指令的格式:<%@ 指令名称 若干属性声明... %>

<%@ page language="java"%>

language属性用于指定当前JSP使用的开发语言,目前只有java语言支持,可以省略不写!

<%@ page import="java.util.Date"%>

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

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

pageEncoding属性是用于指定当前JSP使用的编码,Eclipse工具会根据这个编码保存JSP文件。

JSP标签技术

EL表达式
格式:${ 常量/表达式/变量 }
作用:
(1)计算放在其中的表达式的结果,将结果输出在当前位置。
(2)主要作用:用于从域对象中获取数据,将获取到的数据输出在当前位置。

获取常量、表达式、变量的值(变量得先存入域中)
域对象:pageContext、request、session、application
例入

String name="马云";
request.setAttribute("name123" , name);

在EL表达式中书写变量,底层会根据变量名到四个作用域中寻找该名称的属性值

如果找到对应的属性值, 就直接返回, 输出到当前位置; 如果找不到就接着寻找
直到找完四个作用域, 最后还找不到就什么都不输出!
到四个作用域中寻找的顺序为: pageContext->request->session->application

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

//声明一个数组, 为数组添加元素, 并将数组存入到域中
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] } <%-- 黎明 --%>

JSTL标签库

其中常用的标签如下:

<c:set></c:set> -- 用于往域中添加属性,或者修改域中已有的属性值
(1)var -- 指定存入作用域中的属性名称
(2)value -- 指定存入作用域中属性的值
(3)scope -- 指定将属性存入哪一个作用域中,默认值是page,表示pageContext域
可取值: a)page表示pageContext域 b)request表示request域
    c)session表示session域 d)application表示ServletContext域
    
<c:if></c:if> -- 构造简单的 if…else…结构语句
test属性 -- 指定一个布尔表达式,当表达式的结果为true时,将会执行(输出)c:if标签中的内容,如果表达式结果为false,将不会输出c:if标签中的内容

<c:forEach></c:forEach> -- 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.
(1)items: 指定需要遍历的集合或数组
(2)var: 指定用于接收遍历过程中的每一个元素
(3)begin: 指定循环从哪儿开始
(4)end: 指定循环到哪儿结束
(5)step: 指定循环时的步长, 默认值是1
(6)varStatus: 用于表示循环遍历状态信息的对象, 这个对象上有如下属性:
    first属性: 表示当前遍历是否是第一次, 若是, 则返回true;
    last属性: 表示当前遍历是否是最后一次, 若是, 则返回true;
    count属性: 记录当前遍历是第几次
阅读 822
1 声望
1 粉丝
0 条评论
1 声望
1 粉丝
文章目录
宣传栏