当前位置:   article > 正文

2021年4月JSP和JSTL_2021年jstl还需要学吗

2021年jstl还需要学吗

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

JSP 简介
什么是Java Server Pages?
**JSP全称Java Server Pages,是一种动态网页开发技术。**它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

Java Server Page,它是用于展示信息操作。
为了servlet展示信息的不方便,引入了JSP。
JSP本质上也是一个servlet!!!!!!
JSP就是在HTML页面中嵌入了java代码。

在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考

一、Java Server Page

在Tomcat中的web.xml中,有一个默认的servlet,处理不可以处理的请求,还有一个JSPservlet,又叫servlet引擎,所有后缀为.jsp的文件都处理。

当浏览器访问http://localhost:8080/day9_1/index.jsp。服务器发现后缀为.jsp,它会根据路径找到index.jsp文件,会将index.jsp翻译成index_jsp.java文件,对这个java文件进行编译,产生一个index_jsp.class文件,将class文件加载运行。将JSP翻译成java文件,它是将JSP中的所有的HTML代码通过流进行输出,也就是说最终翻译成class,被虚拟机加载,它本质是servlet,它就会往回响应,响应回去就是把JSP中的HTML代码以流的方式写回浏览器。所以在JSP中展示出了HTML代码。

当请求过来,这是第一步,到服务器端,服务器端处理了,找到hello.jsp,服务器怎么处理的,就是在Tomcat中的web.xml配置了一个JSP servlet引擎,根据后缀名,处理了,处理之后会找到这个JSP,然后对这个JSP做一个翻译的过程,把它翻译成了一个java文件,这个java文件会进行编译,编译以后变成class,而后被加载,加载后就执行,就把原来JSP里面的代码,即HTML代码以流的方式写回浏览器。

怎么在JSP中书写java代码
标签 语法 用途
声明标签 <%! 变量或方法声明%>
声明JSP内所使用的全局变量或方法或内部类(它用于定义成员)(写的内容在成员位置上)

表达式 <%= 表达式 %>
输出java中变量或者表达式的值到页面上(它用于输出) out.print(内容)

程序代码标签 <%程序代码%>
编写java程序代码,但不可以定义代码(它用于定义局部)(声明的变量在局部位置_jspService方法中)

1.引入库

JSP 指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

语法格式如下:
<%@ directive attribute=“value” %>
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。

JSP中的三种指令标签:
指令 描述
<%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %> 包含其他文件,在转换成class之前
<%@ taglib … %> 引入标签库的定义

Page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。

Page指令的语法格式:

<%@ page attribute=“value” %>
等价的XML格式:

<jsp:directive.page attribute=“value” />
属性

下表列出与Page指令相关的属性:

属性 描述
buffer 指定out对象使用缓冲区的大小
autoFlush 控制out对象的 缓存区
contentType 指定当前JSP页面的MIME类型和字符编码
pageEncoding JSP翻译后的servlet保存到硬盘采用字符集
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends 指定servlet从哪一个类继承
import 导入要使用的Java类可以出现多次
info 定义JSP页面的描述信息
isThreadSafe 指定对JSP页面的访问是否为线程安全
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行EL表达式
isScriptingEnabled 确定脚本元素能否被使用

Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

Include指令的语法格式如下:
<%@ include file=“文件相对 url 地址” %>
include 指令中的文件名实际上是一个相对的 URL 地址。

如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。

等价的XML语法:
<jsp:directive.include file=“文件相对 url 地址” />
原理:静态,相当于翻译,并且被包含的结构应该去掉,变量依然可以使用

Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

Taglib指令的语法:
<%@ taglib uri=“uri” prefix=“prefixOfTag” %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。

等价的XML语法:
<jsp:directive.taglib uri=“uri” prefix=“prefixOfTag” />

JSP九大内置对象的作用和用法总结

JSP全名为Java Server Pages,中文名叫java服务器页面。

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception

1、request对象javax.servlet.http.HttpServletRequest

