JSP和el以及jstl

jsp

Java Server Page

  • 什么是jsp

  jsp站在客户端来看,jsp是一个显示内容的页面,能动态的显示页面中的内容,所以称jsp为动态页面,比如login.jsp(能从后台获取数据更新自己的页面),能在jsp页面写java代码,所以jsp可以看成是java+html,站在程序员来看,其实jsp就是一个servlet(在tomcat容器中将访问的jsp编译并翻译为servlet),但各自有各自的特点,所以共存,jsp重点用于显示动态内容,servlet则重于完成动态数据模型的业务逻辑处理

  • 为什么会有jsp?

html 多数情况下用来显示静态内容 , 一成不变的。 但是有时候我们需要在网页上显示一些动态数据, 比如: 查询所有的学生信息, 根据姓名去查询具体某个学生。 这些动作都需要去查询数据库,然后在网页上显示。 html是不支持写java代码 , jsp里面可以写java代码。

怎么用JSP

指令写法

<%@ 指令名字 %>

page指令

  • language

表明jsp页面中可以写java代码

  • contentType

其实即使说这个文件是什么类型,告诉浏览器我是什么内容类型,以及使用什么编码

    contentType="text/html; charset=UTF-8"

    text/html  MIMEType 这是一个文本,html网页

  • pageEncoding jsp内容编码
  • extends 用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改。
  • import 导包使用的,一般不用手写。
  • session

值可选的有true or false .

用于控制在这个jsp页面里面,能够直接使用session对象。

具体的区别是,请看翻译后的java文件 如果该值是true , 那么在代码里面会有getSession()的调用,如果是false : 那么就不会有该方法调用,也就是没有session对象了。在页面上自然也就不能使用session了。

  • errorPage

指的是错误的页面, 值需要给错误的页面路径

  • isErrorPage

上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。

页面设置errorPage跳转属性的结果页面

应该这样呈现给客户端

而非这样:

include

包含另外一个jsp的内容进来。

    <%@ include file="other02.jsp"%>

  • 背后细节:

把另外一个页面的所有内容拿过来一起输出。 所有的标签元素都包含进来。

如果包含的是一个静态html页面则会乱码,

解决方法:再html文件的头上加上<%page  pageEncoding="utf8"%>

taglib

<%@ taglib prefix="" uri=""%>  

uri: 标签库路径

prefix : 标签库的别名  

    1. 导入标签jar包 standard.jar|jstl.jar
    2. 引入taglib标签库
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>

Jsp 中的动作标签:

 例子

aa.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%-- jsp中的 动作标签--%>
         <%--jsp的动态包含动作标签,是将被包含的页面的结果通过方法设置在jsp对应的servlet中一并输出到客户端--%>
     <%--  <jsp:include page="login.html"  ></jsp:include>--%>

      <%

          request.setAttribute("state",404);


      %>

         <%-- jsp的转发动作标签:实现页面的转发跳转,使用page指定转发跳转的目标地址 ,jsp:forward标签中间不能有其它的元素和空格--%>
       <jsp:forward page="error.jsp" ></jsp:forward>





</body>
</html>

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
     <h3>访问服务器出错了!</h3>
     <p><font color="red">亲,您访问的页面出现了问题<%=request.getAttribute("state")%></font></p>
</body>
</html>

JSP内置对象

所谓内置对象,就是我们可以直接在jsp页面中使用这些对象。 不用创建。

  • pageContext
  • request
  • session
  • application

以上4个是作用域对象 ,

是前后端传递数据的桥梁

4个域对象

对象的作用域
page作用域(名字有的说pageContext有的说page,个人觉得是第一个)
request作用域
session作用域
application作用域

在jsp中提供了四种作用域,分别是page作用域,request作用域,session作用域,application作用域。
page作用域(名字有的说pageContext有的说page,个人觉得是第一个)
page作用域是指单一的jsp页面的范围,page作用域内的对象只能在创建该对象的页面中访问。page作用域可以使用pageContext对象的setAttribute()和getattribute()方法进行访问。page作用域在客户端每次请求jsp页面时创建,在服务器发送响应或请求转发到其他的页面或资源后失效。
示例
第一个页面:

<%
	String name="page";
	pageContext.setAttribute("name",name);
%>
<strong>
	one:<%=pageContext.getAttribute("name")%>
