1. 静态开发技术:
(1)HTML
HTML是网站开发最基本的语言,是WEB的核心。所有后续的WEB开发技术都以HTML为基础。
(2)CSS
CSS(Cascading Style Sheet)级联样式表。
(3)JavaScript
JavaScript是一种基于对象和事件驱动的脚本语言。JavaScript程序可以直接嵌入HTML页面,作为一种客户端程序,允许用户与其进行交互。
2. 动态网页技术:
主要有ASP、ASP.NET、PHP和JSP等。都是将相应的程序代码嵌入到HTML文档中,用以实现客户机与服务器之间的交互。
(1) ASP(Active Server Page)
是一套微软公司开发的运行于服务器端的脚本平台,ASP内含于IIS(Internet Information Server)。
优点: ASP所使用的脚本语言VBScript直接来源于Visual Basic,简单易学。ASP提供的ADO组件可轻松存取数据库。
缺点: 运行速度慢。平台适应性差。
(2) PHP(Personal Home Pages)
是Rasmus Lerdorf 于1994年提出来的,经过不断的修改完善,现在已成为一种重要的网络程序设计语言。
优点: 开放源代码;多平台支持。
缺点: PHP的主要不足体现在对各种数据库没有统一的接口标准,它对于每一种数据库几乎都采用不同的接口标准。没有大公司的支持,其推广受到一定限制。由于PHP的每一种扩充模块并不是完全由PHP本身来完成,需要许多外部的应用程序库,因此,运行环境安装相对复杂,学习起来相对于ASP难度也要大一些。
(3) JSP(Java Server Pages)
SUN公司倡导,多家公司参与建立的一种动态网页技术。
优点: 平台适应性广,几乎所有平台都支持JSP。编译后运行,运行效率高。统一的数据库接口标准JDBC。
缺点: 开发运行环境相对于ASP来讲,要复杂一些。相对于ASP的VBScript脚本语言来讲,Java语言学习起来要困难一些。
静态开发技术: 1. HTML: HTML是网站开发最基本的语言,是WEB的核心。所有后续的WEB开发技术都以HTML为基础。 2. CSS, Cascading Style Sheet(级联样式表) 3. JavaScript: JavaScript是一种基于对象和事件驱动的脚本语言。JavaScript程序可以直接嵌入HTML页面,作为一种客户端程序,允许用户与其进行交互。
<%@ page [ language="java" ]
[ contentType="mimeType;charset=CHARSET" ]
[ import="{package.class|pageage.*},…" ]
[ extends="package.class" ]
[ session="true|false" ]
[ buffer="none|8kb|size kb ]
[ autoFlush="true|false" ]
[ isThreadSafe="true|false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ isErrorPage="true|false" ]
[ isELIgnored="true|false" ]
[ pageEncoding="CHARSET" ]
%>
JavaScript是一种基于对象(Object)和事件驱动(Event Driven)的脚本语言。
JavaScript可以分为三部分:核心、客户端、服务器端。
JavaScript的用途:
可以完成一些本来需要服务器端完成的编程任务
作为JavaScript的一种替代,易学易用
检测按钮、菜单等表单元素的事件,完成与用户之间的交互,容易对用户交互进行编程
通过DOM(文档对象模型)可以访问并修改某个XHTML文档中的任何元素的CSS属性和内容
JavaScript脚本大部分是事件驱动的,可以响应用户对文档的操作
方法1: 在标签中嵌入JS脚本:
方法2: 在XHTML文档中嵌入JS文件中的脚本:
JavaScript中的注释分为单行和多行注释,在程序的解释和运行中是被忽略的。
单行注释:使用//符号对单行信息进行注释
多行注释:使用/…../对多行信息进行注释
必须以字母、下划线或$开头,接下来的字符可以是字母、下划线、$或数字。标识符没有长度限制。标识符不可以使用已定义好的保留字。
在 JavaScript 中使用 var 关键词来声明变量:
var carname;
carname="Volvo";
或者在声明变量时对其赋值:
var carname="Volvo";
可以在一条语句中声明很多变量。该语句以 var 开头,并使用逗号分隔变量即可:
var name="Gates", age=56, job="CEO";
数值:包括整数数字和浮点型数字
字符串:"abc" 'hello' "你好"
布尔值:true 和 false
空值:null
未定义值:undefined
算术运算符
比较运算符
逻辑运算符: && || !
赋值运算符: = += -= *= /= %=
条件选择符: 条件表达式?A:B
JSP页面 = 静态页面元素(HTML+CSS+JavaScript)+ 指令标识 + 脚本 + 表达式 + 动作标识
<%@ page language="java" contentType="text/html; charset=gb2312" %>
<%@ page import="java.util.Date" %>
JSP页面的基本构成
<% String today=new Date().toLocaleString(); %>
今天是:<%=today%>
JSP指令可以使服务器按照指令的设置来执行动作和设置在整个JSP页面范围内有效的属性。指令通常以“<%@”标记开始,以“%>”标记结束,可设置多个属性,指令的一般格式为:
<%@ 指令名称 属性1="属性值" 属性2="属性值" …%>
在JSP中主要包含3种指令,分别是page指令(页面指令)、include指令和taglib指令。
page指令定义了整个JSP页面范围内有效的属性,可以放在JSP页面中的任意行,习惯上放在文件的开始部分。除import属性外,其他属性只能在指令中出现一次。
<%@ page
[ language="java" ]
[ contentType="mimeType;charset=CHARSET" ]
[ import="{package.class|pageage.*},…" ]
[ extends="package.class" ]
[ session="true|false" ]
[ buffer="none|8kb|size kb ]
[ autoFlush="true|false" ]
[ isThreadSafe="true|false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ isErrorPage="true|false" ]
[ isELIgnored="true|false" ]
[ pageEncoding="CHARSET" ]
%>
language属性:设置当前页面中编写JSP脚本使用的语言,默认值为java,例如:
<%@ page language="java" %>
contentType属性:设置页面响应的MIME类型,通常被设置为text/html,例如:
<%@ page contentType="text/html" %>
在该属性中还可以设置页面采用的字符编码类型,默认的编码为ISO-8859-1,如果需要显示中文,字符集可以使用UTF-8,例如:
<%@ page contentType="text/html;charset=UTF-8" %>
import 属性:import属性类似于Java中的import语句,用来向JSP文件中导入需要用到的包。在Page指令中可多次使用该属性来导入多个包。例如:
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
或者通过逗号间隔,来导入多个包。
<%@ page import="java.util.*,java.text.*" %>
JSP中已经默认导入了以下包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
extends属性: 用于指定将一个JSP页面转换为Servlet后继承的类。通常不会设置该属性,JSP容器会提供继承的父类。如果设置了该属性,一些改动会影响JSP的编译能力。
session属性:该属性默认值为true,表示当前页面支持session,设为false表示不支持session。
buffer属性: 该属性用来设置out对象(JspWriter类对象)使用的缓冲区的大小。若设置为none,表示不使用缓存,而直接通过PrintWriter
对象进行输出;如果将该属性指定为数值,则输出缓冲区的大小不应小于该值,默认值为8KB(因不同的服务器而不同,但大多数情况下都为8KB)。
autoFlush属性: 该属性默认值为true,表示当缓冲区已满时,自动将其中的内容输出到客户端。如果设为false,则当缓冲区中的内容超出其设置的大小时,会产生“JSP Buffer overflow”溢出异常。
注意:若buffer属性设为none,则autoFlush不能设为false。
isThreadSafe属性:该属性默认值为true,表示当前JSP页面被转换为Servlet后,会以多线程的方式来处理来自多个用户的请求;如果设为false,则转换后的Servlet会实现SigleThreadModel
接口,该Servlet将以单线程的方式来处理用户请求,即其他请求必须等待直到前一个请求处理结束。
info属性:该属性可设置为任意字符串,如当前页面的作者或其他有关的页面信息。可通过Servlet.getServletInfo()
方法来获取设置的字符串。例如:
<%@ page info="This is index.jsp!" %>
<%=this.getServletInfo()%>
errorPage属性:该属性用来指定一个当前页面出现异常时所要调用的页面。如果属性值是以“/”开头的路径,则将在当前应用程序的根目录下查找文件;否则,将在当前页面的目录下查找文件。
isErrorPage属性:将该属性值设为true,此时在当前页面中可以使用exception
异常对象。若在其他页面中通过errorPage
属性指定了该页面,则当前者出现异常时,会跳转到该页面,并可在该页面中通过exception
对象输出错误信息。相反,如果将该属性设置为false
,则在当前页面中不能使用exception
对象。该属性默认值为false
。
isELIgnored属性:通过该属性的设置,可以使JSP容器忽略表达式语言“${}”。其值只能为true或false。设为true,则忽略表达式语言。
pageEncoding 属性:该属性用来设置JSP页面字符的编码。默认值为ISO-8859-1
。
该指令用于在当前的JSP页面中,在当前使用该指令的位置嵌入其他的文件,如果被包含的文件中有可执行的代码,则显示代码执行后的结果。该指令的使用格式如下:
<%@ include file="文件的绝对路径或相对路径" %>
file属性:该属性指定被包含的文件,该属性不支持任何表达式,也不允许通过如下的方式来传递参数。
<%@ include file="welcome.jsp?name=yxq" %>
如果该属性值以“/”开头,那么指定的是一个绝对路径,将在当前应用的根目录下查找文件;如果是以文件名称或文件夹名开头,那么指定的是一个相对路径,将在当前页面的目录下查找文件。
可以将复杂页面分成若干个独立的部分,将相同的部分在单独的JSP文件中进行编写,使用include指令引用这些文件,以减少代码的冗余。例如,有两个JSP页面都需要应用下图所示的网页模板进行布局。
<%@ page contentType="text/html;charset=gb2312" %>
<%@ include file="top.jsp"%>
<%@ include file="side.jsp"%>
在这里对内容显示区进行编码
<%@ include file="end.jsp"%>
声明用户使用自定义的标签,将标签库描述符文件导入到jsp页面。指令的语法格式如下:
<%@ taglib uri="tagURI" prefix="tagPrefix" %>
uri属性:定位标签库描述符的位置。唯一标识和前缀相关的标签库描述符,可以使用绝对或相对URL。
tagDir属性:指示前缀将被用于标识在WEV-INF/tags目录下的标签文件。
prefix属性:标签的前缀,区分多个自定义标签。不可以使用保留前缀和空前缀,遵循XML命名空间的命名约定。前缀不能命名为jsp、jspx、java、javax、sun、servlet和sunw。
开发者可通过前缀来引用标签库中的标签。以下为一个简单的使用JSTL的代码,该段代码通过
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
语法:<%=变量/有返回值的方法调用/Java表达式 %>
作用:向页面输出信息
(1)向页面输出内容
<% String name="www.qq.com"; %>
用户名:<%=name%>
(2)生成动态的链接地址
<% String path="welcome.jsp"; %>
(3)动态指定Form表单处理页面
<% String name="logon.jsp"; %>
该段代码将生成如下HTML代码:
(4)为通过循环语句生成的元素命名
<% for(int i=1;i<3;i++){ %>
file<%=i%>:">
<% } %>
代码运行将生成下面的HTML代码:
file1:
file2:
作用:声明变量和方法
语法:<%! 声明变量或方法的代码 %>
注意事项:
·
在“<%”与“!”之间不要有空格
·
·
声明的语法与在Java语言中声明变量和方法时是一样的。
·
·
在页面中通过声明标识声明的变量和方法,在整个页面内都有效,它们将成为JSP页面被转换为Java类后类中的属性和方法。并且它们会被多个线程即多个用户共享。
·
【程序】一个简单的网站计数器
<%@ page contentType="text/html;charset=UTF-8" %>
<%!
int num=0; //声明一个计数变量
synchronized void add(){ //该方法实现访问次数的累加操作
num++;
}
%>
<% add(); %> <%-- 该脚本程序调用实现访问次数累加的方法 --%>
语法规则:<% Java程序片段 %>
作用:在脚本程序中可以定义变量、调用方法和进行各种表达式运算,且每行语句后面要加入分号。
在脚本程序中定义的变量:
·
在当前的整个页面内都有效
·
·
但不会被其他的线程共享
·
·
当前用户对该变量的操作不会影响到其他的用户
·
·
当变量所在的页面关闭后就会被销毁。
·
【示例程序】脚本的使用
<%@ page contentType="text/html;charset=gb2312"%>
<% int able=1; %>
<% if(able==1){%> <% } else if(able==2){ %> <% } %>
欢迎登录!您的身份为“普通管理员”。 欢迎登录!您的身份为“系统管理员”。
(1)HTML注释:
语法:
HTML注释中可以嵌入表达式:
(2)隐藏注释
语法:<%-- 注释内容 --%>
该注释在客户端浏览时看不到,而且即使是通过在客户端查看HTML源代码,也不会看到
(3)脚本程序中的注释
单行注释://注释内容放在这里
多行注释:
/* 注释1
注释2
注释...
*/
JSP中的动作标识可用来实现一些特殊功能,例如请求的转发、在页面中包含其他文件、在页面中创建一个JavaBean实例等。动作标识是在请求处理阶段按页面中的出现顺序执行。
动作标识的基本语法形式:
<动作名称 属性1="值1" 属性2="值2"…/>
或
<动作名称 属性1="值1" 属性2="值2" …>
<子动作 属性1="值1" 属性2="值2" …/>
动作名称>
JSP动作标识主要有:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
作用:用于向当前的页面中包含其他动态或静态文件。
语法格式:
也可以向被包含的动态页面中传递参数:
page属性:该属性指定了被包含文件的路径,其值可以是一个代表了相对路径的表达式。当路径是以“/”开头时,则按照当前应用的路径查找这个文件;如果路径是以文件名或目录名称开头,那么将按照当前的路径来查找被包含的文件。
flush属性:表示当输出缓冲区满时,是否清空缓冲区。该属性值为boolean型,默认值为false,通常情况下设为true。
(1)属性不同
include指令通过file属性来指定被包含的页面,include指令将file属性值看作一个实际存在的文件的路径,所以该属性不支持任何表达式。若在file属性值中应用JSP表达式,则会抛出异常,如下面的代码:
<% String path="logon.jsp"; %>
<%@ include file="<%=path%>" %>
这段代码将抛出下面的异常:
File "/<%=path%>" not found
(2)处理方式不同
使用include指令被包含的文件,它的内容会原封不动地插入到包含页中使用该指令的位置,然后JSP编译器再对这个合成的文件进行翻译。所以在一个JSP页面中使用include指令来包含另外一个JSP页面,最终编译后的文件只有一个。
使用
(3)包含方式不同
使用include指令包含文件,最终服务器执行的是将两个文件合成后由JSP编译器编译成的一个Class文件,所以被包含文件的内容应是固定不变的,若改变了被包含的文件,则主文件的代码就发生了改变,因此服务器会重新编译主文件。include指令的这种包含过程称为静态包含。
使用
(4)对被包含文件的约定不同
使用include指令包含文件时,对被包含文件有约定。
【示例程序】 通过include指令包含文件
top.jsp文件:
<%@ page contentType="text/html;charset=gbk" %>
这是top.jsp页面中的内容!
index.jsp文件:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ include file="top.jsp" %>
这是index.jsp页面中的内容!
【示例程序】 通过include动作标识包含文件
<%@ page contentType="text/html;charset=gb2312" %>
这是index.jsp页面中的内容!
用来将请求转发到另外一个JSP、HTML或相关的资源文件中。当该标识被执行后,当前的页面将不再被执行,而是去执行该标识指定的目标页面。
语法形式:
如果转发的目标是一个动态文件,可以向该文件中传递参数,格式如下:
page属性:该属性指定了目标文件的路径。如果该值是以“/”开头,表示在当前应用的根目录下查找文件,否则就在当前路径下查找目标文件。请求被转向到的目标文件必须是内部的资源,即当前应用中的资源。
如果想通过forward动作转发到应用外部的文件中,例如,当前应用为A,在根目录下的index.jsp页面中存在下面的代码用来将请求转发到应用B中的logon.jsp页面。
将出现下面的错误提示:The requested resource (/http://localhost:8080/B/logon.jsp) is not available
基本语法格式如下:
id="变量名"
scope="page|request|session|application"
{
class="package.className"|
type="数据类型"|
class="package.className" type="数据类型"|
beanName="package.className" type="数据类型"
}
/>
也可以在标识体内嵌入子标识或其他内容:
这两种使用方法是有区别的。在页面中应用
id属性:该属性指定一个变量,在所定义的范围内或脚本中将使用该变量来对所创建的Bean实例进行引用。该变量必须符合Java中变量的命名规则。
type属性:用于设置由id属性指定的变量的类型。type属性可以指定要创建实例的类的本身、类的父类或者是一个接口。
使用type属性来设置变量类型的使用格式如下:
如果在session范围内,已经存在了名为“us”的实例,则将该实例转换为type属性指定的UserInfo类型(必须是合法的类型转换)并赋值给id属性指定的变量;若指定的实例不存在将抛出“bean us not found within scope”异常。 scope属性:该属性指定了所创建Bean实例的存取范围,省略该属性时的值为page。
·
page:指定了所创建的Bean实例只能够在当前的JSP文件中使用,包括在通过include指令静态包含的页面中有效。
·
·
request:指定了所创建的Bean实例可以在请求范围内进行存取。在请求被转发至的目标页面中可通过request对象的getAttribute("id属性值")方法获取创建的Bean实例。一个请求的生命周期是从客户端向服务器发出一个请求到服务器响应这个请求给用户后结束,所以请求结束后,存储在其中的Bean的实例也就失效了。
·
·
session:指定了所创建的Bean实例的有效范围为session。session是当用户访问Web应用时,服务器为用户创建的一个对象,服务器通过session的ID值来区分其他的用户。针对某一个用户而言,在该范围中的对象可被多个页面共享。
·
·
application:该值指定了所创建的Bean实例的有效范围从服务器启动开始到服务器关闭结束。application对象是在服务器启动时创建的,它被多个用户共享。所以访问该application对象的所有用户共享存储于该对象中的Bean实例。可以使用application对象的getAttribute("id属性值")方法获取存在于application中的Bean实例。
·
class属性:指定了一个完整的类名,其中package表示类包的名字,className表示类的Class文件名称。通过class属性指定的类不能是抽象的,它必须具有公共的、没有参数的构造方法。在没有设置type属性时,必须设置class属性。格式如下:
在
这里假设UserBase类为UserInfo类的父类。该标识被执行时,程序首先创建了一个以type属性的值为类型,以id属性值为名称的变量us,并赋值为null;然后在session范围内来查找这个名为“us”的Bean实例,如果存在,则将其转换为type属性指定的UserBase类型(类型转换必须是合法的)并赋值给变量us;如果实例不存在,那么将通过new操作符来实例化一个UserInfo类的实例并赋值给变量us,最后将us变量储在session范围内。
beanName属性:与type属性可以指定同一个类,在
这里假设UserBase类为UserInfo类的父类。该标识被执行时,程序首先创建了一个以type属性的值为类型,以id属性值为名称的变量us,并赋值为null;然后在session范围内来查找这个名为“us”的Bean实例,如果存在,则将其转换为type属性指定的UserBase类型(类型转换必须是合法的)并赋值给变量us;如果实例不存在,那么将通过instantiate()方法从UserInfo类中实例化一个类并将其转换成UserBase类型后赋值给变量us,最后将变量us存储在session范围内。
通常情况下应用
如果想共享这个Bean实例,可根据需要设置scope属性。
通常情况下与
name="Bean实例名"
{
property="*" |
property="propertyName" |
property="propertyName" param="parameterName" |
property="propertyName" value="值"
}/>
name属性:用来指定一个存在JSP中某个范围中的Bean实例。
property="*":property属性取值为“*”时,则request请求中所有参数的值将被一一赋给Bean中与参数具有相同名字的属性。如果请求中存在值为空的参数,那么Bean中对应的属性将不会被赋值为Null;如果Bean中存在一个属性,但请求中没有与之对应的参数,那么该属性同样不会被赋值为Null。
该使用方法要求请求中参数的名称和类型必须与Bean中属性的名称和类型一致。但由于通过表单传递的参数都是String类型的,所以JSP会自动将这些参数转换为Bean中对应属性的类型。下表给出了JSP自动将String类型转换为其他类型时所调用的方法。
property="propertyName":property属性取值为Bean中的属性时,则只会将request请求中与该Bean属性同名的一个参数的值赋给这个Bean属性。更进一步讲,如果property属性指定的Bean属性为userName,那么指定Bean中必须存在setUserName()方法,否则会抛出类似于下面的异常:
Cannot find any information on property 'userName' in a bean of type 'com.Bean.UserInfo'
在此基础上,如果请求中没有与userName同名的参数,则该Bean属性会保留原来或默认的值,而不会被赋值为Null。当请求中参数的类型与Bean中属性类型不一致时,JSP会自动进行转换。
property="propertyName" param="parameterName"
param属性指定一个request请求中的参数,property属性指定Bean中的某个属性。该种使用方法允许将请求中的参数赋值给Bean中与该参数不同名的属性。如果param属性指定参数的值为空,那么由property属性指定的Bean属性会保留原来或默认的值而不会被赋为null。
property="propertyName" value="值"
value属性指定的值可以是一个字符串数值或表示一个具体值的JSP表达式或EL表达式。该值将被赋给property属性指定的Bean属性。
·
当value属性指定的是一个字符串时,如果指定的Bean属性与其类型不一致时,则会根据表3-3中的方法将该字符串值自动转换成对应的类型。
·
·
当value属性指定的是一个表达式时,那么该表达式所表示的值的类型必须与property属性指定的Bean属性一致,否则会抛出“argument type mismatch”异常。
·
·
通常
·
name属性:name属性用来指定一个存在某JSP范围中的Bean实例。
property属性:该属性指定了要获取Bean中哪个属性的值。若它指定的值为“userName”,那么Bean中必须存在getUserName()方法,否则会抛出下面的异常:
Cannot find any information on property 'userName' in a bean of type '此处为类名'
如果指定Bean中的属性是一个对象,那么该对象的toString()方法被调用,并输出执行结果。
JSP页面中内置了一些默认的对象,这些对象不需要预先声明就可以在脚本代码和表达式中随意使用。
request、response和session是JSP内置对象中重要的3个对象,这3个对象体现了服务器端与客户端(即浏览器)进行交互通信的控制。
request对象是JSP中重要的对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
除此之外,request可代表本次请求范围,所以还可用于操作request范围的属性。
本节主要介绍:
(1)访问请求参数
(2)在请求作用域中管理属性
(3)Cookie操作
(4)获取客户信息
(5)访问安全与国际化信息
客户端可通过HTML表单或在网页地址后面提供参数的方法提交数据,然后通过request对象的相关方法来获取这些数据。
·
获取单值参数
·
客户端可通过HTML表单或在网页地址后面提供参数的方法提交数据; 服务器端可使用request对象的getParameter()方法获取用户提交的单值参数数据。
String userName = request.getParameter("name");
login.jsp
用户名:
密 码:
login_deal.jsp
<%
request.setCharacterEncoding("gb2312");
String username=request.getParameter("username");
String pwd=request.getParameter("pwd");
out.println("用户名为:"+username);
out.println("密码为:"+pwd);
%>