request对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对 象的作用域为一次请求。

当Request对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理。首先,将获取的字符串用ISO-8859-1进行编码,并将编码存发岛一个字节数组中,然后再将这个数组转化为字符串对象如下

Request常用的方法:getParameter(String strTextName) 获取表单提交的信息.

getProtocol() 获取客户使用的协议。

String strProtocol=request.getProtocol();

getServletPath() 获取客户提交信息的页面。String strServlet=request.getServletPath();

getMethod() 获取客户提交信息的方式 String strMethod=request.getMethod();

getHeader() 获取HTTP头文件中的accept,accept-encoding和Host的值,String strHeader=request.getHeader();

getRermoteAddr() 获取客户的IP地址。String strIP=request.getRemoteAddr();

getRemoteHost() 获取客户机的名称。String clientName=request.getRemoteHost();
getServerName() 获取服务器名称。 String serverName=request.getServerName();
getServerPort() 获取服务器的端口号。 int serverPort=request.getServerPort();
getParameterNames() 获取客户端提交的所有参数的名字。

Enumeration enum = request.getParameterNames();
while(enum.hasMoreElements())
{
    Strings(String)enum.nextElement();
    out.println(s);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、response对象 javax.servlet.http.HttpServletResponse

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

具有动态响应contentType属性,当一个用户访问一个JSP页面时,如果该页面用page指令设置页面的contentType属性是text/html,那么JSP引擎将按照这个属性值做出反应。

如果要动态改变这换个属性值来响应客户,就需要使用Response对象的setContentType(String s)方法来改变contentType的属性值。
response.setContentType(String s); 参数s可取text/html,application/x-msexcel,application/msword等。

在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,可以使用Response的sendRedirect(URL)方法实现客户的重定向。
例如response.sendRedirect(index.jsp);

隐藏对象response是javax.servlet.ServletResponse类的实例,代表客户端的响应。服务器端的任何输出都通过response对象发送到客户端浏览器。每次服务器端都会响应一个response实例。response对象的常用方法如下:
1   String getCharacterEncoding()    返回响应用的是何种字符编码
2   ServletOutputStream getOutputStream()   返回响应的一个二进制输出流
3   PrintWriter getWriter()   返回可以向客户端输出字符的一个对象
4    void setContentLength(int len)   设置响应头长度
5   void setContentType(String type)   设置响应的MIME类型
6   sendRedirect(java.lang.String location)   重新定向客户端的请求
7   void setCharacterEncoding(“gb2312”)   设置响应头的字符集

3、session对象 javax.servlet.http.HttpSession

Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。
当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的Session对象。
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。

session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

public String getId():获取Session对象编号。
public void setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Session对象中,并为添加的对象指定一个索引关键字。
public Object getAttribute(String key):获取Session对象中含有关键字的对象。
public Boolean isNew():判断是否是一个新的客户。

隐藏对象session是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制,session是用于服务器端保存用户信息,cookie用于在客户端保存用户信息。Servlet中通过request.getSession()来获取session对象,而JSP中可以直接使用。如果JSP中配置了<%@page session=”false”%>,则隐藏对象session不可用。每个用户对应一个session对象。session对象的常用方法如下:
1   long getCreationTime()   返回Session创建时间
2   public String getId()   返回Session创建时JSP引擎为它设的唯一ID号
3   long getLastAccessedTime()   返回此Session里客户端最近一次请求时间
4   int getMaxInactiveInterval()   返回两次请求间隔多长时间此Session被取消(ms)
5   String[] getValueNames()   返回一个包含此Session中所有可用属性的数组
6   void invalidate()  取消Session,使Session不可用
7   boolean isNew()   返回服务器创建的一个Session,客户端是否已经加入
8   void removeValue(String name)   删除Session中指定的属性
9   void setAttribute(String key,Object obj)   设置Session的属性
10  Object getAttribute(String name)   返回session中属性名为name的对象

4、application对象javax.servlet.ServletContext

application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的**“全局变量”**。

服务器启动后就产生了这个Application对象,当客户再所访问的网站的各个页面之间浏览时,这个Application对象都是同一个,直到服务器关闭。但是与Session对象不同的时,所有客户的Application对象都时同一个,即所有客户共享这个内置的Application对象。

setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Application对象中,并为添加的对象指定一个索引关键字。
getAttribute(String key):获取Application对象中含有关键字的对象。

隐藏对象application是javax.servlet.ServletContext类的对象。application封装JSP所在Web应用程序的信息,例如web.xml中国配置的全局的初始化信息。Servlet中application对象需要通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。application对象常用的方法如下:
1,  Object getAttribute(String name)  返回application中属性为name的对象
2,  Enumeration getAttributeNames()   返回application中的所有属性名
3,  void setAttribute(String name,Object value)  设置application属性
4,  void removeAttribute(String name)   移除application属性
5,  String getInitParameter(String name)  返回全局初始话函数
6,  Enumeration getInitParameterNames()  返回所有的全局初始话参数
7,  String getMimeType(String filename)  返回文件的文档类型,例如getMimeType(“abc.html”)将返回“text.html”
8,  String getRealPath(String relativePath)  返回Web应用程序内相对网址对应的绝对路径

5、out 对象javax.servlet.jsp.jspWriter

out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。隐藏对象out是javax.servlet.jsp.JspWriter类的实例服务器向客户输出的字符内容可以通过out对象输出。

获取方法: PrintWriter out = response.getWriter();out对象常用的方法如下:
1   void clear()   清除缓冲区的内容
2   void clearBuffer()   清除缓冲区的当前内容
3   void flush()   将缓冲内容flush到客户端浏览器
4   int getBufferSize()   返回缓冲大小,单位KB
5   int getRemaining()   返回缓冲剩余大小,单位KB
6   isAutoFlush()   返回缓冲区满时,是自动清空还是抛出异常
7   void close()    关闭输出流

6、pageContext 对象javax.servlet.jsp.PageContext

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。

pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext对象代表当前JSP页面编译后的内容。通过pageContext能够获取到JSP中的资源。pageContext常用方法如下:
1    JspWriter getOut()   返回out对象
2    HttpSession getSession()    返回Session对象(session)
3    Object getPage()   返回page对象
4    ServletRequest getRequest()    返回request对象
5    ServletResponse getResponse()    返回response对象

6    void setAttribute(String name,Object attribute)    设置属性及属性值 ,在page范围内有效
7    void setAttribute(String name,Object obj,int scope)   在指定范围内设置属性及属性值 ,int1=page,2=request,3=session,4=application
8   public Object getAttribute(String name)   取属性的值
9   Object getAttribute(String name,int scope)   在指定范围内取属性的值
10   public Object findAttribute(String name)   寻找一属性,返回起属性值或NULL
11   void removeAttribute(String name)   删除某属性
12   void removeAttribute(String name,int scope)    在指定范围删除某属性
13   int getAttributeScope(String name)   返回某属性的作用范围
14  Enumeration getAttributeNamesInScope(int scope)   返回指定范围内可用的属性名枚举
15   void release()   释放pageContext所占用的资源
16  void forward(String relativeUrlPath)    使当前页面重导到另一页面
17   void include(String relativeUrlPath)    在当前位置包含另一文件

7、config 对象javax.servlet.ServletConfig

config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件中共有一个config对象。config对象的常用方法如表:
1  String getInitParameter(String name)  返回配置在web.xml中初始化参数
2  Enumeration getInitParameterNames()   返回所有的初始化参数名称
3  ServletContext getServletContext()  返回ServletContext对象
4  String getServletName  返回Servlet对象

8、 page页面对象

隐藏对象page是javax.servlet.jsp.HttpJspPage类的实例。page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。page想当于Java类中的关键字this

cookie 对象

Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户电脑上保存信息并且随后再取回它。举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。

创建一个Cookie对象 调用Cookie对象的构造函数就可以创建Cookie对象。Cookie对象的构造函数有两个字符串参数:Cookie名字和Cookie值。

例如:Cookie c = new Cookie(username”,john”); 将Cookie对象传送到客户端。

JSP中,如果要将封装好的Cookie对象传送到客户端,可使用Response对象的addCookie()方法。

例如:response.addCookie©,读取保存到客户端的Cookie。

使用Request对象的getCookie()方法,执行时将所有客户端传来的Cookie对象以数组的形式排列,如果要取出符合需要的Cookie对象,就需要循环比较数组内每个对象的关键字。设置Cookie对象的有效时间,用Cookie对象的setMaxAge()方法便可以设置Cookie对象的有效时间,

例如:Cookie c = newCookie(username”,”john”);c.setMaxAge(3600);

Cookie对象的典型应用时用来统计网站的访问人数。由于代理服务器、缓存等的使用,唯一能帮助网站精确统计来访人数的方法就是为每个访问者建立一个唯一ID。使用Cookie,网站可以完成以下工作:

测定多少人访问过。测定访问者有多少是新用户(即第一次来访),多少是老用户。

测定一个用户多久访问一次网站。当一个用户第一次访问时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数。

9、exception 对象java.lang.Throwable

exception 对象的作用是显示异常信息,只有在包含 isErrorPage=”true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。

excepation对象和Java的所有对象一样,都具有系统提供的继承 结构。

exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

JSP之七大动作

jsp:include:在页面被请求的时候引入一个文件。动态包含,包含的是编译运行的结果
jsp:useBean:寻找或者实例化一个 JavaBean。
jsp:setProperty:设置 JavaBean 的属性。
jsp:getProperty:输出某个 JavaBean 的属性。
jsp:forward请求转发把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记
jsp.param: 传递参数

JSP的四个作用域

1.引入库

首先要声明一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。4个JSP内置对象的作用域分别为:application、session、request、page 。JSP内置对象作用域表如下:

application在所有应用程序中有效

session在当前会话中有效

request在当前请求中有效

page在当前页面有效

Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。作用域解释如下。

application 作用域

 如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
  • 1

application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:

Object getAttribute(String name) //从application中获取信息;
void setAttribute(String name, Object value) //向application作用域中设置信息。

session作用域

   session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。 
  • 1

session是通过HttpSession接口实现的,它提供的主要方法如下所示:

Object HttpSession.getAttribute(String name) //从session中获取信息。
void HttpSession.setAttribute(String name, Object value)//向session中保存信息。
HttpSession HttpServletRequest.getSessio() //获取当前请求所在的session的对象。

session的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置:

void setMaxInactiveInterval(int interval)

如果想主动让会话结束,例如用户单击“注销”按钮的时候,可以使用 HttpSession 的 invalidate()方法,用于强制结束当前session:void invalidate()

request作用域

 一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。
  • 1

Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:

void setAttribute(String name, Object value) //将对象value以name为名称保存到request作用域中。

Object getAttribute(String name) //从request作用域中取得指定名字的信息。

 JSP中的doGet()、doPost()方法的第一个参数就是HttpServletRequest对象,使用这个对象的 setAttribute()方法即可传递信息。那么在设置好信息之后,要通过何种方式将信息传给其他的Servlet呢?这就要用到RequestDispatcher接口的forward()方法,通过它将请求转发给其他Servlet。
  • 1

RequestDispatcher ServletContext.getRequestDispatcher(String path) //取得Dispatcher以便转发,path为转发的目的Servlet。

void RequestDispatcher.forward(ServletRequest request, ServletResponse response)//将request和response转发

 因此,只需要在当前Servlet中先通过setAttribute()方法设置相应的属性,然后使用forward()方法进行跳转,最后在跳转到的Servlet中通过使用getAttribute()方法即可实现信息传递。
  • 1

需要注意两点:

1、转发不是重定向,转发是在Web应用内部进行的。
2、转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。

page作用域

page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。

以上介绍的作用范围越来越小,request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)。