</strong>
<%
pageContext.include("tow.jsp")
%>


第二个页面:

<strong>
	tow:<%=pageContext.getAttribute("name")%>
</strong>

结果是:

one:page
tow:null

我们在one页面中调用pageContext对象的setAttribute方法将一个数据保存到page作用域,然后在本页面中调用pageContext对象的getattribute可以访问到,而在tow页面中,也就是另一个page作用域中则无法访问到该对象,这个的结果是通过pageContext对象的include方法将听我的响应结果包含到one中的。

request作用域
page 作用域与当前的页面绑定在一起,二request请求则是与客户端的请求绑定在一起的,起作用就是可以通过调用request对象的getattribute和setattribute方法进行访问。request作用域内同样有效,也就是调用RequestDispatch的forward方法转向页面或调用include方法包含页面的时候都可以响应同一个request作用域,访问其中的数据。
说明一下 RequestDispatch对象的forward方法和PageContext的include方法实现是相同的。

one:

      
<%
    String name="requset";
request.setAttribute("name",name);
    request.getRequestDispatcher("tow.jsp").forward(request, response);
%>

tow:

<strong> tow:<%=request.getAttribute("name")%> </strong>

tow:requset

session作用域
jspr容器会为每一次的回话创建一个session作用域。在回话的有效期内,只要将数据保存到session中,该数据可以被本次回话的其他页面访问。
示例:

<%
   String name="requset";
    String ses = "session";
    request.setAttribute("name",name);
    session.setAttribute("sessionName", ses);
    response.sendRedirect("tow.jsp");
%>
tow:<%=request.getAttribute("name")%>
    ses: <%=session.getAttribute("sessionName")%>

tow:null ses: session

可以看到tow是通过request的方式进行存储的,但是我们使用respons将页面进行重定向后数据就不存在了。而在session中我们可以根据sessionName取到由此可见在session对象的作用域内会话有效期内是都可以进行访问的。

application作用域
相当于session作用域的一个会话,application对象是针对整个web应用的,被该应用下所有用户所共享。在web运行期间,所有的页面都可以进行访问。
示例:

<%
    String app="application";
    String ses = "session";
    application.setAttribute("appName",app);
    session.setAttribute("sessionName", ses);
    response.sendRedirect("tow.jsp");
%>

ses: <%=session.getAttribute("sessionName")%>
    app:<%=application.getAttribute("appName")%>

结果:我们在运行的时候要注意建立两个会话;
我们运行one页面 结果如下:

这时候我们新开一个浏览器,直接访问tow页面。效果如下:

由于session作用域对当前会话,多个会话之间不能共享,所以无法读取session变量。而application作用域是针对整个应用的,因而appName的变量可以被获取到。当然如果重启项目,application也不会读到数据了。
原文链接:https://blog.csdn.net/qq_38269362/article/details/108034525

jsp九大内置对象

JSP中使用到的内置对象主要有如下九个:

request内置对象
response内置对象
page内置对象
session内置对象
application内置对象
out内置对象
exception内置对象
config内置对象
pageContext内置对象

一、request内置对象

request内置对象是最常用的对象之一,它代表的是java.servlet.HttpServletRequest类的对象。request内置对象中包含了有关浏览器请求的信息,并提供了多个用于获取cookie、header以及session内数据的方法。

request对象常用方法

