SP的概念
Java Server Pages
Servlet简化设计,逻辑与界面设计分开,开发更方便;
HTML语法的java 扩展,加入新的标签(<%, %>,…);
强大的组件(Java Bean)支持功能;
JSP语法概述
JSP原始代码中包含了JSP元素和Template(模板) data两类
Template data指的是JSP引擎不处理的部分,即标记<%……%>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端的浏览器

JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误。

(一)JSP简介
1.servlet和JSP(JavaServer Page)
– 已成为开发电子商务等动态网站的首选技术,它们都是运行在服务器上的Java程序
– servlet
HTML的编写和维护都比较困难,使用print语句生成HTML并不容易,非Java开发人员很难处理这些HTML
– JSP
静态内容的输出都采用标准的HTML,只用java语言编写页面中生成动态内容的代码
提供了对Java编程语言以及针对动态部分的servlet技术的完全访问
JSP
– 简单的说,就是嵌入了Java代码的HTML,由静态HTML、专用的JSP标签和Java代码组成
– 服务器端的技术。在后台被自动转换成servlet
– 仅在修改后的第一次被访问时,才会被转换成servlet并进行编译,创建JSP唯一的一个一实例
JSP文件在服务器的部署
– 可以和常规的HTML页面放在相同的目录中,并使用和常规HTML相同的URL访问它们
– 除了不允许将WEB-INF和META-INF作目录名之外,可以使用任何喜欢的目录名
– Tomcat中JSP的默认目录是install_dir/webapps/ROOT,我们只要把编写好的JSP文件直接放在此目录下即可
例如install_dir/webapps/ROOT/SomeDirectory/SomeFile.jsp 则对应的URL为http://host:port/SomeDirectory/SomeFile.jsp
2.JSP语法概述
除了标准的HTML以外,JSP主要包括三类组件
– 脚本元素(scripting elements)
使你可以向JSP文件产生的servlet文件中插入代码
– 指令标签(directives)
将影响由JSP页产生的servlet的总体结构
– 动作标签(actions)
影响JSP运行时的功能

