195
JavaServer Pages JavaServer Pages JSP JSP 网网网网网网 网网网网网网

JavaServer Pages(JSP) 网页程序设计

  • Upload
    zach

  • View
    124

  • Download
    0

Embed Size (px)

DESCRIPTION

JavaServer Pages(JSP) 网页程序设计. JSP 的概念. J ava S erver P age Servlet 简化设计,逻辑与界面设计分开,开发更方便; HTML 语法的 java 扩展,加入新的标签(, … ); 强大的组件( Java Bean) 支持功能;. 内容提要. 介绍 JSP 页面的结构 JSP 的编译指令、操作指令和代码 重点介绍 JSP 常用的六大基本对象: out 对象、 response 对象、 request 对象、 application 对象、 session 对象和 cookie 对象。. - PowerPoint PPT Presentation

Citation preview

Page 1: JavaServer Pages(JSP) 网页程序设计

JavaServer PagesJavaServer Pages(( JSPJSP))

网页程序设计网页程序设计

Page 2: JavaServer Pages(JSP) 网页程序设计

2

JSP 的概念

Java Server Page Servlet 简化设计,逻辑与界面设计分开,

开发更方便; HTML 语法的 java 扩展,加入新的标

签 (<%, %>,…) ; 强大的组件( Java Bean )支持功能;

Page 3: JavaServer Pages(JSP) 网页程序设计

3

内容提要

介绍 JSP 页面的结构 JSP 的编译指令、操作指令和代码 重点介绍 JSP 常用的六大基本对象:

out 对象、 response 对象、 request对象、 application 对象、 session 对象和 cookie 对象。

Page 4: JavaServer Pages(JSP) 网页程序设计

4

理解服务器端执行

所有 HTML 文件可以在资源管理器中双击执行

但是 JSP 文件必须先放到 Web 服务器中,然后通过 HTTP 的方式访问。因为文件内所有 <%%> 内代码是被 Web 服务器解释执行的。

Page 5: JavaServer Pages(JSP) 网页程序设计

5

理解服务器端执行

案例名称:理解服务器端执行程序名称: 4-01.jsp<%@ page language="java" contentType="text/html;charset=GBK"%><%@page import="java.util.*"%><%

Date dnow = new Date();int dhours = dnow.getHours();int dminutes = dnow.getMinutes();int dseconds = dnow.getSeconds();

out.print(" 服务器时间: " + dhours + ":" + dminutes + ":" + dseconds);%><SCRIPT LANGUAGE="JavaScript">

var dnow = new Date();dhours = dnow.getHours();dminutes = dnow.getMinutes();dseconds = dnow.getSeconds();document.write("<br> 浏览器时间: " + dhours + ":" + dminutes + ":" +

dseconds);</SCRIPT>

Page 6: JavaServer Pages(JSP) 网页程序设计

6

理解服务器端执行

Page 7: JavaServer Pages(JSP) 网页程序设计

7

JSP 页面结构

在一个 JSP 页面中,主要分为三种元素:编译指令、操作指令和 JSP 代码。

编译指令告诉 JSP 的解释引擎(比如: Tomcat ),需要在编译时做什么动作,比如引入一个其它的类,设置 JSP 页面的使用什么语言编码等。

操作指令则是在 JSP 页面被请求时,动态执行的,比如可以根据某个条件动态跳转到另外一个页面。

JSP 代码指的就是我们自己嵌入在 JSP 页面中的 Java 代码,这又分为两种:第一种是 JSP 页面中一些变量和方法的声明,在声明时,使用“ <%!” 和“ %>” 标记。另外一种,就是常用到的用“ <%” 和“ %>” 包含的 JSP 代码块:

Page 8: JavaServer Pages(JSP) 网页程序设计

8

Jsp 语法结构 ( 看一个例子 02_01.jsp )

<html> <head> <title>JSP Date Example </title> </head> <%@ page language="java" %> <%@ page contentType="text/html;charset=GB2312" %> <body> <%!int value=0;%> <% for(int i=1;i<=100;i++) { value=value+i; } %> <p>从 1 加到 100 的结果为: <%=value%> </p> <p> 今天是: <%=new java.util.Date()%> </p> </body> </html>

Page 9: JavaServer Pages(JSP) 网页程序设计

9

JSP 文件结构及主要标签

<%@ page contentType="text/html;charset=gb2312" %><%@ page import="java.util.*“ %>...<HTML> <BODY>其他 HTML 语言<% 符合 JAVA 语法的 JAVA 语句%>

其他 HTML 语言

</BODY></HTML>

Page 10: JavaServer Pages(JSP) 网页程序设计

10

JSP 示例 (Hello.jsp)

<%@ page contentType="text/html;charset=gb2312" %><%@ page import="java.util.*"%>

<HTML> <BODY> <% for ( int i=0; i<2; i++ ) { %> 你好 <br> <% } %> </BODY></HTML>

<HTML> <BODY> 你好 <br> 你好 <br> </BODY></HTML>

Page 11: JavaServer Pages(JSP) 网页程序设计

11

JSP 执行过程

*.jsp *.java *.classrequest

response

执行

jsp parser JSDK

servlet

servlet 分析器

Page 12: JavaServer Pages(JSP) 网页程序设计

12

JSP

执行过程

response

request

Cl i ent

Server

J SP查找对应的 文件

是否存在

Y

N

是否是修改或创建后第一次调用

Y

J sp Parser调用 将其Servl et编译成 程序

J SDK Servl et调用 将对应的Servl et程序编译成 字节码

( )执行 若未载入则先载入J ava已有的对应的 字节码

N

Page 13: JavaServer Pages(JSP) 网页程序设计

13

JSP 示例 (Hello_Date.jsp)

<%@ page import="java.util.*" %><%@ page contentType="text/html; charset=gb2312" %><HTML> <BODY> 你好 , 今天是 <% Date today=new Date(); %> <%=today.getDate()%> 号, 星期 <%=today.getDay()%> </BODY></HTML>

import java.util.*;