2.EL

EL总结
EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
EL不会抛出空指针异常,只会不显示
EL不会抛出数组越界异常,只会不显示
EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)

一、EL表达式简介
EL表达式全称:Expression Language,即表达式语言
EL表达式作用:代替JSP页面中表达式脚本进行数据的输出
EL表达式比JSP的表达式脚本简洁很多
EL表达式的格式是:${表达式} ,注:EL表达式写在jsp页面中,表达式一般是域对象的key
代码演示:在web目录下创建Test.jsp

<body>
    <%
        request.setAttribute("key", "value");		
    %>
    <%--  表达式脚本输出key1的值  --%>
    <%=request.getAttribute("key1")%>
    <%--  EL表达式输出key1的值  --%>
    ${key1}
    <%--  表达式脚本输出null值时页面显示null
          EL表达式输出null值时页面什么都不显示(空串)--%>
</body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

获取数据

EL表达式搜索域数据的顺序:
EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关。点 .是用来获取属性的,如果数据带有特殊符号,必须使用【】。

执行运算

EL中的运算符(empty)
1、先说说几个常用运算符
算术运算符:+、-、*、/、%(不支持++、–)
关系运算符:==、!=、>、>=、<、<=
逻辑运算符:!、&&、||、not、and、or
条件运算符:?:
取值运算符:[]、点号
2、empty运算符和not empty
用法为${empty 变量},结果为布尔值
3、三元运算
表达式 1?表达式 2:表达式 3
表达式1为真返回表达式2的值,表达式1为假返回表达式3的值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取web开发常用的对象
在这里插入图片描述

