玩转JSP和JSTL

,简介

JSP:Java Server Page SUN 公司提供的 动态网页编程技术,是 Java Web 服务器端的 动态资源。它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java代码产生动态数 据的同时,也很容易对数据进行排版。不管是 JSP 还是 Servlet,虽然都可以用于开发动态 web 资源。但由于这 2门技术各自的特点,在长期的软件实践中,人们逐渐把 servlet 作为 web 应用中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用。其实 Jsp 就是一个Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。

.基础语法

1.注释

在 JSP 中支持两种注释的语法操作,一种是显示注释,这种注释是允许客户端看见的; 另一种是隐式注释,此种注释是客户端无法看见的

① 显示注释语法:从 HTML 风格继承而来

② 隐式注释语法:从 JAVA 风格继承;JSP 自己的注释

JSP 的三种注释方式:

1) // 注释,单行注释 /* 多行注释*/

2)<!-- HTML 风格的注释 -->

3)<%-- JSP 注释 --%>

2. Scriptlet

在 JSP 中最重要的部分就是 Scriptlet( 脚本小程序), 所有嵌入在 HTML 代码中的 Java 程序 都必须使用 Scriptlet 标记出来,在 JSP 中一共有三种Scriptlet 代码:

第一种:<% %>: java 脚本段,可以定义局部变量、编写语句

第二种:<%! %>:声明,可以定义全局(成员)变量、方法、类

 第三种:<%= %>:表达式,数据一个变量或具体内容

通过观察解析为 java 文件的 jsp 代码理解三种小脚本

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE >

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<%

String str = "Hello JSP";

System.out.println(str);

response.getWriter().write(str);

%>

<%!String memberStr = "a member String";%>

<%=memberStr%>

<h1>This is a JSP page!!</h1>

</body>

</html>

3. JSP 的指令标签

JSP 的指令标签用来控制整个 jsp 的行为,就当前 JSP 页面的某些方面对JSP 转换器作出指示。

1) page 指令

掌握使用 page 指令常用的属性 contentType 和 pageEncoding,分别用来指定 MIME 类型 和编码格式。import 属性,用来引入其他包,和 java 中 import

语句作用相同。

MIME 类型

<%@ page contentType=”text/html;charset=UTF-8”%>

手误<%@ page contentType=”test/html;charset=UTF-8”%>此时则变成下载文件字符编码

contentType 主要的功能是用来设置 MIME(页面响应类型),而

charset=”UTF-8” 指定了编码,利用 pageEncoding=”UTF-8”也能指定编码,前者更常用。

在 JSP 中,如果 charset 存在,那么 JSP 的编码由 charset 决定,而如果不存在才会由 pageEncoding 来决定,如果都不存在,则使用 ISO-8859-1 编码。

导包

page 指令中存在 import 属性,所以导包就可以正确使用了,在整个 page指令的属性中, 只有 import 语句可以多次出现,其他属性都只能设置一次。能导包意味着可以直接在 jsp 中 链接数据库。

<%@page import="java.util.*" import="java.io.*" %>

可以合为一句

<%@page import="java.util.* ,java.io.*" %>

2) include 静态包含

<%@ include file=”要包含的文件路径”%>相对路径

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

<%@include file="include.html"%>

静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样是在 servlet 引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起,全部放到_jspService 方法中),所以只生成了一个 servlet,所以两个页面不能有同名的变量。 运行效率高一点点。耦合性较高,不够灵活。

3) taglib 导入标签库

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 当使用到第三方标签库时需要通过 taglib 标签进行导入。

4. JSP 动作标签

动作标签,它们被编译成执行某个操作的 Java 代码,例如访问某个 Java 对象,或者调用某个方法。JSP 容器有自己支持的标准动作。除标准动作之外,还可以创建指定的标签, 用来执行某些操作。这些 jsp 的动作标签,与 html 提供的标签有本质的区别:

* 动作标签是由 tomcat(服务器)来解释执行!与 java 代码一样,都是在服务器端执行

