J2EE进阶之JSP和EL表达式 十二

23 篇文章 0 订阅
13 篇文章 1 订阅

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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值