二、JSTL标签

1、什么是JSTL?

    JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已!

   如果你使用MyEclipse开发JavaWeb,那么在把项目发布到Tomcat时,你会发现,MyEclipse会在lib目录下存放jstl的Jar包!如果你没有使用MyEclipse开发那么需要自己来导入这个JSTL的Jar包:jstl-1.2.jar。
  • 1
  • 2
  • 3

2、JSTL标签库:

JSTL一共包含四大标签库:

core:核心标签库,我们学习的重点;
fmt:格式化标签库,只需要学习两个标签即可;
sql:数据库标签库,不需要学习了,它过时了;
xml:xml标签库,不需要学习了,它过时了。

3、使用taglib指令导入标签库:

除了JSP动作标签外,使用其他第三方的标签库都需要:

导包;
在使用标签的JSP页面中使用taglib指令导入标签库;
下面是导入JSTL的core标签库:

<%@ taglib prefix="c"uri=“http://java.sun.com/jstl/core” %>
prefix=“c”:指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;
uri=“http://java.sun.com/jstl/core”:指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;

4、core标签库常用标签:

(1)out和set标签

<c:out value=”aaa”/>

输出aaa字符串常量

<c:out value=”${aaa}”/>

与${aaa}相同

<c:out value=”${aaa}” default=”xxx”/>