request对象主要用于客户端请求处理,其中,该对象中所包含的方法有:

  1. request对象主要用于客户端请求处理,其中,该对象中所包含的方法有:

  2. getMethod():返回HTTP请求信息中所使用到的方法名称;

  3. getServletPath():返回请求信息中调用Servlet的URL部分;

  4. getQueryString():返回HTTP GET请求信息中URL之后的查询字符串;

  5. getContentType():返回请求实体的MIME类型;

  6. getProtocol():返回请求信息中的协议名名字与版本号;

  7. getPathInfo():返回有关任何路径信息;

  8. getServletName():返回接受请求的服务器主机;

  9. getServletPort():返回服务器的端口号;

  10. getRemoteHost():返回提交请求的客户机的规范名字;

  11. getRemoteAddr():返回提交请求的客户机的IP地址;

  12. getScheme():返回请求使用的模式(协议)名字;

  13. getParameter():返回客户端通过表单提交过来的参数值。例如request.getParameter(“myname”),通过该语句来获取客户端传递过来的myname 参数。

  14. getContextPath():返回HTTP 请求中指示请求上下文的部分。

  15. getHeaderNames():返回一个枚举类型,此枚举集合中包含了请求所含有的所有请求名。

  16. getAuthType():返回用于保护Servlet 的认证模式的名字。例如,BASIC,SSL 或者NULL(没有保护)。

  17. gtRequestURL():返回HTTP 请求信息中的第一行从协议名开始直至查询字符串之间的URL 部分。例如,对HTTP GET 请求http://www.zzbsite.com/helloworld?name=johnson&age=20,这个方法将返回http://www.zzbsite.com/helloworld 字符串。

  18. gtCountLength():返回整数,表示请求实体的长度(以字节为单位)。

  19. gtUestPrincipal():返回java.security 类的Principal 对象,其中包含有目前授权用户的名字。

  20. iUserInRole(String role):返回一个布尔值,指示某个授权用户是否包含在某个具体的逻辑角色role 中。

  21. gtRemoteHost():如果用户已经被授权,则返回提交请求的用户的注册名字,否则返回一个NULL。

二、response内置对象

response对象与request对象相对应,它是用于响应客户请求,向客户端输出信息。response是javax.servlet.HttpServletResponse类的对象。

response对象的常用方法

response对象提供了多个方法用来处理HTTP响应,可以调用response中的方法修改ContentType中的MIME类型以及实现页面的跳转等等,
比较常用的方法如下:

  1. setContentLength(int len):此方法用于设置响应头的长度。

  2. setContentType(String type):用于设置HTTP响应的contentType中的MIME类型,其中可以包含字符编码的规则。例如可以把contentType设置为“text/html;charset=GBK”。在Servelet编写过程中,需要调用此方法进行设置,但是在JSP中一般都是使用page指令直接指定contentType的属性。

  3. getOutputStream():此方法返回一个Servlet的输出流。用于在响应中写入二进制数据。Servlet容器不对二进制数据进行编码。

  4. getWriter():此方法返回一个PrintWriter对象,在Servlet编写过程使用的比较频繁,而在JSP文件中,由于out是用getWriter()创建的PrintWriter对象的隐含对象,所以可以直接调用out对象作输出响应。

  5. getCharacterEncoding():该方法获得此时响应所采用的字符编码类型。

  6. sendError(int status):使用指定错误状态码向客户机发送相应的错误信息。

  7. sendError(int status, String message):使用自定义的错误状态码以及描述信息向客户机发送错误的提示信息。

  8. sendRedirect(String location):将请求重新定位到一个不同的URL(页面)上。此方法在实际开发过程中会经常使用到。

  9. setDateHeader(String headername, long date):把指定的头名称以及日期设置为响应头信息。其中日期是用long值表示的,这是按照从新纪元开始算起的毫秒数。

  10. ContainsHeader(String name):检测指定的头信息是否存在。返回一个布尔类型。

  11. setHeader(String headername, String value):此方法使用指定的头名字以及相应的值来设置头信息。如果此头信息已经设置,则新的值会覆盖掉旧的值。如果头信息已经被发送出去,则此方法的设置将被忽略。

  12. addheader(String headername, String value):把指定的头名字以及相应值添加到头信息当中去。

  13. addIntHeader(String headername, int value):把指定的头名字以及整数值设置为头信息。如果头信息已经设置了,则新的设置值将覆盖掉以前的值。

  14. setStatus(int sc):给响应设置状态的代码。

  15. setStatus(int sc, String sm):为响应设置状态代码以及信息。这是在没有错误的时候使用的。

三、page内置对象

page对象有点类似于Java编程中的this指针,就是指当前JSP页面本身。page是java.lang.Object类的对象。

  1. getClass():返回当时Object的类。

  2. hashCode():返回此Object的哈希代码。

  3. toString():把此时的Object类转换成字符串。

  4. equals(Object o):比较此对象是否和指定的对象是否相等。

  5. copy(Object o):把此对象复制到指定的对象当中去。

  6. clone():对此对象进行克隆。

四、session内置对象

session是与请求有关的会话期,它是java.servlet.http.HttpSession类的对象,用来表示和存储当前页面的请求信息。

在实际的Web应用开发过程会经常遇到这样的一个问题:会话状态的维持。当然有很多种方法可以用来解决这个问题,例如:Cookies、隐藏的表单输入域或者将状态信息直接附加到URL当中去,但是这些方法使用非常不便。