(1)脚本元素
脚本元素——向JSP文件产生的servlet文件中插入代码,主要有三种形式
– 表达式<%= expression %>
<%和=之间不能有空格。expression必须能求值,服务器计算出值后以字符串形式发送到客户端显示
– 程序片<% code %>
一个JSP页面可以有许多,它们将被插入到生成的servlet文件的_jspService方法中
每次客户端请求都会新开一个线程,调用servlet的service方法,service方法再调用_jspService方法
–声明语句<%! Declaration %>
声明的内容包括变量和方法,将被插入到生成servlet的类体中,在_jspService方法之外,成为类变量和类方法,直到服务器关闭才被释放
当多个客户请求一个JSP页面时,多个线程将共享这些变量和方法,因而任何一个用户对这些变量操作的结果,都会影响到其他用户
(2)指令标签
–将影响由JSP页产生的servlet的总体结构
–其格式为<%@ directive attribute1="value1" , attribute2="value2" ,┄%>
directive代表指令名称
attribute代表该指令中可选的属性名称
value代表属性值并且总是用单引号或双引号括起来,要想在属性值value中输出引号,可在该引号前用一个反斜杠“\”
–在JSP中,有三种类型的指令
a.page指令
– 可放在文档内的任何位置,该指令对整个页面有效
– 可以定义一个或多个大小写敏感的属性,包括import、contentType、isThreadSafe、Session、buffer等
– import属性
为JSP页面引入Java核心包中的类,这样就可以在脚本部分使用这些类,如:<%@ page import="java.io.*" %>
可以为import属性指定多个值,这些值用逗号分割,这样就可以引入若干个包或类,如:<%@ page import="java.io.*", "java.awt.*", "java.util.Date"%>
JSP页面默认import属性已经有如下的值:"java.lang.*","javax.servlet.*","javax.servlet.jsp.*","javax.servlet.http.*“
除import属性外,Page指令的其它属性只能指定一个值
–contentType属性
定义JSP页面相应的MIME(Multipurpose Internet Mail Extension,多用途Internet 邮件扩展)类型和JSP页面字符编码
其属性使用以下两种格式之一
<%@ page contentType="MIME-Type ;charset=Character-Set"%>
或者
<%@ page contentType="MIME-Type"%>
例如
<%@ page contentType="application/vnd.m s-ex cel; charset=GB2312" %>
其属性默认值为
<%@ page contentType= "text/ html; charset=ISO-8859-1" %>
–isThreadSafe属性
用来设置JSP页面是否可多线程访问
设为true时,JSP页面能同时响应多个客户的请求
设为false时,同一时刻只能处理一个客户的请求,其它客户须等待
其默认值为true
–session属性
表示当前的JSP页面是否参与HTTP会话
设为true时,可以使用内置的javax.Servlet.HttpSession类型的一个名为session的对象
设为false时,则该对象不被创建
默认值为true
–buffer属性
指定jsp内置输出流out变量使用的缓冲区的尺寸,如果设置为none,则不使用缓冲区
默认值是8kb
out变量是JspWriter类型的,JspWriter是java.io.Writer类的子类。累计输出内容超过了这里设定的大小、完成了此页、或者输出被明确清除(如使用response. flushBuffer),文档才被发送给客户显示
例如<%@ page buffer="16kb" %>
–autoflush属性
控制out的缓冲区在装满时的处理,默认为true
设为true时,装满时则自动清除缓冲区
设为false时,装满后则会出现异常
buffer的值是none时将autoflush设为false是不合法的
–info属性
定义了一个通过getServletInfo方法可从servlet中检索到的串
格式为<%@ page info=" some Message" %>
–isErrorPage属性
指明当前页是否能充当其它JSP页面的错误页。采用以下两种格式之一
<%@ page isErrorPage="true" %>
或者
<%@ page isErrorPage="false"%> <%--Default --%>。
–errorPage属性
指定一个处理当前页未被捕获的任何异常的页面
格式为<%@ page errorPage="Relative URL" %>
–这个URL指定的错误页的isErrorPage属性必须被设为true方可使用
b.include指令
– 与page指令不同,该指令应该放在你想要将外部文件插入的位置,它可以将文件整体插入到该处
– 其格式为<%@ include file="fileName" %>
– Jsp文件被转换成servlet文件时,外部文件就被插入了,然后统一进行编译
– 当外部文件发生改变时,当前页面无法得到通知,要想得知外部文件的任何改变,当前页面必须重新编译,由上一节jsp的操作过程可知,必须重新保存该jsp文件
c.taglib指令
– JSP1.1规范中新增的
– 指定一个标记库,用于扩充标准的JSP标记集
– 完成三个任务
首先,它通知JSP服务器,页面使用一个标记库
其次,它指定包含标记库标志符的特殊jar文件的位置
最后,它指定一个用于唯一区分这些新标记的标记前缀
– 格式为:<%@ taglib uri="someuri " prefix="somename" %>
uri属性:一个引用标记库描述符文件(后缀名为TLD:Tag Library Descriptor)的绝对或相对URL
prefix属性:指定一个将要在TLD文件定义的标记名前面使用的前缀
如果TLD文件定义了一个名为tag1的标记,并且prefix属性的值设为test,那么实际的标记名将为test:tag1
(3)动作标签
–一种特殊的标签,影响JSP运行时的功能
–格式为
<jsp:action_name attribute1="value1" , attribute2="value2"┄/>
action_name代表动作名称
attribute代表属性名称
value代表属性值
–分为两类
a.Resource动作
– include动作标签
告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入,例如:<jsp:include page="someFile.html" />
–如果包含的是普通的文本文件,就将文件的内容发送到客户端,由客户端负责显示
–如果包含的是JSP文件,JSP引擎就执行这个文件,然后将执行的结果发送到客户端显示
–如果修改了被包含的文件,那么运行时将看到修改后的结果, 这一点和include指令不同
可结合param指令,向要包含的文件传送信息,被包含的文件通过JSP的内置对象request调用getParameter方法获得参数值。格式为:
<jsp:include page="someFile.jsp ">
<jsp:param name="someName" value="someValue" /> 
</jsp:include>
–forward动作标签
告诉JSP页面从该指令处停止当前页面的继续执行,而转向其他的一个页面,当前页面后边的内容将不被执行,例如:<jsp:forward page="somefile.jsp" />
该标签也可结合param指令,向要转到的页面传送信息,格式同include标签
–plugin动作标签
用于插入Applet或JavaBean到JSP页面,组件必须被下载到浏览器并且在客户端执行
param元素可以用于发送参数到Applet或JavaBean(一个可重复使用的软件组件,实际上就是一个Java类)如:
<jsp:plugin type="applet" code="A.class" width="120" height="120">
<jsp:param name="someName" value="someValue" /> 
<jsp:fallback>
prompt message
</jsp:fallback>
</jsp:plugin>
–当客户访问含该段代码的JSP文件时,如果客户端不支持applet,将导致下载Java plug插件,出现客户选择是否下载插件的界面。用户下载安装后,就可以使用Java虚拟机加载执行Java applet小应用程序A.class了
–fallback元素可用于指定组件失败时发送到客户端的错误信息字符串
b.JavaBean动作
– useBean动作标签
格式为
<jsp:useBean id=" bean的名字" class="创建bean的类" scope="有效范围" />
或者
<jsp:useBean id="bean的名字" class="创建bean的类" scope="有效范围" >
</jsp:useBean>
服务器将加载该bean类的一个对象
– setProperty动作标签
设置bean的属性
– getProperty动作标签
获取bean属性的值并输出
3.JSP内置对象
– 在JSP页面的脚本元素中,有些不用声明就可以使用的对象
– 包括out、request、response、session、application等
(1)out对象
– 是javax.servlet.jsp.JspWriter类的实例,JspWriter包含的方法大多数与java.io.PrintWriter类一样
– 这个输出流对象用来向客户端输出数据,其可调用的方法如下表
名称 解释
print(Boolean b)    输出一个布尔值
print(char c)       输出一个字符
print(double d)     输出一个双精度的浮点数
print(float f)      输出一个单精度的浮点数
print(long l)       输出一个长整型数据
print(String s)     输出一个字符串
newLine()           输出一个换行符
flush()             输出缓冲区里的内容
close()             关闭流
(2)request对象
– 是javax.servlet.http.HttpServletRequest的实例
– 客户每次请求页面时,JSP引擎创建一个request对象代表该请求
– 封装了用户提交的信息,这些信息包括
HTTP请求的请求行
HTTP头
信息体
– 调用相应的方法可以获取封装的信息,最常用的方法是request.getParameter(param_name)
名称 解释
getProtocal() 获取客户向服务器提交信息使用的通讯协议
getServletPath() 获取JSP文件的目录
getContentLength() 获取提交信息的长度
getMethod() 获取客户提交信息的方式,例如post或get
getHeaderNames() 获取头名字的一个枚举
getHeader(String s) 获取HTTP头文件中由s指定的属性的值,例如“content-type”,“cookie”等
getRemoteHost() 获取客户机的名称
getRemoteAddr() 获取客户机的IP地址
getServerName() 获取服务器的名称
getServerPort() 获取服务器的端口号
getParameterNames() 获取客户提交的信息体部分中所有参数的名字
getParameter(String_name) 获取指定参数名字的参数值
(3)response对象
– javax.servlet.http.httpServletResponse的实例
– 与request对象相对应,我们可以用response对象对客户的请求做出动态响应,向客户端发送数据。类似于HTTP请求,HTTP响应也由三个基本部分组成
状态行:包括使用的协议以及状态代码,表示请求是否成功
头:包含关于服务器和返回的文档的消息,例如服务器名称和文档类型等
信息体
– 使用这个对象的一些方法可以完成如下任务
动态设置contentType属性
页面重定向
设置返回状态码等
名称 解释
setStatus(int sc) 设置返回状态码
setContentType(String type) 设置被发送文档的MIME类型
setHeader(String name, String value) 设置头中指定属性name为指定值value
setRedirect(String location) 重定向到指定URL 
(4)session对象
会话的概念
– 从一个客户打开浏览器连接到服务器的某个服务目录,到客户关闭浏览器离开该服务目录称为一个会话
– 每个会话只对应于一个客户,并且可以跨多个页面
session对象
– javax.servlet.http.HttpSession的实例,对应于会话的概念
– 用于在使用无状态连接协议(如HTTP)的情况下跟踪关于某个客户的信息,对识别客户是非常重要的
– 在客户首次访问某服务目录中的任何一个JSP页面时创立,并且具有一个独一无二的Id号,直到客户关闭浏览器或这个session对象达到了最大生存时间,服务器端该客户的session对象才被取消
– 调用相应的方法可以存储客户在访问各个页面期间提交的各种信息,比如姓名、编号等
名称 解释
int getMaxInactiveInterval()   返回会话过期前需要经过的秒数
void setMaxInactiveInterval(int interval) 设置某个会话的生命期
long getCreationTime()   返回创建会话的时间
long getLastAccessedTime()   返回上次使用此会话的时间
void invalidate()   使得session对象无效
boolean isNew()   判断是否是个新会话
String getId()   返回识别客户的独一无二的字符串
Enumeration getIds()   返回一个包含当前所有会话Id的枚举值
void setAttribute(String key, Object value) 在session对象中添加obj,并指定索引关键字为key
Object getAttribute(String name)   从session对象获取关键字为key的对象
void removeAttribute(String name)   从session中删除指定索引关键字的对象
Enumeration getAttributeName( )   获取session对象存储的所有键名
(5)application对象
– javax.servlet.ServletContext的实例。
– 比session对象的生存时期更长。服务器启动后,就产生了这个application对象,直到服务器关闭,该对象才被取消
– 所有客户共享这个内置的application对象,所以任何客户对该对象中存储的数据的改变都会影响到其他客户,因此,在某些情况下,对该对象的操作需要同步处理
名称 解释
void setAttribute(String key, Object obj) 将obj对象添加到application对象中,并为obj指定一个索引关键字key。
Object getAttribute(String key) 获取application对象中指定关键字的对象
Enumeration getAttributeNames( ) 返回application对象的所有索引关键字
void removeAttribute(String key) 删除指定索引的对象