当${aaa}不存在时,输出xxx字符串

<%

request.setAttribute(“a”,“”);

%>

<c:out value="${a }" default=“xxx” escapeXml=“false” />

当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

<c:set var=”a” value=”hello”/>

在pageContext中添加name为a,value为hello的数据。
  • 1

<c:set var=”a” value=”hello” scope=”session”/>

在session中添加name为a,value为hello的数据。

(2)remove标签

<%

               pageContext.setAttribute("a","pageContext");

               request.setAttribute("a","session");

               session.setAttribute("a","session");

               application.setAttribute("a","application");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

%>

<c: remove var="a"/>

<c: out value="${a}" default="none"/>
  • 1
  • 2
  • 3

删除所有域中name为a的数据!
<c:remove var=“a” scope=”page”/> 删除pageContext中name为a的数据

(3)url标签:该标签会在需要重写URL时添加。

<c:url value="/"/>

 输出上下文路径:/项目名/
  • 1

<c:url value="/" var=“a” scope=“request”/>

把本该输出的结果赋给变量a。范围为request
  • 1

<c:url value="/AServlet"/>

 输出:/项目名/AServlet
  • 1

<c:url value="/AServlet">

<c:param name=“username” value=“abc”/>

<c:param name=“password” value=“123”/>

 输出:/项目名/AServlet?username=abc&password=123

 如果参数中包含中文,那么会自动使用URL编码!                       
  • 1
  • 2
  • 3