Java Servlet提供了一个可以在多个请求之间持续有效的会话对象HttpSession,此对象允许用户存储和提取会话状态的信息。JSP同样也支持了Servlet中的这个概念。JSP中的session内置对象就是对应于Servlet中的HttpSession对象。当Web应用系统希望通过多个页面完成一个事务的时候,session的使用是非常有用和方便的。

session对象的常用方法

session内置对象中的常用方法如下:

  1. getId():此方法返回唯一的标识,这些标识为每个session而产生。当只有一个单一的值与一个session联合时,或当日志信息与先前的sessions有关时,它被当作键名用。

  2. getCreationTime():返回session被创建的时间。最小单位为千分之一秒。为得到一个对打印输出很有用的值,可将此值传给Date constructor 或者GregorianCalendar的方法setTimeInMillis。

  3. getLastAccessedTime():返回session最后被客户发送的时间。最小单位为千分之一秒。

  4. getMaxInactiveInterval():返回总时间(秒),负值表示session永远不会超时。

  5. getAttribute(String key):通过给定的关键字获取一个存储在session中相对应的信息。例如,Integer item = (Integer) session.getAttrobute("item")。

  6. setAttribute(String key, Object obj):提供一个关键词和一个对象值,然后存在session当中。例如,session.setAttribute("ItemValue", itemName)。

五、application内置对象

application是javax.servlet.ServletContext类对象的一个实例,用于实现用户之间的数据共享(多使用于网络聊天系统)。

application对象与session对象的区别

它的作用有点类似于前一节介绍的session内置对象。但是它们之间还是有区别的,一般来说,一个用户对应着一个session,并且随着用户的离开session中的信息也会消失,所以不同客户之间的会话必须要确保某一时刻至少有一个客户没有终止会话;而applicat则不同,它会一直存在,类似于系统的“全局变量”,而且只有一个实例。

application对象的常用方法

application内置对象的常用方法如下:

  1. getAttribute(String key):通过一个关键字返回用户所需要的信息,返回类型为对象(Object),类似于session中的getAttribute(String key)方法。

  2. getAttributeNames():返回所有可用的属性名,返回类型为枚举(Enumeration)。

  3. setAttribute(String key, Object obj):保存一个对象信息,并指定给一个关键字。

  4. removeAttribute(String key):通过关键字来删除一个对象信息。

  5. getServletInfo():返回JSP引擎的相关信息。

  6. getRealPath(String path):返回虚拟路径的真实路径。

  7. getContext(String URLPath):返回执行Web应用的application对象。

  8. getMajorVersion()和getMinorVersion():返回服务器所支持的Servlet API最大和最小版本号。

  9. getMineType(String file):返回指定文件的MIME类型。

  10. getResource(String path):返回指定资源的URL路径。

  11. getResourceAsStream(String path):返回指定资源的输入流。

  12. getRequestDispatcher(String URLPath):返回指定资源的RequestDispatcher对象。

  13. getServlet(String name):返回指定名称的Servlet。

  14. getServlets():返回所有的Servlet,返回类型为枚举型。

  15. getServletNames():返回所有的Servlet名称,返回类型为枚举型。

  16. log(String msg):把指定信息写入到Servlet的日志文件中。

  17. log(String msg, Throwable throwable):把栈轨迹以及给出的Throwable异常的说明信息写入Servlet的日志文件。

六、out内置对象

out需要先写在缓存中再传到response中所以传输数据会比response慢

out对象是在JSP开发过程中使用得最为频繁的对象,但使用也是最为简单的。

out对象的常用方法

out对象的常用方法如下:

  1. print():在页面中打印出字符串信息,不换行;

  2. println():在页面中打印出字符串信息,并且换行;

  3. clear():清除掉缓冲区中尚存在的内容。

  4. clearBuffer():此方法清除掉当前缓冲区中尚存在的内容。

  5. flush():清除掉数据流。

  6. getBufferSize():返回缓冲区的内存大小,单位为字节流。如果不进行缓冲区的设置,大小为0。

  7. getRemaining():此方法返回缓冲区还剩下多少字节数可以使用。

  8. isAutoFlush():检查当前缓冲区是设置为自动清空,还是满了就抛出异常。

  9. close():关闭输出流。

七、exception内置对象