转义符: 双引号\“ ,单引号\’,反斜杠\\,回车\r,换行\n,制表符\t


<jsp:forward>
注意:
“<jsp:forward>”标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象。
“<jsp:forward>”标签以后的代码,将不能执行。

4.网页常用标签
表单form
表单是具有输入域、文本域的页面
用于客户端同服务器端交互
用户在客户端填写表单,然后“提交”
表单中的信息发送到服务器
服务器返回处理情况
(1)表单标记
表单主标记
–<form> </form>
表单中的标记
–<input>
–<select> </select>
–<option>
–<textarea> </textarea>
<form>是表单开始标记,</form>结束


a.form标记
描述表单的特性,语法
<form method="POST" action=“” enctype=“”>
method表单传输方法
–GET方法将表单信息在URL后传输
–POST方法将表单信息作为信息体传输
action为表单处理方式,通常为一个URL
enctype为编码方式
b.<input>标记
表单中输入信息的区域
属性
–type  类型
text 文本
passwowrd 口令方式
checkbox 多选框 name相同
radio 单选按钮 name相同
image 图片
hidden 隐藏表单发送数据
submit 提交按钮,向服务器提交表单
reset 复位按钮,将表单重置为初始状态
–name 名称
–id  标识
–maxlength 最大字符数
–size 输入域宽度
–value 域的初始值
–button 按钮用javascript响应
c.文本框:TEXTAREA
多行文本域:<textarea> </textarea>
参数
–COLS:宽度
–ROWS:高度
–NAME:名称
例:
<textarea NAME=“Computer” ROWS=6 COLS=64>
CPU PIV 1500
Memory 512M
</textarea>
d.下拉框:SELECT
定义列表框:<select> </select>
参数
–MULTIPLE 可同时选取多行
–NAME 名称
–SIZE 可见项目数
每个项目用option标记
属性SELECTED出现在option表示选中
e.表单提交
提交方式:
–submit类型按钮ᨀ交表单
–通过普通按钮的javascript函数
传输方法依据<form>中的method
–推荐使用POST
传输编码依据<form>中的enctype
处理方式依据<form>中的action
<input type="submit" value=" 提交">
f.表单清除
reset按钮重置表单为初始值
<input type="reset" value="全部重写"></p>
(2)表单的确认
客户端确认
–减少服务器负载
–缩短用户等待时间
–兼容性难
服务器端确认
–统一确认
–兼容性强
–服务器负载重
(1)客户端确认
采用javascript进行确认
常用函数
–isBetween
–isDate
–isTime
–isDigit
–isEmail
–isEmpty
–isInt

