应用JSP技术开发动态网站
JSP基本语法
默认JSP:
<%@ page language="java" contentType="text/html; charset=GBK" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Insert title here</title> </head> <body> </body> </html>
JSP页面由如下两部分组成:
->静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同。
->动态部分:受Java程序控制的内容,这些内容由Java程序来动态生成。
经典JSP:
<%@ page language="java" contentType="text/html; charset=GBK"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Insert title here</title> </head> <body> <h1>欢迎使用JSP</h1> 现在时间是:<% out.println(new java.util.Date()); %> </body> </html>
注释
注释是每一个合格程序所必备的,它相当于产品说明书。只有有了它,你的程序才能让其他程序员读懂,同样也可以唤醒自己以前的记忆。
JSP的注释分为两类,一类为可以在客户端显示的注释,即HTML注释;一类是不能在客户端显示的注释,即JSP注释。两种注释都能起到解释代码的作用,不同是能不能在客户端显示。
(1)HTML注释使用<!--作为开始,以-->作为结束,中间包含的代码即为注释部分。
(2)JSP注释使用<%--作为开始,以--%>作为结束,中间包含的代码即为注释部分。
JSP脚本元素
JSP脚本元素的作用就是将Java代码插入到与JSP页面对应的Servlet中。JSP脚本元素分为三种形式,分别为JSP声明、JSP表达式、JSP Scriptlets。
(1)JSP声明,用来将方法或变量定义插入到Servlet类的主定义体中,相当于Java类中的成员变量或者方法。其语法格式为:<%! 声明语句 %>,可以使用private,public等访问控制符修饰,也可使用static修饰。
(2)JSP表达式,用来将数据或数据操作后的结果转换为字符串,插入到当前Servlet的输入流中,其语法格式为:<%=表达式 %>。
(3)JSP脚本,用来将Java代码插入到Servlet的_jspService方法中,其语法格式为:<% Java代码 %>。在JSP Scriptlets中可以包含多个语句,如:方法、变量、表达式等,不能用private,public等访问控制符修饰,也不可使用static修饰。
连接数据库:
drop database javaee; create database javaee; use javaee; create table news_inf ( news_id int primary key auto_increment, news_title varchar(255) ); insert into news_inf values (null , 'Java核心技术卷一'), (null , 'Java核心技术卷二');
<%@ page language="java" import="java.sql.*" contentType="text/html; charset=GBK"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Insert title here</title> </head> <body> <h1>欢迎使用JSP</h1> <% Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "123456"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from news_inf"); %> <table bgcolor="#9999dd" border="1" width="300"> <% while (rs.next()) { %> <tr> <td><%=rs.getString(1)%></td> <td><%=rs.getString(2)%></td> </tr> <% } %> </table> </body> </html>
JSP指令元素
JSP指令元素指令主要用来提供整个JSP网页相关的信息,并且用来设定JSP页面的相关属性。包括page指令、include指令以及taglib指令三种。
(1)page指令主要用来设定JSP页面的全局属性,该配置将作用于整个JSP页面,甚至包括静态包含的文件。其语法格式如下。
<%@ page 属性1="属性值1" 属性2="属性值2"……%>
page指令的语法格式:
<%@ page [ language="java" ] [ extends="package.class" ] [ import="{package.class | package.*}, ..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoFlush="true | false" ] [ isThreadSafe="true | false" ] [ info="text" ] [ errorPage="relativeURL" ] [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=UTF-8" ] [ pageEncoding="UTF-8"] [ isErrorPage="true | false" ] %>
page指令各属性的意义:
->language:定义要使用的脚本语言,该属性的默认值是java,而且目前目前只能是java,所以通常可以无需设置
->extends:指定JSP页面编译所产生的的Java类所继承的父类,或所实现的接口。
->import:"package.class,package.*"和一般的java import意义一样,用","来隔开,默认导入的包有:java.lang.*、javax.servlet.*、javax.servlet.JSP.*、javax.servlet.http.*。
->session:"true|false" 默认为true,指定这个页面是否参与Http的session中,指定这个JSP中是否可以使用session
->buffer:"none|8kb|sizekb" 默认为8kb,指定到客户端输出流的缓冲模式,指定输出缓冲区的大小,如果是none则不缓冲,如果指定数值,那么输出就用不小于这个值的缓冲区进行缓冲,单位为kb。
->autoFlush:"true|false" 默认为true,true当缓冲区满时,到客户端的输出被刷新,即强制输出缓冲区的内容,false,当缓冲区满时,出现运行异常,表示缓冲溢出
->isThreadSafe:"true|false" 默认为true,用来设置JSP文件是否能支持多线程的使用。如为true,那么一个JSP能够同时处理多个用户的请求,反之,一个JSP只能一次处理一个请求。
->info:"text" 设置该JSP程序的信息,也可以看做其说明,可以使用getServletInfo()获得
->errorPage:"errordeal.jsp" 默认忽略,定义此页面出现异常时调用的页面,即指定错误处理页面
->isErrorPage:"true|false" 默认为false,表明当前的页面是否为其它页面的errorPage目标,如果设置为true,则可以使用exception对象。反之,如果设置为false,则不可以使用exception对象
->isELIgnored:"true|false" ,指定EL表达式语言是否被忽略,如为true则忽略,反之可以使用EL。
->contentType:"text/html;charset=UTF-8",定义response中的内容类型和JSP页面的文件格式和编码字符集,即MIME类型和页面字符集类型,默认的MIME类型是text/html;默认的字符集类型为ISO-8859-1。
翻译后变成response.setContentType("text/html;charset=UTF-8")。
->pageEncoding:"UTF-8",实现功能跟contentType="text/html;charset="UTF-8"一致,但是两者若同时设置,JSP页面的编码格式以pageEncoding为准,response中的内容类型和编码格式以contentType为准。
(2)include指令用于在JSP文件中插入一个包含文本或者代码的文件。使用include指令包含文件,被包含的文件的执行结果将插入到include指令的位置。只有当被保包含的文件执行完成,该JSP文件才会恢复执行,使用include指令,可以将一个外部文件嵌入到当前的JSP文件中,同时解析这个页面中的JSP语句(如果有的话)。这是个静态的include语句,它会将目标页面的其他编译指令和页面都包含进来,加入到本页面,融合成一个页面,此时可以说明被包含页面不一定需要是一个完整的页面。但动态include则不会将目标页面的其他编译指令包含进来。include既可以包含静态的文本,也可以包含动态的JSP页面。
<%@ include file="staticIncluded.jsp"%>
(3)taglib指令用来声明此JSP文件使用了自定义的标签,同时引用所指定的标签库以及设置标签库的前缀。其语法格式如下。
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix"%>
JSP动作指令(7个)
页面包含操作include
<jsp:include>动作指令用来动态的包含静态和动态的文件。如果被包含的文件为静态的文件,那么只是单纯的加到JSP页面中,不会进行任何处理;如果被包含的文件为动态的文件,那么会先进行处理,然后将处理的结果加到JSP页面中。<jsp:include>动作指令的语法格式如下。
<jsp:include page="{包含文件URL地址<%=expression%>}" flush="false|true">
<jsp:param name="parameterName" value="parameterValue"/></jsp:include>
<jsp:include>动作指令包含两个属性,page和flush。
其中page属性用来指定被包含文件的URL地址。flush属性用来指定缓冲区满时,是否进行清空或者用于指定输出缓存是否转移到被导入文件中。如果设置为true,那么缓冲区满时将进行清空或者说是包含在被导入文件中;如果设置为false,那么缓冲区满时不会进行清空或者说是包含在原文件中。flush属性的默认值为false。
静态导入和动态导入的三点区别:
1、静态导入是将导入页面的代码完全融入,两个页面融合成一个整体Servlet;而动态导入则在Servlet中使用include方法来引入被导入页面的内容。
2、静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令会失去作用,只是插入被导入页面你的body内容。
3、动态包含还可以增加额外的参数。
请求转发操作forward
<jsp:forward>动作指令用来转移用户的请求,使得用户请求的页面从一个页面跳转到另一个页面,既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。这种跳转为服务器端跳转,所以用户的地址栏不会发生任何的变化,但页面内容却完全变为被forward目标页的内容,且执行forward指令转发请求时,客户端的请求参数不会丢失。<jsp:forward>动作指令的语法格式如下:
<jsp:forward page="{跳转文件URL地址<%=expression%>}">{<jsp:param...}</jsp:forward>
<jsp:include>动作指令只包含一个属性即page,page属性用来指定跳转文件的相对地址。
include和forward:forward拿目标页面替代原有页面,而include则拿目标页面插入原有页面。
参数传递操作param
<jsp:param>动作指令用来传递参数,必须与其它支持参数的标签一起使用。一般与<jsp:include>、<jsp:forward>作用联合使用。其语法格式如下。
<jsp:param name="参数名" value="参数值"/>
<jsp:param>动作指令包含两个属性,一个是name,用来设定传递参数的名称;一个是value,用来设定传递参数的值。
jsp:plugin
用来下载JavaBean或Applet到客户端执行。
jsp:useBean
创建一个JavaBean的实例,即在JSP页面中初始化一个JavaBean实例
实例:
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
scope属性用来指定JavaBean实例的作用范围,该范围有4个值:
page:该JavaBean实例仅在该页面中有效。
request:该JavaBean实例仅在本次请求中有效。
session:该JavaBean实例仅在本次session内有效。
application:该JavaBean实例在本应用内一直有效。
jsp:setProperty
设置JavaBean实例的属性值
<jsp:setProperty name="BeanName" proterty="propertyName" value="value"/>
jsp:getProperty
输出JavaBean实例的属性值。
<jsp:getProperty name="BeanName" proterty="propertyName"/>
JSP主要内置对象(9个)
request请求对象
javax.servlet.http.HttpServletRequest的实例,request对象用来封装客户端的一次请求信息,客户端的请求参数都被封装在该对象里,通过它才能了解到客户的需求,如客户端请求参数、请求的来源、表头、cookies等等,然后做出响应。request对象是是HttpServletRequest接口的实例。
request请求对象可以用来设置和取得request范围变量,所谓request范围,也就是说属性在一次请求范围内有效。如果页面从一个页面跳转到到另一个页面,那么该属性也就失效。这里所指的跳转是指客户端跳转,比如客户单击超链接跳转到其他页面,或者通过浏览器地址栏浏览其他网页。
如果使用服务器端跳转<jsp:forward>,该属性仍然有效。通过使用request的setAttribute()方法来设置属性,并通过request的getAttribute()方法来取得属性。
getParameter() 获得参数对应的值,常用的方法有:getParameter(String paramName)、getParameterValues(String paramName)、setAttribute(String attrName,Object attrValue)、getAttribute(String attrName)和setCharacterEncofing(String env)等。
response响应对象
javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的请求。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。response对象包含了响应客户请求的有关信息,它是HttpServletResponse类的实例。response对象可以用来添加cookies、添加标头、设置页面重定向(常用语重定向)等等。
session会话对象
javax.servlet.http.HttpSession的实例,带对象代表依次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。session对象用来表示用户的会话状况,一般用于保存用户的各种信息,知道生命周期超时或者被认为释放掉为止。
application应用服务对象
javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身,可用于JSP页面,或者在Servlet之间交换信息。application对象用来取得和设置Servlet的相关信息。application对象的生命周期是服务器启动产生直到服务器关闭为止。
pageContext页面上下文对象
javax.servlet.jsp.PageContext的实例,pageContext对象代表JSP页面上下文,使用该对象可以访问页面中的共享数据。可以用来设置page范围的属性,同样也可以用来设置其他范围属性,不过需要指定范围参数。所谓page范围,也就是说设置的属性只在当前页面有效。通过使用pageContext的setAttrib ute方法来设置属性,并通过pageContext的getAttribute方法来取得属性。pageContext对象包含的方法以及方法说明如下所示。
config:
javax.servlet.ServletConfig的实例。该实例代表该JSP的配置信息。常用的方法有getInitParameter(String paramName)和getInitParameternames()等方法。事实上,JSP页面通常无需配置,也就不存在配置信息。因此,该对象更多地在Servlet中有效。
exception:
java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令 page的isErrorPage属性为true时,该对象才可以使用。常用的方法有getMessage()和printStackTrace()等。
out:
javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。
page:
代表该页面本身,通常没有太大用处。也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可用this。
JSTL标签库
EL表达式
EL全名为Expression Language,它原来是JSTL1.0为了方便存取数据所定义的语言。到了JSP2.0以后,EL正式纳入成为标准规划之一。只要是支持Servlet2.4/JSP2.0的容器(服务器的另一种说法),都可以在JSP网页中直接使用EL。下面将重点EL中的运算符、与存储有关的内置对象和与输入有关的内置对象。
(1)EL运算符
例如:${1 + 1}、${1 == 1}、${true && true}
(2)与存储有关的内置对象
包含四个,分别是applicationScope、sessionScope、requestScope以及pageScope。
(3)与输入有关的内置对象
包含两个,分别是param和paramValues。
核心标签库
在JSP页面中要使用到核心标签库,必须使用<%@ taglib%>指令,指定核心标签库的前缀以及uri,代码如下。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
其中prefix为“c”,表示标签的前缀为“c”,这时就必须使用<c:XXX>这种格式。uri用来指定核心标签库规范文件地址。
格式化标签库
在JSP页面中要使用到格式化标签,必须使用<%@ taglib%>指令,指定格式化标签,代码如下。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
其中prefix为“fmt”,表示标签的前缀为“fmt”,这时就必须使用<fmt:XXX>这种格式。uri用来指定格式化标签库规范文件地址。
函数库
在JSTL1.1中新增了函数标签库,与其他标签库不同的是函数标签库主要是通过EL的Function实现的。函数标签库中的标签大部分都是用来处理字符串(fn:length可以用来取得集合对象大小)。
如果要在JSP中要使用JSTL函数标签库,必须使用<%@ taglib %>指定标签的uri和前缀perfix。代码如下。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
其中prefix为“fn”,表示标签的前缀为“fn”。uri用来指定格式化标签库规范文件地址。函数标签库的标签使用和前面介绍的几个标签库不同,其格式为${fn:标签(参数1,参数2)}
JSTL函数标签库中包含了一系列对字符串处理的函数,具体标签列表如下所示。