exception内置对象是用来处理页面出现的异常错误,它是java.lang.Throwable类的一个对象。前面已经讲过,在实际JSP网站开发过程中,通常是在其页面中加入page指令的errorPage属性来将其指向一个专门处理异常错误的页面。如果这个错误处理页面已经封装了这个页面收到的错误信息,并且错误处理页面页面含有的isErrorpage属性设置为true,则这个错误处理页面可以使用以下方法来访问错误的信息:

  1. getMessage()和getLocalizedMessage():这两种方法分别返回exception对象的异常消息字符串和本地化语言的异常错误。

  2. printStackTrace():显示异常的栈跟踪轨迹。

  3. toString():返回关于异常错误的简单消息描述。

  4. fillInStackTrace():重写异常错误的栈执行轨迹。

八、config内置对象

config内置对象是ServletConfig类的一个实例。在Servlet初始化的时候,JSP引擎通过config向它传递信息。这种信息可以是属性名/值匹配的参数,也可以是通过ServletContext对象传递的服务器的有关信息。

  1. config内置对象中常用的方法如下。

  2. getServletContext():此方法将返回一个含有服务器相关信息的ServletContext对象。

  3. getInitParameter(String name):返回初始化参数的值。

  4. getInitParameterNames():返回包含了Servlet初始化所需要的所有参数,返回类型是枚举型

九、pageContext内置对象

pageContext对象是一个比较特殊的对象。它相当于页面中所有其他对象功能的最大集成者,即使用它可以访问到本页面中所有其他对象,例如前面已经描述的request、response以及application对象等。

pageContext对象的常用方法

这个对象中常使用的方法如下:

  1. getRequest():返回当前页面中的request对象。

  2. getResponse():使用此方法将返回当前页面中的response对象。

  3. getPage():此方法返回当前页面中的page对象。

  4. getSession():返回当前页面中的session对象。

  5. getOut():返回当前页面中的out对象。

  6. getException():返回当前页面中的exception对象。

  7. getServletConfig():返回当前页的config对象。

  8. getServletContext():返回当前页中的application对象。

  9. setAttribute(String name):给指定的属性名设置属性值。

  10. getAttribute(String name):根据属性名称找到相应的属性值。

  11. setAttribute(String name, Object obj, int scope):在给定的范围内设置相应的属性值。

  12. getAttribute(String name, int scope):在指定的范围内获取到相应的属性值。

  13. findAttribute(String name):寻找一个属性并返回,如果没有找到则返回一个null。

  14. removeAttribute(String name):通过属性名删除掉某个属性。

  15. removeAttribute(String name, int scope):在指定的某个范围内删除某个属性。

  16. getAttributeScope(String scope):返回某属性的作用域。

  17. getAttributeNamesInScope(int scope):返回指定范围内的所有属性名的枚举。

  18. release():释放掉pageContext()所占的所有资源。

  19. forward(String relativeURLpath):使用当前页面重导到另一个页面。

  20. include(String relativeURLpath):使用当前位置包含的另一个页面.

el表达式

作用

1、获取数据
    EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
  2、执行运算
    利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
  3、获取web开发常用对象
    EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
  4、调用Java方法
    EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

使用EL表达式获取数据语法:"${内置对象.键名}"

<%@ page import="java.util.*" %>
<%@ page import="com.lxyk.domain.User" %><%--
  Created by IntelliJ IDEA.
  User: EDY
  Date: 2022/4/8
  Time: 21:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el表达式</title>