response.setContentType("text/html; charset=gb2312");out = pageContext.getOut();out.write(“\r\n\r\n<HTML>\r\n <BODY>\r\n 你好 , 今天是 \r\n"); Date today=new Date();out.print(today.getDate());out.write(" 号,星期 ");out.print(today.getDay());out.write(" \r\n </BODY>\r\n</HTML>\r\n ");

JSP 文件servlet 文件

Page 14: JavaServer Pages(JSP) 网页程序设计

14

JSP 示例 ( 浏览结果 )

Page 15: JavaServer Pages(JSP) 网页程序设计

15

JSP 语法概述

JSP 原始代码中包含了 JSP 元素和Template( 模板 ) data 两类

Template data 指的是 JSP 引擎不处理的部分,即标记 <%……%> 以外的部分,例如代码中的 HTML 的内容等 ,这些数据会直接传送到客户端的浏览器

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

Page 16: JavaServer Pages(JSP) 网页程序设计

16

jsp 例子 (hi.jsp) <html>

<head><title>Hi-JSP 实验 </title></head><body> <%String Msg = "This is JSP test."; out.print("Hello World!");%><h2><%=Msg%></h2></body></html>

Template data

JSP 元素

Page 17: JavaServer Pages(JSP) 网页程序设计

17

JSP 语法

JSP 语法分为三种不同的类型

编译器指令 (DIRECTIVE) 例如: <%@ page import=“java.io.*” %>

脚本语法 (SCRIPTING)

动作语法 (ACTION) 例如: <jsp:forward>,<jsp:getProperty>,<jsp:include>

Page 18: JavaServer Pages(JSP) 网页程序设计

18

脚本语法

脚本语法包括 “ HTML 注释” :<!— comments --> “ 隐藏注释” :<%-- comments --%> “ 声明” “ 表达式” “ 脚本段”

Page 19: JavaServer Pages(JSP) 网页程序设计

19

编译器指令

编译器指令包括“包含指令”, “页指令”和“ taglib 指令”

它们包含在“ <%@ %>” 卷标里。 两个主要的指令是 page与 include 。

Page 20: JavaServer Pages(JSP) 网页程序设计

20

动作语法

动作语法包括<jsp:forward>,<jsp:include>,<jsp:plugin> ,<jsp:getProperty>,<jsp:setProperty> 和 <jsp:useBean> 。

Page 21: JavaServer Pages(JSP) 网页程序设计

21

HTML 注释

JSP 语法格式如下: <!-- comment [ <%= expression

%> ] --> 或 <!-- 注释 [<%= 表达式 %> ] --> 这种注释发送到客户端,但不直接显示,

在源代码中可以查看到。

Page 22: JavaServer Pages(JSP) 网页程序设计

22

HTML 注释 (peixun2.1.jsp)

<html><head><title> HTML 注释 </title></head><body> <!-- This file displays the user login screen -->

未显示上一行的注释。</body></html>

Page 23: JavaServer Pages(JSP) 网页程序设计

23

HTML 注释

Page 24: JavaServer Pages(JSP) 网页程序设计

24

HTML 注释 (peixun2.2.jsp)

<html><head><title> 要多加练习 </title></head><body> <!--This page was loaded on <%= (new

java.util.Date()).toLocaleString() %> --> 在源文件中包括当前时间。 </body></html>

Page 25: JavaServer Pages(JSP) 网页程序设计

25

HTML 注释

Page 26: JavaServer Pages(JSP) 网页程序设计

26

IE 中的源程序有注释

Page 27: JavaServer Pages(JSP) 网页程序设计

27

隐藏注释

JSP 语法格式如下: <%-- 注释 --%> 不发送到客户端。

Page 28: JavaServer Pages(JSP) 网页程序设计

28

隐藏注释 (peixun2.3.jsp)

<html> <head><title>A Comment Test</title></head> <body> <h2>A Test of Comments</h2> <%-- This comment will not be visible in

the page source --%> </body> </html>

Page 29: JavaServer Pages(JSP) 网页程序设计

29

隐藏注释

Page 30: JavaServer Pages(JSP) 网页程序设计

30

在 IE 中查看源代码

Page 31: JavaServer Pages(JSP) 网页程序设计

31

声明

JSP 语法格式如下: <%! declaration; [ declaration; ] ...

%> 或 <%! 声明 ; [ 声明 ; ] ... %>

Page 32: JavaServer Pages(JSP) 网页程序设计

32

声明 (test2.4.jsp)

<%@ page language=”java” import=”java.util.*” %>

<html><head><title> test2.4.jsp </title></head><body><%! int i = 0; %> <%! int a, b, c; %><%! Date date; %></body></html>

Page 33: JavaServer Pages(JSP) 网页程序设计

33

表达式

用于在页面上输出信息,语法格式如下: <%= expression %> 或 <%= 表达式 %>

Page 34: JavaServer Pages(JSP) 网页程序设计

34

表达式 (peixun2.4.jsp)

<%@ page language="java" import="java.util.*" %><html><head><title> test </title></head><body><center><%! Date date=new Date(); %> <%! int a, b, c; %>

Page 35: JavaServer Pages(JSP) 网页程序设计

35

表达式

<% a=12;b=a; c=a+b;%><font color="blue"><%=date.toString()%></font> <br> <b>a=<%= a %></b><br><b>b=<%= b %></b><br><b>c=<%= c %></b><br></center></body></html>

Page 36: JavaServer Pages(JSP) 网页程序设计

36

peixun2.4.jsp 执行结果

Page 37: JavaServer Pages(JSP) 网页程序设计

37

脚本段

JSP 语法格式如下: <% code fragment %> 或 <% 代码 %>

Page 38: JavaServer Pages(JSP) 网页程序设计

38

脚本段 (peixun2.5.jsp)

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

<%! int condition;%><html>

<head><title> test </title></head><body>

Page 39: JavaServer Pages(JSP) 网页程序设计

39

<%condition=1;switch(condition){

case 0:out.println("You must select condition

0!"+"<br>"); break; case 1: out.println("You must select condition

1!"+"<br>");

Page 40: JavaServer Pages(JSP) 网页程序设计

40

break; case 2:

out.println("You must select condition 2!"+"<br>"); break; default:

out.println("Your select not in \"0,1,2\",select again!!"+"<br>");

}%> </body>

</html>

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

Page 41: JavaServer Pages(JSP) 网页程序设计

41

脚本段执行结果

Page 42: JavaServer Pages(JSP) 网页程序设计

42

包含指令

include 指令:向当前页中插入一个静态文件的内容。

JSP 语法格式如下: <%@ include file="relativeURL" %>

或 <%@ include file="相对位置 " %>

Page 43: JavaServer Pages(JSP) 网页程序设计

43

包含指令 (peixun2.6.jsp)

<html> <head><title>test</title></head>

<body bgcolor="white"> <font color="blue"> The current date and time are

<%@ include file=“peixun2.6.1.jsp" %> </font>

</body></html> 

Page 44: JavaServer Pages(JSP) 网页程序设计

44

“ peixun2.6.1.jsp”

<%@ page import="java.util.*" %> <%=(new java.util.Date() ).toLocaleString() %>  

Page 45: JavaServer Pages(JSP) 网页程序设计

45

包含指令

Page 46: JavaServer Pages(JSP) 网页程序设计

46

Page 指令

“ Page”指令用于定义 JSP 文件中的全局属性。 JSP 语法格式如下:<%@ page [ language="java" ] [ extends="package.class" ] [import="{package.class | package.*},..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ]          

Page 47: JavaServer Pages(JSP) 网页程序设计

47

Page 指令

[ autoFlush="true | false" ]  [ isThreadSafe="true | false" ]  [ info="text" ]  [ errorPage="relativeURL" ] [ contentType="mimeType [;charset=characterSet]" | "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true | false" ] %>  

Page 48: JavaServer Pages(JSP) 网页程序设计

48

Page 指令

属性:1. language="java" 声明脚本语言的种类,目前只能用 "java" 。2.import="{package.class |

package.* },..." 需要导入的 Java 包的列表,这些包作用于程序

段,表达式,以及声明。下面的包在 JSP 编译时已经导入了,所以就不需要再指明了:

java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*   

Page 49: JavaServer Pages(JSP) 网页程序设计

49

3. errorPage="relativeURL" 设置处理异常事件的 JSP 文件。 4. isErrorPage="true | false" 设置此页是否为出错页,如果被设置为

true, 你就能使用 exception对象

Page 50: JavaServer Pages(JSP) 网页程序设计

50

page 指令详说

“<%@ page %>” 指令作用于整个 JSP 页面,同样包括静态的包含文件。但是“ <%@ page %>” 指令不能作用于动态的包含文件,比如 “ <jsp:include>”。

可以在一个页面中用上多个“ <%@ page %>” 指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为 import属性和 Java 中的 import语句类似 (参照 Java Language, import 语句引入得是 Java 语言中的类 ) ,所以此属性就能多用几次。

无论把“ <%@ page %>” 指令放在 JSP 的文件的哪个地方,它的作用范围都是整个 JSP 页面。不过,为了 JSP 程序的可读性,以及好的编程习惯,最好还是把它放在 JSP 文件的顶部。

Page 51: JavaServer Pages(JSP) 网页程序设计

51

page 指令( peixun2.7.jsp)

<%@ page import="java.util.*, java.lang.*" %> <%@ page buffer="24kb" autoFlush="false" %> <%@ page errorPage="error.jsp" %> <html><head><title>test3</title></head><body>Test for using 'Page'.</body></html>

Page 52: JavaServer Pages(JSP) 网页程序设计

52

page 指令例子运行结果

Page 53: JavaServer Pages(JSP) 网页程序设计

53

taglib 指令

JSP 语法<%@ taglib uri="URIToTagLibrary"

prefix="tagPrefix" %> 用于引入定制标签库

Page 54: JavaServer Pages(JSP) 网页程序设计

54

taglib 指令 属性 1. uri="URIToTagLibrary" Uniform Resource Identifier (URI) 根据标签的前缀对自定义的标签进行唯一的命名, URI 可以是以下的内容: Uniform Resource Locator (URL), 由 RFC 2396 定义 , 可 以从以 下位置 查 看 (http://www.hut.fi/u /jkorpela/rfc/2396/full.html)。

 Uniform Resource Name (URN), 由 RFC 2396定义

一个相对或绝对的路径 可以是标签库描述文件

Page 55: JavaServer Pages(JSP) 网页程序设计

55

2. prefix="tagPrefix" 表示标签在 JSP 中的名称。 在 自定义标 签之前的前缀, 比 如 , 在

<public:loop> 中的 public ,如果这里不写 public ,那么这就是不合法的。请不要用 jsp, jspx, java, javax, servlet, sun, 和 sunw 做为你的前缀,这些已被 Sun公司声明保留。

Page 56: JavaServer Pages(JSP) 网页程序设计

56

Tablib 指令( peixun2.8.jsp)

<%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %>

<html><head>

<title>test</title></head><body>

<public:loop> <%-- 执行代码 --%>

</public:loop> </body>

</html>

Page 57: JavaServer Pages(JSP) 网页程序设计

57

<jsp:forward>

JSP 语法格式如下:1.<jsp:forward page={"relativeURL" | "<%=

expression %>"} /> 2.<jsp:forward page={"relativeURL" | "<%=

expression %>"} > <jsp:param name="parameterName"

value="{parameterValue | <%= expression %>}" />

[<jsp:param … />] </jsp:forward>

“( [<jsp:param … />]” 指可以有多个“ <jsp:param/>” 标记。)

Page 58: JavaServer Pages(JSP) 网页程序设计

58

属性:

1 、 page="{relativeURL | <%= expression

%>}" 这里是一个表达式或是一个字符串用于说明你将要定向的文件或 URL 。这个文件可以是 JSP, 程序段,或者其它能够处理 request 对 象 的 文 件 ( 如asp,cgi,php)  。

Page 59: JavaServer Pages(JSP) 网页程序设计

59

2 . <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />

向一个动态文件发送一个或多个参数,这个文件必须是动态文件。如果想传递多个参数,可以在一个 JSP 文件中使用多个“ <jsp:param>” “; name” 指定参数名,“ value” 指定参数值。

Page 60: JavaServer Pages(JSP) 网页程序设计

60

注意

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

Page 61: JavaServer Pages(JSP) 网页程序设计

61

<jsp:forward> 例子( peixun2.9.jsp)

<%@ page contentType="text/html;charset=gb2312" %><html>

<head><title>test</title>

</head><body>

<jsp:forward page="forwardTo.jsp"><jsp:param name="userName"

value="riso"/></jsp:forward>

</body></html>

Page 62: JavaServer Pages(JSP) 网页程序设计

62

forwardTo.jsp

<%@ page contentType="text/html;charset=gb2312" %>

<!--forwardTo.jsp--><%

String useName=request.getParameter("userName");String outStr= "谢谢光临! ";outStr+=useName;out.println(outStr);

%>

Page 63: JavaServer Pages(JSP) 网页程序设计

63

运行结果( TOMCAT)

Page 64: JavaServer Pages(JSP) 网页程序设计

64

<jsp:include>

包含一个静态或动态文件 .  JSP 语法格式如下:1.<jsp:include page="{relativeURL | <%=expression

%>}"   flush="true" /> 2.<jsp:include page="{relativeURL | <%=expression

%>}"   flush="true" ><jsp:param name="parameterName"

value="{parameterValue | <%= expression %>}" /> [<jsp:param …/>]

</jsp:include> “( [<jsp:param … />]” 指 可 以 有 多 个 “ <jsp:param/>” 标记。)

Page 65: JavaServer Pages(JSP) 网页程序设计

65

<jsp:include> 的属性

1. page="{relativeURL | <%=expression %>}" 参数为一相对路径,或者是代表相对路径的表达式。 2. flush="true"

这里必须使用 flush="true" ,不能使用 false值。而缺省值为 false 。 

Page 66: JavaServer Pages(JSP) 网页程序设计

66

3 . <jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" />

“<jsp:param>” 用来传递一个或多个参数到指定的动态文件,能在一个页面中使用多个“ <jsp:param>”来传递多个参数,

Page 67: JavaServer Pages(JSP) 网页程序设计

67

<jsp:include> 例子 (peixun2.10.jsp)

<html><head>

<title>peixun.2.10.jsp</title></head><body> <jsp:include page="peixun2.10.1.jsp" flush="true" ><jsp:param name="User" value="HiFi King" /></jsp:include> </body>

</html>

Page 68: JavaServer Pages(JSP) 网页程序设计

68

peixun2.10.1.jsp

<%String username;username=request.getParameter("User");out.println("Username is "+username+"<br>");

%>

Page 69: JavaServer Pages(JSP) 网页程序设计

69

<jsp:include>运行结果( TOMCAT)

Page 70: JavaServer Pages(JSP) 网页程序设计

70

<jsp:plugin>

使 用 “ <jsp:plugin>”插入 一 个 applet 或Bean ,必要的话还要下载一个 Java插件用于执行它。

JSP 语法格式如下:<jsp:plugin type="bean | applet" code="classFileName" codebase="classFileDirectoryName"

Page 71: JavaServer Pages(JSP) 网页程序设计

71

[ name="instanceName" ] [ archive="URIToArchive, ..." ] [ align="bottom | top | middle | left | right" ] [ height="displayPixels" ] [ width="displayPixels" ] [ hspace="leftRightPixels" ] [ vspace="topBottomPixels" ] [ jreversion="JREVersionNumber | 1.1" ] [ nspluginurl="URLToPlugin" ] [ iepluginurl="URLToPlugin" ] >

Page 72: JavaServer Pages(JSP) 网页程序设计

72

[ <jsp:params> [ <jsp:param name="parameterName" value="{parameterValue | <%= expression

%>}" /> ]+  </jsp:params> ]  [ <jsp:fallback> text message for user

</jsp:fallback> ] </jsp:plugin>

Page 73: JavaServer Pages(JSP) 网页程序设计

73

<jsp:plugin>属性

1. type="bean | applet" 将被执行的插件对象的类型,你必须得指定这个是 Bean还是 applet, 因为这个属性没有缺省值。

2. code="classFileName" 将会被 Java插件执行的 Java Class 的名字,必

须 以 .class 结尾。 这 个 文 件 必 须存在于codebase属性指定的目录中。

Page 74: JavaServer Pages(JSP) 网页程序设计

74

3. codebase="classFileDirectoryName" 将会被执行的 Java Class 文件的目录(或者

是路径),如果你没有提供此属性,那么使用<jsp:plugin>的 jsp 文件的目录将会被使用。

4. name="instanceName" 这个 Bean或 applet 实例的名字,它将会在

Jsp 其它的地方调用。

Page 75: JavaServer Pages(JSP) 网页程序设计

75

<jsp:plugin> 例子

<jsp:plugin type=applet code="MediaPlay.class" codebase="../classes">

    <jsp:params>           <jsp:param name="way" value="Hall" />     </jsp:params>     <jsp:fallback>           <p>Unable to load applet</p>     </jsp:fallback> </jsp:plugin>

Page 76: JavaServer Pages(JSP) 网页程序设计

76

<jsp:useBean>

创建一个 Bean 实例并指定它的名字和作用范围。

 JSP 语法格式如下:<jsp:useBean         id="beanInstanceName"     scope="page | request | session | application"         {             class="package.class" |            

Page 77: JavaServer Pages(JSP) 网页程序设计

77

type="package.class" |             class="package.class"

type="package.class" |             beanName="{package.class | <%=

expression %>}" type="package.class"         }         {             /> |             > other elements </jsp:useBean>        }

Page 78: JavaServer Pages(JSP) 网页程序设计

78

属性以及用法

1. id="beanInstanceName" 在所定义的范围中确认 Bean 的变量,使之能

在后面的程序中使用此变量名来分辨不同的Bean ,这个变量名对大小写敏感,必须符合所使用的脚本语言的规定,这个规定在 Java Language 规范已经写明。如果 Bean 已经在别的“ <jsp:useBean>” 标记中创建,则当使用这个已经创建过 Bean 时, id 的值必须与原来的那个 id值一致;否则则意味着创建了同一个类的两个不同的对象。

Page 79: JavaServer Pages(JSP) 网页程序设计

79

2 . scope="page | request | session | application"

Bean存在的范围以及 id 变量名的有效范围。缺省值是 page ,以下是详细说明: page - 能在包含“ <jsp:useBean>” 元素的 JSP 文件以及此文件中的所有静态包含文件中使用这个 Bean, 直到页面执行完毕向客户端发回响应或转到另一个文件为止。

Page 80: JavaServer Pages(JSP) 网页程序设计

80

request - 在任何执行相同请求的 Jsp 文件中使用这个 Bean ,直到页面执行完毕向客户端发回响应或转到另一个文件为止。能够使用 Request对象访 问 这 个 Bean, 比 如request.getAttribute(beanInstanceName) 。

session - 从创建 Bean 开始,就能在任何使用相同 session的 jsp 文件中使用这个 Bean 。这个Bean存在于整个 Session生存周期内,任何在分享此 Session的 Jsp 文件都能使用同一 Bean 。注意在创建这 个 Bean 的 Jsp 文 件 中 “ <% @ page %>” 指 令 中 必 须 指定“ session="true"” 。

Page 81: JavaServer Pages(JSP) 网页程序设计

81

application - 从创建 Bean 开始,就能在任何使用相同 application 的 Jsp 文件中使用 Bean 。这个 Bean 存在于整个 application 生存周期内,任何在分享此 application 的 Jsp 文件都能使用同一 Bean.  

Page 82: JavaServer Pages(JSP) 网页程序设计

82

3. class="package.class" 使用 new 关键字以及 class 构造器从一个 class

中实例化一个 bean 。这个 class 不能是抽象的,必 须 有 一 个公用 的 ,没有参数 的 构造器 。 这 个package 的名字区别大小写。

4. type="package.class" 如果这个 Bean已经在指定的范围中存在,那么赋予这个 Bean 一个的数据开库类型 。如果使用type 属 性 的 同 时 没 有 使 用 class 或beanName , Bean 将 不 会 被 实 例 化 。 注意package和 class 的名称区分大小写。

Page 83: JavaServer Pages(JSP) 网页程序设计

83

5 . beanName="{package.class | <%= expression %>}" type="package.class" 使用 java.beans.Beans.instantiate 方法来从一个 class 或串行化的模板中实例化一个 Bean ,同时指定 Bean 的类型。 Beans.instantiate 方法将检查此名称是否表示一个类或一个串行化模板。如 果 这 个 Bean 是 被 串 行 化 的 , 那 么Beans.instantiate 方法将通过使用一个类装载器读取串行化格式(类似 package.class.ser)。

Page 84: JavaServer Pages(JSP) 网页程序设计

84

beanName 可 以 是 package 和class ,也可以是表达式,它的值会传给Beans.instantiate 方法。 type 的值可以和 Bean相同,也可以是它的基类,或者是它所实现的接口。 package 和 class 名字区分大小写。

Page 85: JavaServer Pages(JSP) 网页程序设计

85

<jsp:getProperty>

JSP 语法格式如下:<jsp:getProperty

name="beanInstanceName" property="propertyName" />

属性:1. name="beanInstanceName"   bean 的名字,由 <jsp:useBean> 指定。 2. property="propertyName" 所指定的 Bean 的属性名。

Page 86: JavaServer Pages(JSP) 网页程序设计

86

<jsp:getProperty> 例子<html>// 声明引用的 bean<jsp:useBean id="calendar" scope="page"

class="employee.Calendar" /><head><title>test</title></head><body> Calendar of <jsp:getProperty name="calendar" property="username" /> </body>

</html>

Page 87: JavaServer Pages(JSP) 网页程序设计

87

<jsp:setProperty>

设置 Bean 的属性值 .  JSP 语法格式如下:<jsp:setProperty         name="beanInstanceName"         {             property= "*"   |             property="propertyName"

[ param="parameterName" ]   |             property="propertyName" value="{string

| <%= expression %>}"         } />

Page 88: JavaServer Pages(JSP) 网页程序设计

88

属性

1. name="beanInstanceName" 表示已经在“ <jsp:useBean>” 中创建的

Bean 实例的名字。 2. property="*"

储存用户在 jsp 输入的所有值,用于匹配Bean 中的属性。

Page 89: JavaServer Pages(JSP) 网页程序设计

89

3. property="propertyName" [ param="parameterName" ] 用一个参数值来指定 Bean 中的一个属性值,

一般情况下是从 request 对象中获得的。其 中 property 指 定 Bean 的 属 性名, param 指定 request 中的参数名。

Page 90: JavaServer Pages(JSP) 网页程序设计

90

4. property="propertyName" value="{string | <%= expression %>}" 使用指定的值来设定 Bean属性。这个值可以是字

符串,也可以是表达式。如果这个字符串,那么它就会被转换成 Bean属性的类型(转换方法见表 4.1 )。如果是一个表达式,那么它的类型就必须和将要设定的属性值的类型一致。

如果参数值为空值,那么对应的属性值也不会被设定。此外,不能在同一个“ <jsp:setProperty>”中同时使用 param和 value参数 。

Page 91: JavaServer Pages(JSP) 网页程序设计

91

package rmg;public class student { private long classNo; private String name; private int age; private boolean sexy;

public student() { // 构造函数 classNo=970431; name="ZZZl"; age=34; sexy=true; }

例: //建立类 rmg.student

Page 92: JavaServer Pages(JSP) 网页程序设计

92

public long getClassNo() { return classNo; } public void setClassNo(long no) { this.classNo=no; } public String getName() { return name; } public void setName(String name) { this.name=name; }

Page 93: JavaServer Pages(JSP) 网页程序设计

93

public int getAge() { return age; }

public void setAge(int age) { this.age=age; } public boolean getSexy() { return sexy; } public void setSexy(boolean sexy) { this.sexy=sexy; }}

Page 94: JavaServer Pages(JSP) 网页程序设计

94

<%--JavaBean.jsp 文件,理解 useBean 动作的 scope 作用范围 --%> <html><body><%-- 引用自己编写的 javaBean生成的 bean 组件 --%><jsp:useBean id="student" scope="application"

class="rmg.student" /><%=student.getName()%><br><% student.setName("cong"); %>

<%-- 用 getProperty 动作来返回 bean 组件的属性值 --%><jsp:getProperty name="student" property="classNo" /> <br><jsp:getProperty name="student" property="name" /> <br><jsp:getProperty name="student" property="age" /> <br><jsp:getProperty name="student" property="sexy" /> <br><%-- 取属性值 --%><%=student.getClassNo() %> <br><%=student.getName() %> <br><%=student.getAge() %> <br><%=student.getSexy() %> <br>

Page 95: JavaServer Pages(JSP) 网页程序设计

95

<%-- 引用 Java 类库中生成的 bean 组件 --%><jsp:useBean id="date" scope="session"

class="java.util.Date" /><%=date%><br></body></html>

Page 96: JavaServer Pages(JSP) 网页程序设计

96

第一次运行结果

Page 97: JavaServer Pages(JSP) 网页程序设计

97

以后运行结果第一行发生变化

Page 98: JavaServer Pages(JSP) 网页程序设计

98

测试 session 作用域

<%--JavaBean1.jsp 文件,理解 useBean 动作的 scope 作用范围 --><%@ page contentType="text/html;charset=gb2312" %> <html><body><%-- 引用自己编写的 javaBean生成的 bean 组件 --%><jsp:useBean id="student" scope="session" class="rmg.student" />

<!-- 用 setProperty 动作设定 bean 组件的属性值 --><jsp:setProperty name="student" property="classNo"

value="000001"/><jsp:setProperty name="student" property="name"

value="wanglan"/><jsp:setProperty name="student" property="age" value="22"/><jsp:setProperty name="student" property="sexy" value="true"/>

Page 99: JavaServer Pages(JSP) 网页程序设计

99

<%-- 取属性值 --%><%=student.getClassNo() %> <br><%=student.getName() %> <br><%=student.getAge() %> <br><%=student.getSexy() %> <br><!--用 JSP 类属性设定 bean 组件的属性值 --><%student.setClassNo(000002); %><%student.setName("John"); %><%student.setAge(26); %><%student.setSexy(false); %><br><%=student.getClassNo() %> <br><%=student.getName() %> <br><%=student.getAge() %> <br><%=student.getSexy() %> <br></body></html>

Page 100: JavaServer Pages(JSP) 网页程序设计

100

运行结果

Page 101: JavaServer Pages(JSP) 网页程序设计

101

小结与习题

本局面集中介绍了 JSP 的各种语法,掌握这些语法使读者进行 JSP 开发的基本要求,于一般的网页开发不同, JSP对大小写是敏感的,这一点要注意,尤其是对曾使用过其他开发语言的读者。

与 Bean 相关的几种语法的使用将在“ Bean 的使用”一章中专门进行讲解,因此可对照学习。熟练使用这些语法是必须的,因此读者应该多加练习,观察不同用法所产生的效果上的差异。对于给出的例子最好是自己敲入文件并观察执行结果。

随后的几章将各有重点的讲述与语法相关的一些问题。

Page 102: JavaServer Pages(JSP) 网页程序设计

102

习题

1.举例说明 HTML 注释与隐藏注释有何异同。 2.试写一个 JSP 文件,包含所有 JSP 语法元素 3. Scriptlet 中应遵循什么样的语法规则? 4 . <jsp:include> 元素包含静态文件与包含

动态文件处理上有何不同? 5. <jsp:forward>起到什么样的作用?使用

时有哪些注意事项? 6. page 指令能起到那些作用?有效范围有多

大?

Page 103: JavaServer Pages(JSP) 网页程序设计

103

实践:练习实践:练习 JSPJSP 编程编程

1. 1. HelloWorld.jsp HelloWorld.jsp 最简单的最简单的 jspjsp 程序程序2. 2. Scripting.jsp Scripting.jsp 程序片段程序片段3. 3. Declaration.jsp Declaration.jsp 变量的声明变量的声明4. 4. Directive.jsp Directive.jsp 和 和 Top.htm Top.htm 和 和 Bottom.jsp Bottom.jsp

DirectivesDirectives 语法语法5. 5. Include.jsp Include.jsp 和 和 Date.jsp includeDate.jsp include 指令指令6. 6. News.jsp News.jsp 和 和 Item1.htm Item1.htm 和 和 Item2.htm Item2.htm 和 和

Item3.htm Item3.htm 和 和 Item4.htm <jsp:include >Item4.htm <jsp:include > 的的使用使用

7. 7. ForwardTest.jsp ForwardTest.jsp 和 和 morning.htm morning.htm 和 和 afternoon.jspafternoon.jsp

<jsp:forward ><jsp:forward > 的使用的使用

Page 104: JavaServer Pages(JSP) 网页程序设计

104

3.3 3.3 JSPJSP 内置对象内置对象 JSP 有以下九种内置对象,包括: · request ,请求对象 · response ,响应对象 · pageContext ,页面上下文对象 · session ,会话对象 · application ,应用程序对象 · out ,输出对象 · config ,配置对象 · page ,页面对象 · exception ,例外对象

Page 105: JavaServer Pages(JSP) 网页程序设计

105

重点介绍

request ,请求对象 session ,会话对象 application ,应用程序对象

Page 106: JavaServer Pages(JSP) 网页程序设计

106

综述

有几种对象看起来和 ASP 的内置对象差不多,功能也类似,这是因为这些内置对象的构建基础是标准化的 HTTP协议。如果使用过 ASP ,又对 Java 有一定的了解的话,那么对这几种 JSP 内置对象的使用应该能迅速掌握。需要注意的问题是对象名的写法,包括这些对象方法的调用时也要书写正确,因为 Java 语言本身是大小写敏感的。

Page 107: JavaServer Pages(JSP) 网页程序设计

107

从本质上讲, JSP 的这些内置对象其实都是由特定的 Java 类所产生的,在服务器运行时根据情况自动生成,所以如果你有较好的 Java基础,可以参考相应的类说明,表 3.1给出了他们的对应关系。更进一步的讲解将会在讲解 Servlet 的一章中展开,如果你的 Java基础不太好,可以先熟悉在这一章里所介绍的各种方法的使用。

Page 108: JavaServer Pages(JSP) 网页程序设计

108

Page 109: JavaServer Pages(JSP) 网页程序设计

109

request和 response

“ request” 对象代表的是来自客户端的请求,例如我们在 FORM 表单中填写的信息等,是最常 用 的对象。关于它 的 方 法 使 用较多 的 是getParameter 、 getParameterNames 和getParameterValues ,通过调用这几个方法来获取请求对象中所包含的参数的值

“ response” 对象代表的是对客户端的响应,也就是说可以通过“ response”对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用“ out” 对象即可。

Page 110: JavaServer Pages(JSP) 网页程序设计

110

request对象示例

<html><body> <form action="./Hello_req.jsp"> 姓名 <input type="text" name="UserName"> <input type="submit" value=" 提交 "> </form></body></html>

Page 111: JavaServer Pages(JSP) 网页程序设计

111

request对象示例( Hello_req.jsp

<%@ page contentType="text/html; charset=gb2312" %><%@ page import="java.util.*" %><HTML> <BODY> 你好 , <%! String Name;%> <% Name=request.getParameter("UserName"); %> <%=Name%>, 今天是 <% Date today=new Date(); %> <%=today.getDate()%> 号,星期 <%=today.getDay()%> </BODY></HTML>

Page 112: JavaServer Pages(JSP) 网页程序设计

112

request对象示例(输出结果)

<HTML> <BODY> 你好 ,独孤求败 , 今天是 9 号,星期 1 </BODY></HTML>

Page 113: JavaServer Pages(JSP) 网页程序设计

113

pageContext

“ pageContext” 对象直 译 时 可 以称作“页面上下文”对象,代表的是当前页面运行的一 些 属 性 , 常 用 的 方 法 包 括findAttribute 、 getAttribute 、 getAttributesScope 和 getAttributeNamesInScope ,一般情况下“ pageContext” 对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。

Page 114: JavaServer Pages(JSP) 网页程序设计

114

session对象

“ session” 对象代表服务器与客户端所建立的会话,当需要在不同的 JSP 页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。“ session” 对象建立在 cookie 的基础上,所以使用时应注意判断一下客户端是否打开了 cookie 。常用的方 法 包 括 getId 、 getValue 、 getValueNames和 putValue 等。

Page 115: JavaServer Pages(JSP) 网页程序设计

115

session对象

概要 HTTP 是无状态( stateless )协议; Web Server 对每一个客户端请求都没有历史记忆; Session 用来保存客户端状态信息; 由Web Server 写入; 存于客户端; 客户端的每次访问都把上次的 session 记录传递给

Web Server; Web Server读取客户端提交的 session来获取客

户端的状态信息;

Page 116: JavaServer Pages(JSP) 网页程序设计

116

session对象示例 (Form 表单—Logon_session.html)

<html><body> <form action="./Logon_session.jsp"> 姓名 <input type="text" name="UserName"> <input type="submit" value=" 提交 "> </form></body></html>

Page 117: JavaServer Pages(JSP) 网页程序设计

117

session对象示例Logon_session.jsp

<%@page contentType="text/html;charset=gb2312" %><%@page import="java.util.*" %>

<HTML> <BODY> <% String Name=request.getParameter("UserName"); session.putValue("LogName", Name); %> 你的名字 "<%=Name%>"已经写入 session <br> <a href='./check_session.jsp'>check</a> </BODY></HTML>

Page 118: JavaServer Pages(JSP) 网页程序设计

118

session对象示例(Check_session.jsp)

<%@page contentType="text/html;charset=gb2312" %><HTML><BODY> <% String yourName=(String)session.getValue("LogName"); if (yourName==null) { %>您还未登录 <% }else { %> "<%=yourName%>"已经登录 <% } %></BODY></HTML>

Page 119: JavaServer Pages(JSP) 网页程序设计

119

application对象

“ application” 对象负责提供应用程序在服务器中运行时的一些全局信息,常用 的 方 法 有 getMimeType 和getRealPath 等。

Page 120: JavaServer Pages(JSP) 网页程序设计

120

out

“ out” 对象代表了向客户端发送数据的对象,与“ response” 对象不同,通过“ out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“ out” 对象直接向客户端写一个由程序动态生成 HTML 文件。常用的 方 法除了 print 和 println 之外 ,还包 括clear、 clearBuffer、 flush、 getBufferSize和 getRemaining ,这是因为“ out” 对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。

Page 121: JavaServer Pages(JSP) 网页程序设计

121

config 、 page 、 exception

“ config” 对象提供一些配置信息,常用的方法 有 getInitParameter 和getInitParameterNames ,以获得 Servlet初始化时的参数。

“ page” 对象代表了正在运行的由 JSP 文件产生的类对象,不建议一般读者使用。

“ exception” 对象则代表了 JSP 文件运行时所产生的例外对象,此对象不能在一般 JSP 文件中直接使用,而只能在使用了“ <%@ page isErrorPage="true "%>”的 JSP 文件中使用

Page 122: JavaServer Pages(JSP) 网页程序设计

122

request 请求对象

1. getAttribute 原型: public java.lang.Object

getAttribute(java.lang.String name)

说明:以对象的形式返回特定名称的属性值。这个方法允许 Servlet 引擎给出一个客户请求的特定信息。 ( Servlet为服务器端小程序,所有 JSP 页面都事先翻译成 Servlet 后才执行)

Page 123: JavaServer Pages(JSP) 网页程序设计

123

request 请求对象

如果所给名称的属性不存在将返回空值。 属性名应该遵循和包命名方式同样的约定 , 不 要 采 用 如 “ java.*” “ 、javax.*” 及 “ sun.*”. 这样的命名。

参数: name 一个标示属性名的字符串 返回值:一个包含属性值的对象,当属性不存在是为空。

Page 124: JavaServer Pages(JSP) 网页程序设计

124

request对象使用示例( peixun2.11.jsp )

<%@ page contentType="text/html;charset=gb2312" %><html><head><title>request</title></head><body><form method="POST" action="post.jsp"> <p align="center"> 用户登录 <p align="center">用户名: <input type="text" name="User"

size="20">&nbsp;&nbsp;&nbsp;&nbsp; 密码: <input type="password" name="pwd"

size="20"><br> <br>

Page 125: JavaServer Pages(JSP) 网页程序设计

125

浏览器类型 : <input type="radio" name="radio" value="ie" checked >IE &nbsp;&nbsp;

<input type="radio" name="radio" value="ns">Netscape <br>

资料选项: <input type="checkbox" name="check1" value="ON" checked>

标题 <input type="checkbox" name="check2" value="ON">详细 <input type="hidden" name="hidden" value="transPara"> </p><p align="center"> <input type="submit" value=" 提交 "> <input type="reset" value="全部重写 "></p> </form></body> </html>

Page 126: JavaServer Pages(JSP) 网页程序设计

126

Post.jsp 代码

<%@ page contentType="text/html;charset=gb2312"%><html><head><title>test</title></head><body><%

out.println(" 用户名: "+request.getParameter("User")+"<br>");out.println("密码: "+request.getParameter("pwd")+"<br>");out.println(" 浏览器: "+request.getParameter("radio")+"<br>");out.println(" 标题: "+request.getParameter("check1")+"<br>");out.println("详细: "+request.getParameter("check2")+"<br>");out.println(" 隐含: "+request.getParameter("hidden")+"<br>");out.println("getContentLength()="+request.getContentLength()+"<br>");

Page 127: JavaServer Pages(JSP) 网页程序设计

127

out.println("getContentType()="+request.getContentType()+"<br>");out.println("getRequestURI()="+request.getRequestURI()+"<br>");out.println("getServerPort()="+request.getServerPort()+"<br>");out.println("getServerName()="+request.getServerName()+"<br>");out.println("getProtocol()="+request.getProtocol()+"<br>");out.println("getRemoteAddr()="+request.getRemoteAddr()+"<br>");out.println("getHeaderNames()="+request.getHeaderNames()+"<br>");out.println("getMethod()="+request.getMethod()+"<br>");out.println("getServletPath()="+request.getServletPath()+"<br>");

out.println("isRequestedSessionIdValid()="+request.isRequestedSessionIdValid()+

"<br>");%></body></html>

Page 128: JavaServer Pages(JSP) 网页程序设计

128

运行结果

Page 129: JavaServer Pages(JSP) 网页程序设计

129

Page 130: JavaServer Pages(JSP) 网页程序设计

130

session对象示例

<%--session对象示例, peixun2.12.jsp 文件代码 --%>

<%@ page contentType="text/html;charset=gb2312"%><html><head><title>session</title></head><body><form method="post" action="post1.jsp">请输入您的姓名: <input type="text" name="username"><input type="submit" value="submit"></form ></body></html>

Page 131: JavaServer Pages(JSP) 网页程序设计

131

post1.jsp

<%@ page contentType="text/html;charset=gb2312"%><html><head><title>post.jsp</title></head><body><%@ page language="java" %> <%! String name=""; %> <p> <%

name = request.getParameter("username"); //将 username存入 session session.putValue("username", name);

%> 您的姓名是: <%=name%> <p><form method="post" action="post11.jsp"> 您最喜欢的娱乐是: <input type="text" name="amuse"> <input type="submit" value="submit"> </p></form> </body> </html>

Page 132: JavaServer Pages(JSP) 网页程序设计

132

post11.jsp

<%@ page contentType="text/html;charset=gb2312"%><html>

<head><title>post1.jsp</title></head><body><%@ page language="java"%><%! String amuse=""; %><%

amuse=request.getParameter("amuse");String user=(String)session.getValue("username");

%>您的姓名是: <%=user%>您喜欢的娱乐是: <%=amuse%></body></html>

Page 133: JavaServer Pages(JSP) 网页程序设计

133

运行结果

Page 134: JavaServer Pages(JSP) 网页程序设计

134

提交后

Page 135: JavaServer Pages(JSP) 网页程序设计

135

输入值

Page 136: JavaServer Pages(JSP) 网页程序设计

136

再次提交(保存名字)

Page 137: JavaServer Pages(JSP) 网页程序设计

137

application对象运行示例

<%--application对象示例, peixun2.13.jsp 文件代码 --%><%@ page contentType="text/html;charset=gb2312"%><html>

<head><title>application</title><head><body><% out.println("Java Servlet API Version "+application.getMajorVersion()

+"."+application.getMinorVersion()+"<br>");out.println("peixun2.13.jsp's MIME type is:"+application.getMimeType("peixun2.13.jsp")+"<br>");out.println("URL of 'peixun2.13.jsp' is: "+application.getResource("/peixun2.13.jsp")+"<br>");out.println("getServerInfo()="+application.getServerInfo()+"<br>");out.println(application.getRealPath(" "));application.log("Add a Record to log_file"); %>

</body></html>

Page 138: JavaServer Pages(JSP) 网页程序设计

138

运行结果

Page 139: JavaServer Pages(JSP) 网页程序设计

139

application对象实现网页计数器<%--用 application对象实现网页计数器 peixun2.14.jsp 文件代码 --%><%@ page contentType="text/html;charset=gb2312"%><html>

<head><title>网页计数器 </title><head><body><% if (application.getAttribute("counter")==null)

application.setAttribute("counter","1");else{

String strnum=null;strnum=application.getAttribute("counter").toString();int icount=0;icount=Integer.valueOf(strnum).intValue();icount++;application.setAttribute("counter",Integer.toString(icount));} %>

您是第 <%=application.getAttribute("counter")%>位访问者!</body></html>

Page 140: JavaServer Pages(JSP) 网页程序设计

140

运行结果 ( 第一次访问 )

Page 141: JavaServer Pages(JSP) 网页程序设计

141

刷新一次

Page 142: JavaServer Pages(JSP) 网页程序设计

142

exception对象示例

<%--exception对象示例, ErrorPage.jsp 文件代码 --%>

<%@ page contentType="text/html;charset=gb2312"%><%@ page isErrorPage="true" %><html><body bgcolor="#ffffc0">

<h1>Error page login</h1>

<br>An error occured in the bean. Error Message is: <br><%= exception.getMessage() %><br><%= exception.toString()%><br></body></html>

Page 143: JavaServer Pages(JSP) 网页程序设计

143

内置对象小结

全面介绍了 JSP 的几种内置对象 JSP 的几种内置对象。熟练使用这些内置对象是开发 JSP应用程序的基本要求,尤其是 对 于 request 、 session 和application对象更是必须要掌握的。

会使用对象所具有的方法,能熟练使用每一种对象的几种常用方法。

Page 144: JavaServer Pages(JSP) 网页程序设计

144

3.4 3.4 HTMLHTML 表单表单

复习复习WebWeb运行原理运行原理 HTMLHTML 表单的概念表单的概念 表单元素介绍表单元素介绍 HTMLHTML 表单的客户端确认表单的客户端确认 客户端表单确认实例客户端表单确认实例

Page 145: JavaServer Pages(JSP) 网页程序设计

145

Web运行原理- 1

客户端同 Web 服务器之间的协议为 http HTTP 为超文本传输协议 HTPP协议为“请求和响应”协议 客户端请求包括:请求行、头、信息体 客户端请求的方法

GET、 POST、 HEAD DELETE、 TRACE、 PUT

提交表单的方法: GET、 POST

Page 146: JavaServer Pages(JSP) 网页程序设计

146

Web运行原理- 2

服务器接收到请求后,返回 HTTP响应 每个响应:状态行、头、信息体 常见状态

404 所请求的文件不存在 500 服务器程序出错 200 OK 成功

信息体用于浏览器显示

Page 147: JavaServer Pages(JSP) 网页程序设计

147

页面访问失败

Page 148: JavaServer Pages(JSP) 网页程序设计

148

HTML 表单

表单是具有输入域、文本域的页面 用于客户端同服务器端交互 用户在客户端填写表单,然后“提交” 表单中的信息发送到服务器 服务器返回处理情况

Page 149: JavaServer Pages(JSP) 网页程序设计

149

HTML 表单标记

表单主标记 <form> </form>

表单中的标记 <input> <select> </select> <option> <textarea> </textarea>

<form> 是表单开始标记, </form> 结束

Page 150: JavaServer Pages(JSP) 网页程序设计

150

表单的例子( peixun2.15.jsp)

<%-- 表单例子, peixun2.15.jsp 文件代码 --%>

<%@ page contentType="text/html;charset=gb2312"%><html>

<head><title> 表单 </title><head><body><form method="POST" action=""> <p align="center"> 用户登录 <p align="center">用户名: <input type="text" name="User"

size="20">&nbsp;&nbsp;&nbsp;&nbsp; 密码: <input type="password" name="pwd" size="20"><br>

<br></form></body></html>

Page 151: JavaServer Pages(JSP) 网页程序设计

151

运行结果

Page 152: JavaServer Pages(JSP) 网页程序设计

152

form 标记

描述表单的特性,语法<form method="POST" action="“ enctype=“”>

method 表单传输方法 GET 方法将表单信息在 URL 后传输 POST 方法将表单信息作为信息体传输

action 为表单处理方式,通常为一个URL

enctype 为编码方式

Page 153: JavaServer Pages(JSP) 网页程序设计

153

<input> 标记

表单中输入信息的区域 属性

type 类型 name 名称 id 标识 maxlength 最大字符数 size 输入域宽度 value 域的初始值 button 按钮 用 javascript响应

Page 154: JavaServer Pages(JSP) 网页程序设计

154

<input> 的类型

text 文本 passwowrd 口令方式 checkbox 多选框 name相同 radio 单选按钮 name相同 image 图片 hidden 隐藏表单 发送数据 submit 提交按钮 向服务器提交表单 reset 复位按钮 将表单充置为初始状态

Page 155: JavaServer Pages(JSP) 网页程序设计

155

文本框: TEXTAREA

多行文本域: <textarea> </textarea>

参数 COLS :宽度 ROWS :高度 NAME :名称<textarea NAME=“Computer” ROWS=6 COLS=64>

CPU PIV 1500Memory 512M

</textarea>

Page 156: JavaServer Pages(JSP) 网页程序设计

156

下拉框: SELECT

定义列表框: <select> </select> 参数

MULTIPLE 可同时选取多行 NAME 名称 SIZE 可见项目数

每个项目用 option 标记 属性 SELECTED出现在 option 表示选

Page 157: JavaServer Pages(JSP) 网页程序设计

157

select 的例子

<select name="area" style="width"50" size="1"><option value="北京 " selected > 北京 </option><option value=" 天津 " > 天津 </option><option value=" 上海 " > 上海 </option><option value="重庆 " > 重庆 </option>

</select>

Page 158: JavaServer Pages(JSP) 网页程序设计

158

表单提交

提交方式: submit 类型按钮提交表单 通过普通按钮的 javascript函数

传输方法依据 <form> 中的 method 推荐使用 POST

传输编码依据 <form> 中的 enctype 处理方式依据 <form> 中的 action <input type="submit" value=" 提交 ">

Page 159: JavaServer Pages(JSP) 网页程序设计

159

表单清除

reset按钮重置表单为初始值 <input type="reset" value="全部重写 "></p>

Page 160: JavaServer Pages(JSP) 网页程序设计

160

综合例子

<%-- 表单综合例子, peixun2.16.jsp 文件代码 --%>

<%@ page contentType="text/html;charset=gb2312"%><html>

<head><title> 表单 </title><head><body><form method="POST" action=""> <p align="center"> 用户注册<p align="center">用户名: <input type="text" name="User"

size="20">&nbsp;&nbsp;&nbsp;&nbsp; 密码: <input type="password" name="pwd" size="20"><br> <br><p> 你喜欢:<input type="checkbox" name="sports" value=football> 足球

<input type="checkbox" name="sports" value=bastketball> 篮球

Page 161: JavaServer Pages(JSP) 网页程序设计

161

&nbsp;&nbsp;&nbsp;&nbsp;性别:<input type="radio" name="sexy" value=male> 男 <input type="radio" name="sexy" value=female> 女 <br><br>

<p> 你的计算机 </p><textarea NAME=“Computer” ROWS=6 COLS=64>

CPU PIV 1500Memory 512M

</textarea><br><br><p> 你计算机的操作系统<input type="image" name="os" src="images\

TURBOLINUX6.GIF">

Page 162: JavaServer Pages(JSP) 网页程序设计

162

&nbsp;&nbsp;&nbsp;&nbsp;你所在地:<select name="area" style="width"50" size="1">

<option value="北京 " selected > 北京 </option><option value=" 天津 " > 天津 </option><option value=" 上海 " > 上海 </option><option value="重庆 " > 重庆 </option>

</select> <br> <br> <input type="submit" value=" 提交 "> <input type="reset" value="全部重写 "></p> </form></body>

Page 163: JavaServer Pages(JSP) 网页程序设计

163

运行结果

Page 164: JavaServer Pages(JSP) 网页程序设计

164

表单的确认

客户端确认 减少服务器负载 缩短用户等待时间 兼容性难

服务器端确认 统一确认 兼容性强 服务器负载重

Page 165: JavaServer Pages(JSP) 网页程序设计

165

客户端确认

采用 javascript进行确认 常用函数

isBetween isDate isTime isDigit isEmail isEmpty isInt isReal

Page 166: JavaServer Pages(JSP) 网页程序设计

166

客户端确认例子

<%-- 客户端确认例子, peixun2.17.jsp 文件代码 --%>

<%@ page contentType="text/html;charset=gb2312"%><html>

<head><title> 客户端确认 </title><head><body><form method="POST" name="frm1" onsubmit="return

checkform(this)"> <p align="center"> 用户登录 <p align="center">用户名: <input type="text" name="name"

size="20">&nbsp;&nbsp;&nbsp;&nbsp; 密码: <input type="password" name="pwd" size="20"><br> <br><input type="submit" value=" 提交 "> <input type="reset" value="全部重写 "></p> </form>

Page 167: JavaServer Pages(JSP) 网页程序设计

167

<SCRIPT language=JavaScript>function checkform(frm){

var flag=true;if(frm.name.value==""){ alert("姓名不能为空,请输入值! "); frm.name.focus(); flag=false; }

return flag;}</SCRIPT></body></html>

Page 168: JavaServer Pages(JSP) 网页程序设计

168

运行结果

Page 169: JavaServer Pages(JSP) 网页程序设计

169

2.3.4 2.3.4 JSPJSP 与客户机的交互与客户机的交互

从表单中获得参数从表单中获得参数 返回参数返回参数 表单的服务器端确认表单的服务器端确认

Page 170: JavaServer Pages(JSP) 网页程序设计

170

从表单中获得参数从表单中获得参数

JSPJSP 通过通过 requestrequest 内置对象获取表单内置对象获取表单信息信息

用不同的方法获取不同种类的信息用不同的方法获取不同种类的信息 获取参数的主要方法:获取参数的主要方法:

getParameter() getParameter() 获取参数的值获取参数的值 getParameterNames() getParameterNames() 获取参数的名获取参数的名称称

getParameterValues() getParameterValues() 获取多个值获取多个值

Page 171: JavaServer Pages(JSP) 网页程序设计

171

getParameter()getParameter()

可以获得文本框、文本区域、单选、多选的值

表单中各元素的 NAME属性是它的唯一标识,用它获取参数。

参考 peixun2.11.jsp及 post.jso<input type="text" name="User" >request.getParameter("User");

Page 172: JavaServer Pages(JSP) 网页程序设计

172

向客户端输出

使用内置对象 outout.println(content)

使用“ =”<%= content% >

参看 peixun2.11.jsp和 post.jspout.println(" 用户名: " +User+"<br>");

参看 peixun2.14.jsp您是第 <%=application.getAttribute("counter")%>位访问者!

Page 173: JavaServer Pages(JSP) 网页程序设计

173

表单的服务器端确认

在客户端不能用 JSP进行确认 分工:数据处理在服务器端 实效性:客户端得到服务器确认后表明

数据已经到达服务器 客户端兼容性好 缺点:加大服务器负载和用户等待时间

Page 174: JavaServer Pages(JSP) 网页程序设计

174

服务器端确认方法

采用 Java 类对表单数据进行复杂的检查 采用 JSP进行确认

Page 175: JavaServer Pages(JSP) 网页程序设计

175

服务器端确认的例子

<%-- 服务器端确认例子, peixun2.18.jsp 文件代码 --%><%@ page contentType="text/html;charset=gb2312"%><html>

<head><title> 服务器端确认 </title><head><body><form method="POST" name="frm1" action="loginAction.jsp"> <p align="center"> 用户登录 <p align="center">用户名: <input type="text" name="name"

size="20">&nbsp;&nbsp;&nbsp;&nbsp; 密码: <input type="password" name="pwd" size="20"><br> <br><input type="submit" value=" 提交 "> <input type="reset" value="全部重写 "></p> </form></body></html>

Page 176: JavaServer Pages(JSP) 网页程序设计

176

loginAction.jsp

<%-- 服务器端确认例子, loginAction.jsp确认表单文件代码 --%><%@ page contentType="text/html;charset=gb2312"%><html><head><title>确认 JSP</title></head><body><%

String name=request.getParameter("name");String pwd=request.getParameter("pwd");if((name!=null)&&(!name.equals(""))){name=new String(name.getBytes("ISO8859_1"), "gb2312");out.println(" 用户名: " +name+"<br>");out.println("密码: "+pwd+"<br>");}else{

%>

Page 177: JavaServer Pages(JSP) 网页程序设计

177

<p align="center"> 用户名不能为空 </p><br><br><form method="POST" name="frm1" action="loginAction.jsp"> <p align="center"> 用户登录 <p align="center">用户名: <input type="text" name="name" size="20" value="<%=name

%>">&nbsp;&nbsp;&nbsp;&nbsp; 密码: <input type="password" name="pwd" size="20" value="<%=pwd

%>"><br> <br><input type="submit" value=" 提交 "> <input type="reset" value="全部重写 "></p> </form><%}%>

</body></html>

Page 178: JavaServer Pages(JSP) 网页程序设计

178

运行结果( TOMCAT)

Page 179: JavaServer Pages(JSP) 网页程序设计

179

( 未输入姓名 ) 直接提交

Page 180: JavaServer Pages(JSP) 网页程序设计

180

输入用户名

Page 181: JavaServer Pages(JSP) 网页程序设计

181

输入用户名后提交

Page 182: JavaServer Pages(JSP) 网页程序设计

182

JSP 的汉字问题的原理

客户端和服务器用 gb2312 HTTP 传输编码用 ISO8859_1 服务器需要指示客户端文档的编码方式

Cl i ent

Server

ISO8859_1ISO8859_1

gb2312 gb2312

Page 183: JavaServer Pages(JSP) 网页程序设计

183

JSP 的汉字问题出现环节

客户端显示文档时的编码方式(由服务器中的 JSP、 Servlet 指明)

客户端发送汉字时自动转换为 iso8859_1 服务器中采用 gb2312对汉字编码,接收

到客户端汉字需要转换为 gb2312 服务器端将 JSP 转换为 Servlet 时自动将汉字转换为 iso8859_1

服务器端应该告诉客户端汉字的编码方式

Page 184: JavaServer Pages(JSP) 网页程序设计

184

JSP汉字问题的范围

JSP 文件的汉字问题 表单处理的汉字问题 Servlet 的汉字问题(以后讲解) JDBC 的汉字问题(以后讲解)

Page 185: JavaServer Pages(JSP) 网页程序设计

185

JSP 文件的汉字问题

JSP 中的汉字字符串在服务器端用 gb2312 在编译为 Servlet 时自动转换为 iso8859_1 汉字在传输中是正确的 在没有特别指示下,浏览器中无法正确显示 在 HTML 中指示浏览器文档的编码( myJSP\

index.html) <meta http-equiv="Content-Type" content="text/html;

charset=gb2312"> 在 JSP 中指示 JSP 引擎文档的编码

<%@ page contentType="text/html;charset=gb2312"%>

每个要显示汉字的 JSP 文档都应该包含该语句

Page 186: JavaServer Pages(JSP) 网页程序设计

186

JSP 文件的汉字问题 (JSPhanzi.jsp)

<%--JSP 的汉字问题 JSPhanzi.jsp--%><html><head><title>JSP 中的汉字问题 </title></head><body> <% String HelloMsg=" 你好 "; out.println(HelloMsg);%></body></html>

<html><head><title>JSP 中的汉字问题 </title></head><body> 你好</body></html>

Page 187: JavaServer Pages(JSP) 网页程序设计

187

JSP 中增加编码指示后

<%--JSP 的汉字问题 JSPhanzi.jsp--%><%@ page contentType="text/html;charset=gb2312"%><html><head><title>JSP 中的汉字问题 </title></head><body> <% String HelloMsg=" 你好 "; out.println(HelloMsg);%></body></html>

<html><head><title>JSP 中的汉字问题 </title></head><body> 你好</body></html>

Page 188: JavaServer Pages(JSP) 网页程序设计

188

表单处理中的汉字问题

表单处理涉及到客户端和服务器的完整交互过程

在客户端和服务器是 gb2312 ,传输用ISO8859_1

在服务器端接收到客户端数据时需要转换为 gb2312 后进行处理,方法name=new String(name.getBytes("ISO8859_1"), "gb2312");

服务器端指示客户端汉字的显示编码<%@ page contentType="text/html;charset=gb2312"%>

Page 189: JavaServer Pages(JSP) 网页程序设计

189

表单处理的汉字问题 (hanzi.jsp)

<%-- 表单处理的汉字问题, hanzi.jsp 文件代码 --%>

<%@ page contentType="text/html;charset=gb2312"%><html><head><title> 表单处理的汉字问题 </title><head><body><form method="POST" name="frm1" action="hanziAction.jsp"> <p align="center"> 用户登录 <p align="center">用户名: <input type="text" name="name" size="20"><input type="submit" value=" 提交 "> </form></body></html>

<html><head><title> 表单处理的汉字问题 </title><head><body><form method="POST" name="frm1“ action="hanziAction.jsp"> <p align="center"> 用户登录 <p align="center">用户名:<input type="text" name="name" size="20"><input type="submit" value=" 提交 "> </form></body></html>

Page 190: JavaServer Pages(JSP) 网页程序设计

190

处理过程

<%--hanziAction.jsp--%><%@page contentType="text/html;charset=gb2312"%><html><head><title> 表单中汉字的处理 </title></head><body> <%String name=request.getParameter("name");//name=new String(name.getBytes("ISO8859_1"), "gb2312");out.println(" 用户名: " +name+"<br>");%></body></html>

<html><head><title> 表单中汉字的处理 </title></head><body> 用户名: ????<br></body></html>

Page 191: JavaServer Pages(JSP) 网页程序设计

191

处理过程(修改后)

<%--hanziAction.jsp--%><%@page contentType="text/html;charset=gb2312"%><html><head><title> 表单中汉字的处理 </title></head><body> <%String name=request.getParameter("name");name=new String(name.getBytes("ISO8859_1"), "gb2312");

out.println(" 用户名: " +name+"<br>");%></body></html>

<html><head><title> 表单中汉字的处理 </title></head><body> 用户名:测试 <br></body></html>

Page 192: JavaServer Pages(JSP) 网页程序设计

192

2.4 2.4 实践:练习实践:练习 JSPJSP 编程编程

分析 softshop 的首页及用户认证 编写综合练习的首页、认证和注册页面 注意汉字问题

Page 193: JavaServer Pages(JSP) 网页程序设计

193

综合练习综合练习 综合练习:我的网上商店综合练习:我的网上商店myshopmyshop ,,具有以下功能具有以下功能

用户登录、注册用户登录、注册 口令空转向口令空转向 loginError.jsploginError.jsp ((采用采用 <jsp:forward ><jsp:forward >)) 建立建立 webweb应用应用 myshopmyshop ,,参考参考 softshopsoftshop目录结构目录结构 体会表单的两种发送方法体会表单的两种发送方法

页面设计:页面设计: 完 成 首 页 、 用 户 登 录 、 注 册完 成 首 页 、 用 户 登 录 、 注 册(( index.jspindex.jsp、、 login.jsplogin.jsp、、 registor.jspregistor.jsp))

首页首页 index.jspindex.jsp 包括简介、商品分类、新注册用户、登录用户计包括简介、商品分类、新注册用户、登录用户计数,按钮:用户登录、注册数,按钮:用户登录、注册

用户计数采用用户计数采用 applicationapplication 对象对象 login.jsplogin.jsp 包括输入用户名、口令的表单,用户名是否为空由服包括输入用户名、口令的表单,用户名是否为空由服

务器端确认,口令是否为空由客户端确认,处理表单的务器端确认,口令是否为空由客户端确认,处理表单的 jspjsp 为为check.jspcheck.jsp ,,当口令为空时转向显示错误页面,登录成功时显示当口令为空时转向显示错误页面,登录成功时显示用户名和口令用户名和口令((表单采用表单采用 GETGET 方法发送)方法发送)

Page 194: JavaServer Pages(JSP) 网页程序设计

194

2.4 2.4 实践:练习实践:练习 JSPJSP 编程-编程-综合练习综合练习

registor.jspregistor.jsp 中录入用户信息,综合使用表单的功能:中录入用户信息,综合使用表单的功能:formform 标记标记((表单采用表单采用 POSTPOST 方法发送)方法发送)texttext ::用户名、口令用户名、口令radioradio按钮:性别按钮:性别selectselect ::出生年月、所在地、行业 其中会使用到出生年月、所在地、行业 其中会使用到 optionoption 标记标记checkboxcheckbox ::选择兴趣选择兴趣textareatextarea ::自我介绍自我介绍按钮:提交和重新输入按钮:提交和重新输入

处 理处 理 registor.jspregistor.jsp 的的 jspjsp 为为 record.jsprecord.jsp , , record.jsprecord.jsp 接 收接 收texttext 、、 textareatextarea 、、 radioradio 、、 selectselect 的数据,并显示出来(注意汉字问的数据,并显示出来(注意汉字问题)。题)。

record.jsprecord.jsp 中用中用 sessionsession存储新注册的用户名。存储新注册的用户名。 record.jsprecord.jsp 包含返回首页包含返回首页 index.jspindex.jsp 的超链接的超链接 index.jspindex.jsp 中用中用 sessionsession 提取新注册用户并显示提取新注册用户并显示

Page 195: JavaServer Pages(JSP) 网页程序设计

195

谢谢谢谢