–isReal

(二)JSP与JavaBean
指令标签<%@ include file=“fileName” %>和动作标签<jsp:include page=“someFile.html” />
– 都可以嵌入代码。前者实际上是将代码插入行内,后者是将另一个页面的输出插入原来的页面
– 这些方法无助于分离表示逻辑和业务逻辑,它们都造成了显著的可伸缩性问题,不利于开发人员分工合作
JavaBean
– 解决了这个问题,它将一系列相关的属性和方法组合在一个Java类中,构成了一个组件
– 在JSP程序中,只要使用JavaBean动作标签调用该组件就可以了
1.JavaBean简介
(1)JavaBean
– 其实就是Java类
– 必须使用一组相当简单而又标准的设计和命名约定,因而调用它们的应用程序无须理解其内部工作原理,就可以很容易的使用JavaBean的方法
– JavaBean类的一个实例叫做一个bean
– 通常我们将JavaBean文件取名为XxxBean
(2)JavaBean的设计要求
对于JSP中使用的JavaBean,有三个设计要求
– 必须拥有一个默认(无参数)的构造函数
如果未声明任何构造函数,默认的构造函数会被自动创建
JSP元素创建bean时,会调用默认构造函数
– 类中不应该有公开的属性
– 对于类内的属性,通常应该提供设置和获取其值的方法
public void setXxx(Objec_type value)方法进行设置
public Object_type getXxx()方法进行获取,如果该属性是布尔类型的,允许使用public boolean isXxx()获取属性值
如果某个属性只有getXxx或isXxx方法,叫做只读属性
(3)JSP对JavaBean的访问
可以使用JSP脚本元素访问类的任意方法
访问bean的标准JSP动作只能使用那些遵循getXxx/setXxx或isXxx/setXxx命名约定的方法
2.在JSP程序中使用JavaBean
(1)JavaBean类在Web应用中的部署
– 不能放在含有JSP文件的目录中,而应该放在安装servlet的目录中,且一定要使用包
– 单个JavaBean类的字节码文件的正确位置是webAppDir/WEBINF/classes/PackageName/
– 含有bean类的JAR文件应该放在webAppDir/WEB-INF/lib/目录中
(2)在JSP页面中,可以使用三种JavaBean动作标签构建和操作JavaBean组件
– useBean动作标签
– setProperty动作标签
– getProperty动作标签
(3)建立JavaBean
<jsp:useBean id="beanName" class="package.class" scope="someScope"/>
表示建立一个bean类的对象
– class指定的bean类的类名
– id指定该实例的名字
– scope属性表示bean的有效范围,有4个可选值
a.Page
– 默认值,有效范围是当前请求访问的JSP页面
– 表示每次请求访问JSP页面时都会创建新的bean,并将其放在PageContext对象中
– servlet可以通过预定义变量pageContext的getAttribute方法访问它
b.Request
– 有效范围是当前的请求
– 将bean放在HttpServletRequest对象中,如果已经存在,则调用之,可通过getAttribute方法访问
– 在使用jsp:include,jsp:forward,或者RequestDispatcher的include或forward方法时,两个JSP页面,或JSP页面和servlet将会共享该bean
c.Session
– 有效范围是客户的会话期间
– 表示要将bean实例存储到与当前请求相关的HttpSession对象中
– 如果这个客户在多个页面中相互链接,每个页面都包含有一个useBean标签,这些useBean标签中id的值相同,并且scope的值都是session,那么该客户在这些页面得到的bean是相同的一个
d.Application
– 表示要将bean实例存储在ServletContext中,ServletContext由Web应用中多个servlet和JSP页面共享
– 所有客户共享这个bean,如果一个客户改变这个bean的某个属性的值,那么所有客户的这个bean的属性值都发生了变化
– 这个bean直到服务器关闭才被取消
– 如果已经存在scope和id相同的实例,则访问现存的实例
(4)取得Bean的属性值
<jsp:getProperty name="beanName" property="propertyName"/>
表示读取bean属性的值
– bean的名称由name项指定,与useBean标签的id项对应
– property项指定属性名称
– 该语法只能读取在JavaBean类文件中有getXxx方法的属性
– 也可用JSP脚本元素<%= beaName.getXxx() %>得到相同的结果
(5)设置Bean的属性值
<jsp:setProperty name="beanName" property="propertyName" value="propertyValue"/>
表示设置bean的属性值
– name项指定bean的名称,与useBean标签的id相对应
– property项指定属性名称
– value项指定属性的值
– 该语法只能设置JavaBean类文件中有setXxx方法的属性
– 也可以用JSP脚本元素<%= beanName.setXxx("propertyValue") %>得到相同的结果

tomcat连接数据库:
JDBC(mysql-connector-java-5.1.35-bin.jar)需要放到:Tomcat lib 目录下