JSP和EL表达式
一、JSP
0、JSP概述
JSP:Java Server Pages的缩写。也是SUN公司推出的动态web资源开发技术。JSP规范,一般Servlet/JSP规范,因为JSP就是Servlet。
1、Servlet VS JSP
a、HTML
一些标记,不能写java代码。注重的显示。
b、Servlet
java代码,也能输出html的内容,但是相当麻烦。注重的代码逻辑。
c、JSP
HTML+Java代码。
2、JSP原理
a、JSP的执行过程
被翻译后和编译后的文件(被翻译成了一个Servlet)可以在Tomcat\work\目录中找到
提醒:学好JSP的关键,在于是否学好Servlet。学习JSP时,要经常查看对应的源码。
**重要:最佳的开发实践。
Servlet:控制器来使用。尽量只写java代码
JSP:作为显示模板来使用。尽量少些java代码。**
3、JSP的语法(很重要,但实际开发很少用)
a、JSP模版元素
指在JSP中写的HTML。开发中最好先把JSP中的html写好。定义了网页的基本骨架,即定义了页面的结构和外观。
b、JSP脚本表达式
语法:<%=jsp表达式%>
作用:用于向界面输出程序执行的结果
1 <%@page import="java.util.Date"%>
2 <%@ page language="java" contentType="text/html; charset=UTF-8"
3 pageEncoding="UTF-8"%>
4
5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>输出当前服务器时间</title>
10 </head>
11 <body>
12 <%
13 Date now = new Date();
14 //out.write(now.toLocaleString());
15 %>
16 <%=now %>
17 </body>
18 </html>
结果:
在生成的java源文件中可以看到<%=now%>相当于:
c、JSP脚本片断
语法: <%
java语句1;
java语句2;
%>
作用:在JSP中书写java逻辑(尽量少些)
分片书写:
d、JSP声明 加一个叹号
语法:<%!
java代码;
%>
作用:定义JSP对应Servlet的成员。
在翻译的java文件这样展示:
e、JSP注释
语法:<%–这是注释–%>
作用:把代码注释掉。注释掉的代码,服务器根本不翻译更不执行。
注意:与HTML注释的区别。 而HTML的注释代码还会执行
4、JSP的指令
a、作用:不是给JSP用的。给JSP引擎(服务器)用的。一般都写在JSP页面的顶部,但不是必须的。
b、基本的语法:<%@ 指令名称 属性1=”值1” 。。。%>
c、JSP中一共有三个指令:page include taglib尖括号内都用@开头。
c.1、page指令:(属性很多,需要大家都了解,实际使用很少)
属性:
- language:告知服务器,JSP中嵌入的脚本使用的语言。默认是java,只能是java。
- extends:告知服务器,JSP对应的Servlet应该继承的父类。不需要改。
- *import:导入JSP中java脚本使用的java类所在的包。
- *session:是否创建HttpSession对象。默认是true。
- *buffer:指定JspWriter的缓存大小。默认是8Kb。
- isThreadSafe:过时了。
- *errorPage:告知服务器,当前页面出现异常后,转发到的页面地址。地址如果以”/”开头,/就代表着当前应用。
也可以配置全局错误消息页面:在web.xml中配置
- isErrorPage:告知服务器,是否产生exception对象。
- *contentType:告知服务器,输出的正文的MIME类型。相当于response.setContentType()
- *pageEncoding:告知服务器,翻译JSP时使用的编码。只写这个就行,存储,翻译,输出,告知客户端都用这个编码。
有contentType的作用。 - isELIgnored:告诉服务器,是否忽略EL表达式。false不忽略,默认值。
c2、include指令
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file=“被包含组件的绝对URL或相对URL”%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
细节:
被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名 。
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)
c3、taglib指令
Taglib指令用于在JSP页面中导入标签库,在自定义标签会详细讲解
作用:导入外部标签库
uri:标签库中定义的名称空间
prefix:引用名称空间的短名称
5、JSP的常用内置标签(动作元素)
jsp:include:动态包含
jsp:forward:转发
Jsp:param提交数据到05.jsp
6、JSP的九个隐式对象
通过pageContext获得其他对象
- getException方法返回exception隐式对象
- getPage方法返回page隐式对象
- getRequest方法返回request隐式对象
- getResponse方法返回response隐式对象
- getServletConfig方法返回config隐式对象
- getServletContext方法返回application隐式对象
- getSession方法返回session隐式对象
- getOut方法返回out隐式对象
- pageContext封装其它8大内置对象的意义,思考:如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将具有什么功能?
pageContext作为域对象
- pageContext对象的方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name) - pageContext对象中还封装了访问其它域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope) - 代表各个域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE - findAttribute方法 (*重点,查找各个域中的属性) EL表达式
测试demo
2.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10 <%
11 //当前只能在本页面才能获取数据
12 pageContext.setAttribute("p", "pp");
13 //pageContext.setAttribute("haha", "phaha", pageContext.PAGE_SCOPE);
14
15
16 request.setAttribute("p", "rp");
17 // pageContext.setAttribute("p", "rp",PageContext.REQUEST_SCOPE);
18
19 session.setAttribute("p", "sp");
20 // pageContext.setAttribute("p", "sp",PageContext.SESSION_SCOPE);
21
22 application.setAttribute("p", "ap");
23 // pageContext.setAttribute("p", "ap", PageContext.APPLICATION_SCOPE);
24 //request.getRequestDispatcher("/3.jsp").forward(request, response);
25 response.sendRedirect(request.getContextPath()+"/3.jsp");
26 %>
27 </body>
28 </html>
3.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10 1page:<%=pageContext.getAttribute("p")%><br/>
11 2request:<%=request.getAttribute("p")%><br/>
12 3session:<%=session.getAttribute("p")%><br/>
13 4application:<%=application.getAttribute("p")%><br/>
14 5find:<%=pageContext.findAttribute("p")%>
15 </body>
16 </html>
request.getRequestDispatcher结果:
response.sendRedirect结果:
获取其他八个隐式对象的引用:
提供了转发和包含的简易方法
RequestDispatcher rd = request.getRequestDispatcher(url);
rd.include(request,response);
void include(String path)
void forward(String path)
7、四大域对象
二、EL表达式
1、作用
- 替换JSP中的JSP表达式<%=%>。用来输出数据到页面上的。
- 基本语法形式:${EL表达式}。官方推荐表达式请使用EL。(Since JSP2.0)
- 前提:EL表达式只能获取四大域对象中的属性数据。
特别提醒:不要把EL表达式的变量和JSP中java中的变量混淆。
2具体的功能说明
2.1获取数据:
前提:获取四大域对象的数据
JavaBean属性的获取:
**特别提醒:
EL中不会出现空指针和数组越界异常。但是,对象存在,调用没有的getter属性,会报错**。List元素的获取
[]中括号运算符,可以按照索引取数据。完全可以替代点运算符
- Map的value的获取
2.2执行运算
- 数学运算、关系运算、逻辑运算
empty运算符:
- 三元运算符:
**特别提醒:
EL表达式不支持字符串连接操作**
2.3EL内置对象11个
${}直接可以使用的对象叫EL隐式对象。
提醒:不要和JSP的隐式对象混淆
测试demo
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <title>EL隐式对象</title>
7
8 <meta http-equiv="pragma" content="no-cache">
9 <meta http-equiv="cache-control" content="no-cache">
10 <meta http-equiv="expires" content="0">
11 <!--
12 <link rel="stylesheet" type="text/css" href="styles.css">
13 -->
14
15 </head>
16
17 <body>
18 当前应用:<%=request.getContextPath()%><br/>
19 当前应用:${pageContext.request.contextPath}<br/>
20 SessionID:${pageContext.session.id}<br/>
21 <hr/>
22 <%
23 pageContext.setAttribute("p", "pp");
24 request.setAttribute("p", "rp");
25 session.setAttribute("p", "sp");
26 application.setAttribute("p", "ap");
27 %>
28 1:${p}<br/>
29 2推荐:${sessionScope.p}<br/>
30 <hr/>
31 <!-- http://localhost:8080/day11_03_el/4.jsp?username=abc -->
32 单一请求参数:${param.username}<br/>
33 <!-- http://localhost:8080/day11_03_el/4.jsp?username=abc&username=cba -->
34 重名请求参数:${paramValues.username[0]}----${paramValues.username[1]}<br/>
35 <hr/>
36 单一请求消息头:${header['Accept-Encoding']}<br/>
37 重名请求消息头:${headerValues['Accept-Encoding'][0]}<br/>
38 <hr/>
39 <!--
40 <context-param>
41 <param-name>encoding</param-name>
42 <param-value>AABCDDE</param-value>
43 </context-param>
44 -->
45 ${initParam.encoding}<br/>
46 <hr/>
47 ${cookie}<br/>
48 cookie的value:${cookie.JSESSIONID.value}<br/>
49 </body>
50 </html>
2.4调用普通类的静态方法(EL函数)
前提:只能调用静态方法
- 开发步骤:和日后学习的自定义标签的步骤是一样的
- 定义功能类,编写静态方法
- 在WEB-INF目录下建立一个扩展名为tld(Tag Libary Definition)的xml配置文件。
- 从其他地方复制值头和其他内容。El表达式调用函数,会找到所在的类,再找其方法
- 可选步骤:tld没有在WEB-INF中,其他目录。修改web.xml
tld在WEB-INF目录,或者是classpath中的jar包的META-INF目录中,即可省略该步骤。
- 在JSP中使用:先使用taglib指令导入标签库
3、标准的EL函数:(JSTL中的Functions)
JSTL:Java Standard Tag Libary
是JSP2.0开始的标准,由apache实现的。
由5部分组成:
core:核心
format:格式化或国际化
sql:操作数据库,不讲
xml:操作xml,不讲
functions:EL函数 。
使用JSTL中的EL函数,首先导入JavaEE的jar包到classpath中,在MyEclipse中,省了。
通过指令导入函数库
<%@ taglib uri=”http://java.sun.com/jsp/jstl/functions” prefix=”fn”%>
具体函数的使用:基本上都是与字符串有关。
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <title>JSTL之EL函数</title>
7
8 <meta http-equiv="pragma" content="no-cache">
9 <meta http-equiv="cache-control" content="no-cache">
10 <meta http-equiv="expires" content="0">
11 <!--
12 <link rel="stylesheet" type="text/css" href="styles.css">
13 -->
14
15 </head>
16
17 <body>
18 <%pageContext.setAttribute("data", "<hr/>"); %>
19 ${fn:escapeXml(data)}
20 </body>
21 </html>