* html 由浏览器来执行!

格式如下:

include 动态包含

include 动作用于动态地包含另一个资源,它可以包含另一个 JSP 页面、一个 Servlet 或 者一个静态的 HTML 页面。使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,

改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。

方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容

方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,以后使用的时候直接 导入进来很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在 JSP 中如果要想实现包含的操作,有两种做法: 静态包含、 动态包含,静态包含使用 include 指令即可,动态包含则需要使用 include 动作标签。

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。

<jsp:include page="include.jsp"></jsp:include>

注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!

<jsp:include page="include.html"></jsp:include>

<%

String a = "hello.jsp";

%>

<jsp:include page="<%=a%>"></jsp:include>

使用动态包含还可以通过在页面之间传参。接收参数通过

request.getParameter(name)来完成

jsp:include page="hello.jsp" flush="true">

<jsp:param name="school" value="shsxt"/>

</jsp:include>

<%=request.getParameter("school")%>

注意:有些对象在 JSP 中能够直接使用,可以通过观察.java 代码知道。目前我们只需要知道 request,response,session,application 可以直接使用即可。

. 九大内置对象

通过解析后的 jsp 文件查看即可

1.request 对象

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

2.response 对象

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

3.session 对象

session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。session 对象内部使用 Map 类来保存数据,因此保存数据的格式为“Key/value”。 session 对象的 value 可以是复杂的对象类型,而不仅仅局限于字符串类型。

4.application 对象

application 对象可将信息保存在服务器中,直到服务器关闭,否则

application 对象中保存的信息会在整个应用中都有效。

与 session 对象相比,application 对象生命周期更长,类似于系统的“全变量”。

5.out 对象

out 对象用于在 Web 浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6.pageContext 对象

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的 out. request. reponse. session. application 等对象。pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。

7.config 对象

config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象的 getServletConfig() 方法可以获取一个 config 对象。当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个Servlet。开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

8.page 对象

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

9.exception 对象

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true"的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。excepation 对象和 Java 的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

四、EL 表达式

1. EL 语法和使用

EL(Expression Language) 是为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更 加简化。

语法结构非常简单: ${expressio}EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。域对象的概念在 JSP 中一共有四个:pageContext, request, session, application;范围依次是,本页面,一次请求, 一次会话,整个应用程序。而 EL 默认的查找方式为从小到大查找,找到即可。当域对象全 找完了还未找到则返回空字符串””。

当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope, requestScope, sessionScope, applicationScope。

2. EL 运算

使用 EL 表达式可以用来判断集合中是否有元素 ${empty list}

1) List 遍历

<%List<String> list = new ArrayList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

request.setAttribute("list", list);

%>

${empty list}

<br /> ${list[1] }

<br />

2) 访问 map

这里使用到了 el 的另一种取值方式[“”]

<%

Map map = new HashMap();

map.put("aaa", "111");

map.put("bbb", 2222);

map.put("ccc-a", 333);

request.setAttribute("map", map);

%>

${empty map} ${map.aaa }

<br /> ${map["bbb"]}

<br /> ${map["ccc-a"]}

3) 做 做+ 、- 、* 、/( 也可以使用 div 来表示) 、% 、==

<%

String a = "aaa";

String b = "aaa";

%>

<%=a == b%>

${4 div 2 }

<br />

注意:String 也使用==比较

<%

request.setAttribute("a", 10);

request.setAttribute("b", 10);

%>

 <h2>${a+b }</h2>

<h2>${a==b }</h2>

<%

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

request.setAttribute("b", "aaaa");

%>

<h2>${a==b }</h2>

 

JSTL

.简介

Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。我们现在只讨论 JSTL 中最重要的标签,迭代集合以及格式化数字和日期几个标签。

核心标签库:http://java.sun.com/jsp/jstl/core 包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。

格式化标签库:http://java.sun.com/jsp/jstl/fmt 用来格式化显示数据的工作比如:对不同区域的日期格式化等。为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令:

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