(4)if标签:

if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

<c:set var=“a” value=“hello”/>
<c:if test=" n o t e m p t y a " > < c : o u t v a l u e = " {not empty a }"> <c:out value=" notemptya"><c:outvalue="{a }"/>
</c:if>

(5)choose标签:

choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容。

<c:set var=“score” value=" p a r a m . s c o r e " / > < c : c h o o s e > < c : w h e n t e s t = " {param.score }"/> <c:choose> <c:when test=" param.score"/><c:choose><c:whentest="{score > 100 || score < 0}">错误的分数: s c o r e < / c : w h e n > < c : w h e n t e s t = " {score }</c:when> <c:when test=" score</c:when><c:whentest="{score >= 90 }">A级</c:when>
<c:when test=" s c o r e > = 80 " > B 级 < / c : w h e n > < c : w h e n t e s t = " {score >= 80 }">B级</c:when> <c:when test=" score>=80">B</c:when><c:whentest="{score >= 70 }">C级</c:when>
<c:when test="${score >= 60 }">D级</c:when>
<c:otherwise>E级</c:otherwise>
</c:choose>

(6)forEach标签:

forEach当前就是循环标签了,forEach标签有多种两种使用方式:

使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {};
循环遍历集合,类似for(Object o : 集合);
循环变量:

<c:set var="sum" value="0" /> 
<c:forEach var="i" begin="1" end="10"> 
	<c:set var="sum" value="${sum + i}" /> 
</c:forEach>
<c:out value="sum = ${sum }"/>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10" step ="2">
	<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

遍历集合或数组方式:

<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

遍历List:

<%
	List<String> names = new ArrayList<String>();
	names.add("zhangSan");
	names.add("liSi");
	names.add("wangWu");
	names.add("zhaoLiu");
	pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

遍历Map:

<%
	Map<String,String> stu = new LinkedHashMap<String,String>();
	stu.put("number", "N_1001");
	stu.put("name", "zhangSan");
	stu.put("age", "23");
	stu.put("sex", "male");
	pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item" items="${stu }">
	<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。

count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前项目。

<c:forEach var="item" items="${ns }" varStatus="vs">
	<c:if test="${vs.first }">第一行:</c:if>
	<c:if test="${vs.last }">最后一行:</c:if>
	<c:out value="第${vs.count }行: "/>
	<c:out value="[${vs.index }]: "/>
	<c:out value="name: ${vs.current }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5、fmt标签库常用标签:

  fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。
  • 1

格式化时间:

<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>

<%
Date date = new Date();
pageContext.setAttribute(“d”, date);
%>
<fmt:formatDate value="${d }" pattern=“yyyy-MM-dd HH:mm:ss”/>
格式化数字:

<%
double d1 = 3.5;
double d2 = 4.4;
pageContext.setAttribute(“d1”, d1);
pageContext.setAttribute(“d2”, d2);
%>
<fmt:formatNumber value=" d 1 " p a t t e r n = " 0.00 " / > < b r / > < f m t : f o r m a t N u m b e r v a l u e = " {d1 }" pattern="0.00"/><br/> <fmt:formatNumber value=" d1"pattern="0.00"/><br/><fmt:formatNumbervalue="{d2 }" pattern="#.##"/>
介绍了JSTL中的常用标签,那可以定义自己的标签吗?

答案是:可以。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/140106
推荐阅读