</head>
<body>
      <h3> 作用和意义 </h3>
      <p>1.代替java小脚本的输出格式,简化域中取值</p>
      <p>2.统一规范页面的标签书写规范</p>

      <h3> el---expression language表达式语言</h3>
       <p>语法格式---${内置对象.键名}</p>

       <h4>el表达式取单值</h4>
      <%
          pageContext.setAttribute("name","pageContext");
          request.setAttribute("name","request");
          session.setAttribute("name","session");
          application.setAttribute("name","application");
      %>
       <p>取域中的单值----${name}--${requestScope.name}--${sessionScope.name}--${applicationScope.name}</p>

      <h4>el表达式取数组中的值</h4>
        <%
            int[] arr = {5,3,8,10,20};
            request.setAttribute("array",arr);
        %>
       <p>从数组中取值要结合下标---${requestScope.array[0]}</p>

      <h4>el表达式取集合中的值</h4>
        <%
            List list = new ArrayList();
            Collections.addAll(list,"aa","bb","cc");
            request.setAttribute("list",list);
        %>
       <p>从集合中取值要结合下标---${requestScope.list[0]}--${requestScope.list.get(0)}</p>

      <h4>el表达式取map集合中的值</h4>
      <%
          Map<String,String> map = new LinkedHashMap<String,String>();
           map.put("a","北京");
           map.put("b","上海");
           map.put("d.a","武汉");
           request.setAttribute("map",map);
      %>
      <p>从map集合中取值--${requestScope.map.a}--${requestScope.map.get("b")}--${requestScope.map['d.a']}</p>

      <h4>el表达式取javaBean中的值</h4>
      <%
            User user = new User("张三丰",108,0);
            request.setAttribute("u",user);
      %>
      <p> 从javabean对象中取值----${requestScope.u.name}---${u.toString()}</p>

     <hr/>
      <h3>el中的11个内置对象</h3>

       <dl>
           <dt>el中支持的4个域对象</dt>
           <dd>pageScope--本页面域</dd>
           <dd>requestScope--请求域</dd>
           <dd>sessionScope--回话域</dd>
           <dd>applicationScope--app域</dd>
       </dl>
       <dl>
           <dt>el中支持的2个头对象+2个参数</dt>
           <dd>header--请求头相关数据</dd>
           <dd>headerValues--请求头值相关数据</dd>
           <dd>param--参数相关数据</dd>
           <dd>paramValues--参数值相关数据</dd>
       </dl>
       <p>头相关数据获取--${header.keySet()}</p>
       <p> 参数相关数据获取--${paramValues.values()}</p>

      <dl>
          <dt>el中支持的cookie</dt>
          <dd>cookie--请求头相关cookie数据</dd>
          <dd>${cookie.keySet().toArray()[0]}</dd>
      </dl>

      <dl>
          <dt>el中支持的pageContext及initPara</dt>
          <dd>pageContext--本页面上下文</dd>
          <dd>initParm--全局参数</dd>
          <dd>${pageContext.request}</dd>
          <dd>${initParam.keySet()}</dd>
      </dl>




</body>
</html>

jstl--Java Standard Tag Language

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Collections" %><%--
  Created by IntelliJ IDEA.
  User: EDY
  Date: 2022/4/8
  Time: 21:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>jstl--Java Standard Tag Language</title>
    <c:set var="ctx" value="${pageContext.request.contextPath}" scope="session" />
</head>
<body>
         <h3> 作用和意思 </h3>
         <p>结合el表达式来统一jsp页面的标签化标准,简化jsp中java脚本</p>

         <h3>jstl的使用</h3>
         <dl>
             <dt>使用步骤:</dt>
             <dd>step1:引入jstl的依赖jar包</dd>
             <dd>step2:在jsp页面通过taglib标签指令引入标签库</dd>
             <dd>step3:在jsp页面通过taglib标签简化java脚本</dd>
         </dl>

         <h3>jstl中的常用的标签</h3>
         <p>c:set----设置变量及其取值和其域范围 var: value: scope:</p>
         <p>c:if---条件判断标签,如果条件为true,被该标签包裹的内容就显示,否则不显示</p>
         <p>c:forEach---循环标签 items:el表达式的集合 begin: end: step: varstutas:index|count</p>

         <h4>jstl的使用</h4>
          <c:set var="x" value="4" />
          <c:if test="${x>5}" var="flag" >
              <p>x变量的值>5</p>
          </c:if>
          <c:if test="${x<=5}"  >
              <p>x变量的值<=5</p>
          </c:if>

          <%
              List list = new ArrayList();
              Collections.addAll(list,"aa","bb","cc");
              request.setAttribute("list",list);
          %>
           <table style="border: 2px">
               <tr><td>序号</td><td>值</td></tr>
               <c:forEach var="item" items="${requestScope.list}" varStatus="stus" >
               //使拿到的值一行一行显示
                   <tr><td>${stus.count}</td><td>${item}</td></tr>
               </c:forEach>
           </table>
              //循环打印1-10,每一步中间隔两个  1 3 5 7 9
          <c:forEach var="x" begin="1" end="10" step="2" >
                <p>${x}</p>
          </c:forEach>

</body>
</html>