例如:<%@taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相似;所以,建议使用事先设计好的前缀。此时需要导入两个 jar 包.直接放入 Tomcat 的 lib 目录下即可。

.标签的使用

1. 条件动作标签

条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在 Java是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标可以执行条件式动作指令:if、 choose、when 和 otherwise。

1) if 标签

if 标签先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容,测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用Boolean 对象。可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。

if 的语法有两种形式:没有主体内容、有主体内容

没有主体内容

该情况下:var 指定的限域变量由同一个 JSP 页面中后面的标签测试所决定。

有主体内容

主体内容为 JSP,若测试条件为 true,则处理 JSP。JSTL 中没有 else 标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为 相反的条件。

2) choose 、when 和 otherwise 标签

choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。也就是说:他们为相互排斥的条件式执行提供相关内容。choose 标签内容部必须嵌有一个或多个 when 标签, 每个 when 标签代表可以进行运算和处理的一种情况。otherwise 标签用于默认的条件代码 块,如果所有的 when 标签的测试条件运算结果都不为 true,就会执行该代码块。如果有 otherwise 标签,它必须放在最后一个 when 标签之后,否则会报错。

choose 和 otherwise 标签没有属性,when 标签则必须使用 test 属性设定一个条件,用于确定是否处理主体内容。

2. 迭代标签

forEach 标签

forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所 有的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可 以迭代 java.util.Iterator 和 java.util.Enumeration,但

不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者Enumeration 都不能重置(reset)。 各属性含义如下:varStatus 属性的使用:

forEach 的语法有两种形式:

将 body 内容重复一定的次数 :

用于迭代一个对象集合:

<%

List list = new ArrayList();

for (int i = 0; i < 10; i++) {

list.add("A:" + i);

}

pageContext.setAttribute("li", list);

%>

<table>

<tr>

<td>List内容</td>

<td>当前下标</td>

<td>成员总数</td>

<td>/first成员</td>

<td>/否为last成员</td>

</tr>

<c:forEach items="${li}" var="item" begin="0" end="9" varStatus="idx">

<tr>

<td><b>${item}</b></td>

<td>${idx.index}</td>

<td>${idx.count }</td>

<td>${idx.first }</td>

<td>${idx.last}<br /></td>

</tr>

</c:forEach>

</table>

内容主体为 JSP,对于每一次迭代,forEach 标签都会创建一个限域变量,其名称通过 var 属性设置。利用 forEach 迭代一个 Map,分别利用 key 和value 属性引用一个 Map 键和一个 Map 值。

<%

Map map = new HashMap();

map.put("map1", "shsxt");

map.put("map2", "bjsxt");

map.put("map3", "sxt");

pageContext.setAttribute("map", map);

%>

<c:forEach items="${map}" var="myMap">

${myMap.key}:

${myMap.value}<br />

</c:forEach>

3. 格式化动作指令

JSTL 提供了格式化和解析数字和日期的标签,我们讨论里面有:

formatNumber、formatDate、parseNumber 及 parseDate。

1) formatNumber 标签

matNumber 标签 该标签用指定的格式或精度来格式化数字,<fmt:formatNumber>标签有如下属性: 使用该标签时,有两种语法:

没有主体内容

有主体内容

2) formatDate 标签

使用指定的风格或模式格式化日期和时间,<fmt:formatDate>标签有如下属性:pattern 属性指定更精确的处理日期:

3) parseNumber 标签

利用 parseNumber 标签可以将数字、货币或百分比的字符串表示法解析成指定语言环 境的数字。即解析一个代表着数字,货币或百分比的字符串。两种语法形式:

没有主体内容

使用主体内容<fmt:parseNumber>标签有如下属性

4) parseDate 标签

此标签为指定区域解析日期和时间的字符串表示法。即解析一个代表着日期或时间的字 符串。两种形式:

没有主体内容

使用主体内容

posted @ 2020-01-02 16:04  数据阮小白  阅读(221)  评论(0编辑  收藏  举报