目录:
第一章:网页开发基础(无)第二章:Java Web概述第三章:Servlet基础第四章:请求与响应第五章:会话及其会话技术第六章:JSP技术第七章:EL表达式和JSTL第八章:Servlet的高级特性第九章:JDBC第十章:数据库连接池与DBUtils工具第十一章:JSP开发模型第十二章:文件的上传和下载为了降低JSP页面的复杂度,增加代码的重用性,Sun公司制定了JavaBean技术、标准标签库JSTL和EL表达式等,大大简化了开发的难度
JavaBean是Java开发语言中一个可以重复使用的软件组件,它本质就是一个Java类。
在JSP的开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁。JSP搭配JavaBean来使用,有以下的优点:
可将HTML和Java代码分离,这主要是为了日后维护的方便。如果把所有的程序代码(HTML和Java)写到JSP页面中,会使整个程序代码又多又复杂,造成日后维护上的困难。
可利用JavaBean的优点。将日常用到的程序写成JavaBean组件,当在JSP要使用时,只要调用JavaBean组件来执行用户所要的功能,不用再重复写相同的程序,这样一来也可以节省开发所需的时间。
JavaBean是一个数据的容器,它序列化后可以负责传递数据,也可以存放一些重复使用的代码,例如数据库查询工作,可以大大减少JSP页面和Servlet的代码量,使代码更具有可读性。
JavaBean本身就是一个类,属于Java的面向对象编程。
在JSP中如果要应用JSP提供的Javabean的标签来操作简单类的话,则此类必须满足如下的开发要求:
(1) 所有的类必须放在一个包中; (2) 所有的类必须声明为public class,这样才能够被外部所访问; (3) 类中所有的属性都必须封装,即:使用private声明; (4) 封装的属性如果需要被外部所操作,则必须编写对应的setter、getter方法; (5) 一个JavaBean中至少存在一个无参构造方法,此为JSP中的标签所使用。
一个简单的JavaBean: package com.Rolin.javabean; public class JavaBean{ private String name; private int age; public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } }如果在一个类中只包含属性、setter、getter方法,那么这种类就成为简单JavaBean。
对于简单的JavaBean也有几个名词: (1)VO:与简单Java对象对应,专门用于传递值的操作上 (2)POJO:简单Java对象 (3)TO:传输对象,进行远程传输时,对象所在的类必须实现java.io.Serializable接口。除了使用import的语句之外,也可以使用JSP中提供的:<jsp:useBean>指令完成操作,指令的操作语法如下所示:
<jsp:useBean id="实例化对象名称" scope=“保存范围” class=“包.类名称“/>主要属性 (1)id:表示实例化对象的名称 (2)scope:表示此对象保存的范围,一共有四种属性范围:page、request、session、application (3)class:对象所对应的包.类名称
示例
<%@ page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="simple" scope="page" class="com.Rolin.javabean"/> <html> <head><title>专业开发者社区</title></head> <body> <% simple.setName("Rolin"); simple.setAge(23); %> <h3>姓名:<%=simple.getName()%></h3> <h3>年龄:<%=simple.getAge()%></h3> </body> </html> JavaBean的实现原理 依靠的是反射机制完成的,在使用<jsp:useBean>指令时需要定义对象所在的“包.类“名称,而且又要求类中存在无参构造方法,这就是反射操作的前提条件 所以<jsp:useBean>的语法实际上属于反射机制的操作实现。在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写需要多Java代码,这样的做法会使JSP页面混乱,不利于维护 为此 JSP2.0 规范中提供了EL表达式(Expression Language)
EL表达式是一种JSP技术,能够代替原本使用Java代码的语句,使得代码更加容易编写与维护。
最基本的语法是${express}
EL表达式原理: EL表达式在获取某个对象的属性值时,先将某个属性值首字母变成大写,然后加上get前缀,拼接成getter方法,通过反射将对象构建出来,然后执行该对象的getter方法。 所以JavaBean的属性名要小写,且要有getter方法,不然会报错
在EL表达式中,经常需要一些符号来标记一些名称,例如变量或自定义函数名等,这些符号被称之为标识符。
EL表达式中的标识符可以有任意大小写字母、数字和下划线组成,为了避免出现非法标识符,还要注意遵循以下规范:
不能以数字开头不能是EL中的保留字不能说EL隐式对象不能包含单引号、双引号、减号和正斜杠等特殊字符保留字就是编程语言里实现定义好并赋予特殊含义的单词
和其他语言一样EL表达式也定义了许多保留字,具体如下:
and eq gt true instanceof or ne le false empty not lt ge null div mod这些保留字都不能被作为标识符,否则程序编译时会出错
EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上
具体示例: ${product}product就是一个变量。EL表达式中的变量不用事先定义就可以直接使用,例如${product}就可以直接访问product的值
语法:${运算表达式}
常见运算符:==(eq) !=(ne) <(lt) >(gt) <=(le) >=(ge) &&(and) ||(or) !(not)
判断是否为空:${empty name } 如果name不存在或者为null,则返回true
三目运算符:${name == null?“null”:name }
除了用.方式获得对象的属性,也可以用[ ]方式,当然遇到键值名字中有-的,如peicai-liang,或者key值为数字开头,则只能用[ ]方式:
${person['name']} <!-- 也可以用[]方式 --> ${person['peicai-liang']} 从List集合对象中获取某个值并显示。 <% List<Person> list = new ArrayList<Person>(); list.add(new Person("kkk")); list.add(new Person("sss")); list.add(new Person("jjj")); application.setAttribute("list_1", list); %> ${list_1[1].name } 从Map键值对对象中获取某个值并显示 <% Map map = new HashMap(); map.put("a", new Person("aaa")); map.put("b", new Person("bbb")); map.put("1", new Person("ccc")); request.setAttribute("map", map); %> ${map['1'].name } <!-- 是数字的话只能用括号,就算put进去的key值是字符串类型--> ${map.a.name }Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用 于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库 操作等。
JSTL虽然被称为标准标签库,但实际上是由五个不同功能的标签库共同组成的。 JSTL包含的标签库如下:
标签库标签库的URL前缀Corehttp://java.sun.com/jsp/jstl/CorecI18Nhttp://java.sun.com/jsp/jstl/fmtfmtSQLhttp://java.sun.com/jsp/jstl/sqlsqlXMLhttp://java.sun.com/jsp/jstl/xmlxFunctionshttp://java.sun.com/jsp/jstl/functionsfn Core是一个核心标签库,它包含了实现Web应用中通用操作的标签。例如用于输出的<c:out>,用于迭代循环的<c:forEach>等I18N是一个国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签。例如设置JSP页面的本地信息、设置JSP页面的时区等SQL是一个数据库标签库,它包含了用于访问数据库和对数据库中的数据进行操作的标签。例如从数据库获得数据库连接、检索数据等。但JSP页面很多时候仅作为表示层,一般不会在JSP页面中操作数据库XML是一个操作XML文档的标签库,它包含对XML文档中的数据进行操作的标签、例如解析XML文件、输出XML文档内容、迭代XML文档中的元素等,广泛用于Web开发。Functions是一个函数标签库。他提供了一整套的自定义EL函数,包含了JSP页面制作者常用的字符串操作,例如提取字符串中的子字符串、获取字符串的长度等。要想在JSP页面中使用JSTL,首先需要安装JSTL。
下载JSTL 包括两个 JAR 文件,jstl.jar 和 standard.jar 是什么没有必要管,重在应用 ( 1+1 ? =2 ,我们没有必要深究,只需要知道这么用就行。) 可以在Apache的网站下载JSTL的JAR包:点击进入其中,jstl.jar 包含了JSTL规范中定义的接口和相关类 standard.jar文件包含用于实现JSTL的class文件以及5个标签库的描述符文件
配置JSTL 将jstl.jar 和 standard.jar 这两个文件复制到项目的lib目录下即可在JSP页面中使用<%@ taglib url="http://java.sun.com/jsp/jstl/Core" prefix="c" %>导入Core标签库编写一个简单的JSP页面,其中含有<c:out value="Hello World!"></c:out>,如果浏览器正确输出Hello World!则配置完毕该标签可以将一段文本内容或者表达式的结果输出到客户端,如果文本内容包含需要转义的字符,则默认会对他们进行HTML编码转化后再输出
语法格式([]里的参数可选) 没有标签体的情况<c:out value="value" [default="defaultValue"] [escapeXml="true"] /> 有标签体的情况<c:out value="value" [escapeXml="true"]> defaultValue </c:out> 属性 value属性用于指定输出的文本内容default属性指定value值为null时的默认值,如果没有该属性,则输出空字符串escapeXml属性用于指定是否将特殊字符转义,默认为true<c:if>标签
如果要在JSP页面进行条件判断,就需要使用Core标签库提供的 <c:if> 标签,专门用于JSP页面的条件判断
语法格式(scope参数可选) 没有标签体的情况<c:if test="testCpndition" var="result" scope="session"> 2.有标签体的情况<c:if test="testCondition" var="result" scope="session"> body content </c:if> 属性 test 属性用于设置逻辑表达式var 属性用于指定逻辑表达式中变量代码名字scope属性用于指定var变量的作用范围默认值为page,如果属性test的计算结果为true,那么标签体将被执行 示例: <body> <c:set value="1" var="visitCount" property="visitCount" /> <c:if test="${visitCount==1 }"> This is you first visit. Welcome to the site! </c:if> </body><c:choose> <c:when> <c:otherwise>标签
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。
<c:choose>标签没有属性,他的标签体中只能嵌套一个或多个<c:when>标签和零个或一个 <c:otherwise>标签。
<c:when> 只有一个test属性,该属性的值为boolean类型,其值可以是一个条件表达式,如果条件表达式的值为true ,则执行标签体内容。
<c:otherwise>标签没有属性,类似于switch语句中的default关键字,用于输出不满足上述条件时的默认输出选项
示例
<body> <c:choose> <c:when test="${empty param.username}"> unKnown user. </c:when> <c:when test="${param.username=='rolin'}"> ${ param.username} is manager. </c:when> <c:otherwise> ${ param.username} is employee. </c:otherwise> </c:choose> </body><c:forEach>标签
forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。
语法:
迭代包含多个对象的集合(只有 items 是必写属性)<c:forEach items="collection" var="varName" varStatus="varStatusName" begin="begin" end="end" step="step"> 迭代指定范围内的集合(只有 begin 和 end 是必写属性)<c:forEach var="varName" varStatus="varStatusName" begin="begin" end="end" step="step"> boby content </c:forEach>属性
var属性用于指定将当前迭代到的元素保存到Page域中的名词items属性用于指定将要迭代的集合对象varStatus属性用于指定当前迭代状态信息的对象保存到page域中的名称begin属性用于指定从集合的第几个元素开始迭代,索引值从0开始、如果没有指定items的值,则从begin指定的值开始迭代,直至迭代结束step属性用于指定迭代的步长,即迭代因子的增量示例
<!-- forEach标签两种作用, 1,将主体内容循环多次 2,迭代集合 --> <!--将主体内容循环多次 --> <c:forEach var="i" begin="1" end="7"> <!--var:用来存放现在被指到的对象,begin开始的位置,end结束的位置 --> 主体内容:${i } </c:forEach> <!--结果为:主体内容:1 主体内容:2 主体内容:3 主体内容:4 主体内容:5 主体内容:6 主体内容:7 主体内容 --> <!-- 迭代集合 --> <!-- list --> <% List<String> list = new ArrayList<String>(); list.add("xiaoyan"); list.add("lingdong"); list.add("yefan"); request.setAttribute("list", list); %> <c:forEach items="${list}" var="str" varStatus="status" > ${str }:${status.index }:${status.count }:${status.first }:${status.last } <!--index表示索引,count表示出现的位数,first表示是否是第一个,last表示是否是最后一个 --> </c:forEach> <!--map --> <% Map<String,Object> map = new HashMap<String,Object>(); map.put("user1",new User("zs","123")); map.put("user2", new User("ls","1234")); request.setAttribute("map",map); %> <c:forEach items="${map}" var="user"> ${user.key }:${user.value } ${user.value.uname } ${user.value.upwd } </c:forEach> 补充 <c:forEach>标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合取出元素的状态信息。 使用<c:forEach>标签的varStatus标签可以获取以下信息: count: 表示元素在集合中的序号,从1开始计数index: 表示当前元素在集合中的索引,从0开始技术first : 表示当前元素是否为集合中的第一个元素last: 表示当前元素是否为集合中最后一个元素 例子: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.*"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head></head> <body style="text-align: center;"> <% List userList = new ArrayList(); userList.add("Tom"); userList.add("Make"); userList.add("Lina"); %> <table border="1"> <tr> <td>序号</td> <td>索引</td> <td>是否为第一个元素</td> <td>是否为最后一个元素</td> <td>元素的值</td> </tr> <c:forEach var="name" items="<%=userList%>" varStatus="status"> <tr> <td>${status.count}</td> <td>${status.index}</td> <td>${status.first}</td> <td>${status.last}</td> <td>${name}</td> </tr> </c:forEach> </table> </body> </html>用于设置范围变量的值或者 javabean 对象的属性。
看个实际例子:
<c:set var=”username” value=”lisi” scope=”session”/>这样就相当于设置了 session 。
<c:remove> 相对 <c:set> 其作用是移除范围变量。<c:remove var=”nusername” scope=”session”/> <c:catch>用于捕获在其中嵌套的操作所抛出的异常对象,并将异常信息保存到变量中。
我们将有可能抛出异常的代码放置到开始标签 <c:catch> 和结束标签 </c:catch> 之间。如果其中代码出现异常,异常对象将被捕获,保存在 var 声明的变量中,该变量总是有 page 范围。如果没有发生异常,而 var 所标识的范围变量将被移除。 如果没有指定 var 属性,异常只是简单的被捕获,异常信息并不会被保存。
<c:catch var=”exception”> <% int i = 5; int j = 0; int k=i/j; %> </c:catch> <c:out value=”${exception}” /><br> <c:out value=”${exception.massage}”/> <!-- 后一句相当于: exception.getMessage() --> <c:redirect> 该标签用于重定向 语法:<c:redirect url="/web/nav/projects.html" />