JSP示例(Hello.jsp) <HTML> <BODY> 你好<br> </BODY> <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.util.*"%> <HTML> <BODY> <% for ( int i=0; i<2; i++ ) { %> 你好<br> } </BODY> </HTML>
JSP执行过程 servlet servlet 分析器 JVM request jsp parser *.jsp *.java *.class 执行 response
JSP执行过程
三、JSP编程基础 Java特性及入门基础 HTML简介 3. JavaScript简介
3.2 HTML简介 HTML页面的基本结构 01.html 使用链接标记 link-.html 使用字体标记 font.html form标记的使用 table标记的使用
HTML表单 Web运行原理 HTML表单的概念 表单元素介绍 HTML表单的客户端确认 服务器端的确认
Web运行原理 客户端同Web服务器之间的协议为http HTTP为超文本传输协议 HTPP协议为“请求和响应”协议 客户端请求包括:请求行、头、信息体 客户端请求的方法 GET、POST、HEAD DELETE、TRACE、PUT 提交表单的方法: GET、POST
Web运行原理 服务器接收到请求后,返回HTTP响应 每个响应:状态行、头、信息体 常见状态 信息体用于浏览器显示 404 所请求的文件不存在 500 服务器程序出错 200 OK 成功 信息体用于浏览器显示
HTML表单 表单是具有输入域、文本域的页面 用于客户端同服务器端交互 用户在客户端填写表单,然后“提交” 表单中的信息发送到服务器 服务器返回处理情况
HTML表单标记 表单主标记 表单中的标记 <form>是表单开始标记,</form>结束 <input> <select> </select> <option> <textarea> </textarea> <form>是表单开始标记,</form>结束
表单的例子 <%--表单例子,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"> 密码:<input type="password" name="pwd" size="20"><br> <br> </form> </body> </html>
运行结果
form标记 描述表单的特性,语法 method表单传输方法 enctype为编码方式 GET方法 POST方法 <form method="POST" action="“ enctype=“”> method表单传输方法 GET方法 POST方法 action为表单处理方式,通常为一个URL enctype为编码方式
<input>标记 表单中输入信息的区域 属性 type 类型 name 名称 id 标识 maxlength 最大字符数 size 输入域宽度 value 域的初始值 button 按钮 用javascript响应
<input>的类型 text 文本 passwowrd 口令方式 checkbox 多选框 name相同 radio 单选按钮 name相同 image 图片 hidden 隐藏表单 发送数据 submit 提交按钮 向服务器提交表单 reset 复位按钮 将表单充置为初始状态
文本框:TEXTAREA 多行文本域:<textarea> </textarea> 参数 COLS:宽度 ROWS:高度 NAME:名称 <textarea NAME=“Computer” ROWS=6 COLS=64> CPU PIV 1500 Memory 512M </textarea>
下拉框:SELECT 定义列表框:<select> </select> 参数 每个项目用option标记 MULTIPLE 可同时选取多行 NAME 名称 SIZE 可见项目数 每个项目用option标记 属性SELECTED出现在option表示选中
select的例子 <select name="area" style="width"50" size="1"> <option value="北京" selected > 北京 </option> <option value="天津" > 天津 </option> <option value="上海" > 上海 </option> <option value="重庆" > 重庆 </option> </select>
表单提交 提交方式: 传输方法依据<form>中的method 传输编码依据<form>中的enctype submit类型按钮提交表单 通过普通按钮的javascript函数 传输方法依据<form>中的method 推荐使用POST 传输编码依据<form>中的enctype 处理方式依据<form>中的action <input type="submit" value=" 提交">
表单清除 reset按钮重置表单为初始值 <input type="reset" value="全部重写"></p>
综合例子 <%--表单综合例子,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"> 密码:<input type="password" name="pwd" size="20"><br> <br> <p>你喜欢: <input type="checkbox" name="sports" value=football> 足球 <input type="checkbox" name="sports" value=bastketball> 篮球
性别: <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 1500 Memory 512M </textarea><br><br> <p>你计算机的操作系统 <input type="image" name="os" src="images\TURBOLINUX6.GIF">
你所在地: <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>
运行结果
表单的确认 客户端确认 减少服务器负载 缩短用户等待时间 兼容性难 服务器端确认 统一确认 兼容性强 服务器负载重
客户端确认 采用javascript进行确认 常用函数 isBetween isDate isTime isDigit isEmail isEmpty isInt isReal
客户端确认例子 <%--客户端确认例子,test.jsp文件代码--%> <%@ page contentType="text/html;charset=gb2312"%> <html> <head><title>客户端确认</title><head> <body> <form method="POST" name="frm1" onsubmit="return checkform(frm1)"> <p align="center">用户登录 <p align="center"> 用户名:<input type="text" name="name" size="20"> 密码:<input type="password" name="pwd" size="20"><br> <br> <input type="submit" value=" 提交"> <input type="reset" value="全部重写"></p> </form>
<SCRIPT language=JavaScript> function checkform(frm){ var flag=true; if(frm.name.value=="") { alert("姓名不能为空,请输入值!"); frm.name.focus(); flag=false; } return flag; </SCRIPT> </body> </html>
运行结果
JSP与客户机的交互 从表单中获得参数 返回参数 表单的服务器端确认
从表单中获得参数 JSP通过request内置对象获取表单信息 用不同的方法获取不同种类的信息 获取参数的主要方法: getParameter() 获取参数的值 getParameterNames() 获取所有参数名的枚举 getParameterValues() 获取一个参数的多个值
getParameter() 可以获得文本框、文本区域、单选、多选的值 表单中各元素的NAME属性是它的唯一标识,用它获取参数。 例如: <input type="text" name="User" > request.getParameter("User");
向客户端输出 使用内置对象out 使用“<%= %>” 使用内置对象applicatioin <%=User % > out.println(“用户名:" +User+"<br>"); 使用“<%= %>” <%=User % > 使用内置对象applicatioin <%= application.getAttribute(“counter”)%>位访问者! ……
表单的服务器端确认 在客户端不能用JSP进行确认 分工:数据处理在服务器端 实效性:客户端得到服务器确认后表明数据已经到达服务器 客户端兼容性好 缺点:增加服务器负载和用户等待时间
服务器端确认方法 采用Java类对表单数据进行检查 采用JSP进行确认
服务器端确认的例子 <%--服务器端确认例子,test.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"> 密码:<input type="password" name="pwd" size="20"><br> <br> <input type="submit" value=" 提交“ > <input type="reset" value="全部重写"></p> </form> </body> </html>
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{ %>
<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%>"> 密码:<input type="password" name="pwd" size="20" value="<%=pwd%>"><br> <br> <input type="submit" value=" 提交"> <input type="reset" value="全部重写"></p> </form> <%}%> </body> </html>
运行结果(TOMCAT)
(未输入姓名)直接提交
输入用户名
输入用户名后提交
3.3 JavaScript简介 JavaScript是脚本语言,用来实现客户端的特 效,客户端用户信息输入的验证等。 myjsp/02/formcheck.htm
四、 服务器配置 Tomcat应用服务器 Resin应用服务器
五、 JSP语法 JSP的脚本语句 JSP的编译指示语句 JSP的动作语句
JSP文件结构及主要标签 <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.util.*“ %> ... <HTML> <BODY> 其他 HTML 语言 <% 符合JAVA 语法的 JAVA 语句 %> </BODY> </HTML>
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 "); servlet文件 JSP文件
JSP语法概述 JSP原始代码中包含了JSP元素和Template(模板) data两类 Template data指的是JSP引擎不处理的部分,即标记<%……%>以外的部分,例如代码中的HTML的内容等 ,这些数据会直接传送到客户端的浏览器 JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误。
jsp例子(hi.jsp) Template data 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元素
JSP语法 JSP语法分为三种不同的类型 编译器指令(DIRECTIVE) 例如: <%@ page import=“java.io.*” %> 脚本语法(SCRIPTING) 动作语法(ACTION) 例如: <jsp:forward> <jsp:getProperty>,<jsp:include>
JSP中的脚本语句 脚本语句包括 “HTML注释”:<!— comments --> “声明”: <%! int age;%> “表达式” <%=age%> “脚本段” <% scriplet代码段 %>
JSP的编译指示语句 编译器指令包括“include”指令, “page”指令和“taglib”指令 它们包含在“<%@ %>”卷标里。
JSP的动作语句 动作语法包括 <jsp:forward>,<jsp:include>,<jsp:plugin>, <jsp:getProperty>,<jsp:setProperty>,<jsp:useBean>。
HTML注释 JSP 语法格式如下: <!-- comment [ <%= expression %> ] --> 或 <!-- 注释 [<%= 表达式 %> ] --> 这种注释发送到客户端,但不直接显示,在源代码中可以查看到,JSP指令仍被编译执行。
HTML注释(teach\4-1.jsp) HTML> <HEAD> <TITLE>HTML注释</TITLE> </HEAD> <BODY> <!-- 测试注释使用的程序 --> <p> <b><font size="+3">显示出来的文字!</font></b> </BODY> </HTML>
HTML注释(4-2.jsp) <html> <head> <title>要多加练习</title> </head> <body> <!-- 这个页面在<%= new java.util.Date()%>被访问 --> 在源文件中包括当前时间。 </body> </html>
隐藏注释 JSP 语法格式如下: <%-- 注释 --%>
隐藏注释 (4-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>
声明 JSP 语法格式如下: <%! declaration; [ declaration; ] ... %> <%@ page language=”java” import=”java.util.*” %> <html> <body> <%! int i = 0; %> <%! int a, b, c; %> <%! Date date; %> </body> </html> 4-4.jsp
表达式 用于在页面上输出信息,语法格式如下: <%= expression %>
表达式(4-5.jsp) <%@ page language="java" import="java.util.*" %> <html> <head> <title> test </title> </head> <body> <center> <%! Date date=new Date(); %> <%! int a, b, c; %> <% 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>
4-5.jsp执行结果
Scriptlet脚本段 JSP 语法格式如下: <% code fragment %>
4-6.jsp <%@ page language="java" import="java.util.*" %> <html> <body> <%! int condition=2;%> <% switch(condition){ case 0: out.println("You select condition 0!"+"<br>"); break; case 1: out.println("You select condition 1!"+"<br>"); case 2: out.println("You select condition 2!"+"<br>"); default: out.println("Your select not in 0,1,2“); } %> </body> </html> 4-6.jsp
include包含指令 JSP 语法格式如下: <%@ include file="relativeURL" %> 或
<html> <head> <title>test</title> </head> <body bgcolor="white"> <font color="blue"> The current date and time are <%@ include file=“curDate.jsp" %> </font> </body> </html> //curDate.jsp <%@ page import="java.util.*" %> <%=(new java.util.Date() ).toLocaleString() %>
Page指令 “Page”指令用于定义JSP文件中的全局属性。 JSP 语法格式如下: <%@ page JSP 语法格式如下: <%@ page [ language="java" ] [ extends="package.class" ] [import="{package.class | package.*},..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ]
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指令详说 “<%@ page %>”指令作用于整个JSP页面,同样包括静态的包含文件。但是“<%@ page %>”指令不能作用于动态的包含文件,比如 “<jsp:include>”。 可以在一个页面中用上多个“<%@ page %>”指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为import属性和Java中的import语句类似(参照Java Language,import语句引入得是Java语言中的类),所以此属性就能多用几次。 无论把“<%@ page %>”指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部。
page指令(4-9.jsp) <%@ page import=“java.util.*” %> <%@ page buffer="24kb" autoFlush="false" %> <%@ page errorPage="error.jsp" %> <html> <head> <title>test</title> </head> <body> Test for using 'Page'. </body> </html>
taglib指令 JSP语法 <%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %> 用于引入定制标签库
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定义 一个相对或绝对的路径 可以是标签库描述文件
2.prefix="tagPrefix" 表示标签在JSP中的名称。 在自定义标签之前的前缀,比如,在<public:loop>中的public,如果这里不写public,那么这就是不合法的。请不要用jsp, jspx, java, javax, servlet, sun, 和sunw做为你的前缀,这些已被Sun公司声明保留。
Tablib示例 <%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %> <html> <head> <title>test</title> </head> <body> <public:loop> <%-- 执行代码 --%> </public:loop> </body> </html>
<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/>]标记。)
1、page="{relativeURL | <%= expression %>}" 这里是一个表达式或是一个字符串用于说明你将要定向的文件或URL。这个文件可以是JSP,程序段,或者其它能够处理request对象的文件(如asp,cgi,php)。 2.<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> 向一个动态文件发送一个或多个参数,如果想传递多个参数,可以在一个JSP文件中使用多个“<jsp:param>”;“name”指定参数名,“value”指定参数值。 3. “<jsp:forward>”标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象。“<jsp:forward>”标签以后的代码将不执行。
<jsp:forward>例子 <%@ page contentType="text/html;charset=gb2312" %> <html> <head> <title>test</title> </head> <body> <jsp:forward page="forwardTo.jsp"> <jsp:param name="userName" value=“Mike"/> </jsp:forward> </body> </html>
forwardTo.jsp (teach/jsp4/forward.html, testforward1.jsp) <%@ page contentType="text/html;charset=gb2312" %> <!--forwardTo.jsp--> <% String useName=request.getParameter("userName"); String outStr= "谢谢光临!"; outStr+=useName; out.println(outStr); %> (teach/jsp4/forward.html, testforward1.jsp)
<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/>”标记) 注意:在JSP页面被请求时才将指定文件的内容插入到服务器的 响应输出中。
<jsp:include>的属性 1.page="{relativeURL | <%=expression %>}" 参数为一相对路径,或者是代表相对路径的表达式。 2.flush="true" 这里必须使用flush=“true”,不能使用false值。而缺省值为false 。 3.<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }"/> “<jsp:param>”用来传递一个或多个参数到指定的动态文件,能在一个页面中使用多个“<jsp:param>”来传递多个参数,
<jsp:include> 例子(peixun2.10.jsp) <html> <head> <title>peixun.2.10.jsp</title> </head> <body> <jsp:include page=“included.jsp" flush="true" > <jsp:param name="User" value="HiFi King" /> </jsp:include> </body> </html>
included.jsp <% String username; username=request.getParameter("User"); out.println("Username is "+username+"<br>"); %>
<jsp:include>运行结果
<jsp:plugin> 使用“<jsp:plugin>”插入一个applet或Bean,必要的话还要下载一个Java插件用于执行它。 JSP 语法格式如下: <jsp:plugin type="bean | applet" code="classFileName" codebase="classFileDirectoryName"
[ 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" ] >
[ <jsp:params> [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ] </jsp:params> ] [ <jsp:fallback> text message for user </jsp:fallback> ] </jsp:plugin>
<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>
<jsp:useBean> 创建一个JavaBean实例并指定它的名字和作用范围。 JSP 语法格式如下: <jsp:useBean id="beanInstanceName" scope="page | request | session | application" class="package.class" | type="package.class" …… > </jsp:useBean>
属性以及用法 1.id="beanInstanceName" 在所定义的范围中确认Bean的变量,使之能在后面的程序中使用此变量名来分辨不同的Bean ,这个变量名对大小写敏感,必须符合所使用的脚本语言的规定,这个规定在Java Language 规范已经写明。如果Bean已经在别的“<jsp:useBean>”标记中创建,则当使用这个已经创建过Bean时,id的值必须与原来的那个id值一致;否则则意味着创建了同一个类的两个不同的对象。
2.scope="page|request|session|application" Bean存在的范围以及id变量名的有效范围。缺省值是page,以下是详细说明: page - 能在包含“<jsp:useBean>”元素的JSP文件以及此文件中的所有静态包含文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。 request - 在任何执行相同请求的Jsp文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。能够使用Request对象访问这个Bean,比如request.getAttribute(beanInstanceName)。 session - 从创建Bean开始,就能在任何使用相同session的jsp文件中使用这个Bean。这个Bean存在于整个Session生存周期内,任何在分享此Session的Jsp文件都能使用同一Bean。注意在创建这个Bean的Jsp文件中“<% @ page %>”指令中必须指定“session=”true“”。 application - 从创建Bean开始,就能在任何使用相同application的Jsp文件中使用Bean。这个Bean存在于整个application生存周期内,任何在分享此application的Jsp文件都能使用同一Bean.
3.class="package.class" 4.type="package.class" 使用new关键字以及class构造器从一个class中实例化一个bean。这个class不能是抽象的,必须有一个公用的,没有参数的构造器。这个package的名字区别大小写。 4.type="package.class" 如果这个Bean已经在指定的范围中存在,那么赋予这个Bean一个的数据类型 。如果使用type属性的同时没有使用class或beanName,Bean将不会被实例化。注意package和class的名称区分大小写。
<jsp:getProperty> <jsp:getProperty name="beanInstanceName" property="propertyName" /> 1.name="beanInstanceName" bean的名字,由<jsp:useBean>指定。 2.property="propertyName" 所指定的Bean的属性名。
<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>
<jsp:setProperty> 设置Bean的属性值. JSP 语法格式如下: <jsp:setProperty name="beanInstanceName" property= "*" | property="propertyName" param="parameterName" ] | property="propertyName" value="{string|<%= expression %>}" />
属性 1.name="beanInstanceName" 表示已经在“<jsp:useBean>”中创建的Bean实例的名字。 2.property="*" 储存用户在jsp输入的所有值,用于匹配Bean中的属性。 3.property="propertyName" [ param="parameterName" ] 用一个参数值来指定Bean中的一个属性值,一般情况下是从request对象中获得的。其中property指定Bean的属性名,param指定request中的参数名。 4.property="propertyName" value="{string | <%= expression %>}" 使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果这个字符串,那么它就会被转换成Bean属性的类型。如果是一个表达式,那么它的类型就必须和将要设定的属性值的类型一致。 如果参数值为空值,那么对应的属性值也不会被设定。此外,不能在同一个“<jsp:setProperty>”中同时使用param和value参数 。
例子 例://建立javaBean: myBean.Student package myBean; 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; } 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; 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;
<%--JavaBean.jsp文件,理解useBean动作的scope作用范围 --%> <html> <body> <%-- 引用自己编写的javaBean生成的bean组件 --%> <jsp:useBean id="student" scope="application" class=“myBean.Student" /> <%=student.getname()%><br> <% student.setname("cong"); %> <jsp:setProperty name="student" property=“name“ value= “cong“ /> <br> <%-- 用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>
<%--引用Java类库中生成的bean组件 --%> <jsp:useBean id="date" scope="session" class="java.util.Date" /> <%=date%><br> </body> </html>
第一次运行结果
以后运行结果 第一行发生变化
测试session作用域 <%--JavaBean1.jsp文件,理解useBean动作的scope作用范围--> <%@ page contentType="text/html;charset=gb2312" %> <html> <body> <%-- 引用自己编写的javaBean生成的bean组件 --%> <jsp:useBean id="student" scope="session" class=“myBean.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"/>
<%-- 取属性值 --%> <%=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> </body> </html>
运行结果
3.4 JSP内置对象 JSP 有以下九种内置对象,包括: request,请求对象 response,响应对象 pageContext,页面上下文对象 session,会话对象 application,应用程序对象 out,输出对象 config,配置对象 page,页面对象 exception,例外对象
综述 有几种对象和ASP的内置对象差不多,功能也类似,这是因为这些内置对象的构建基础是标准化的HTTP协议。从本质上讲,JSP的这些内置对象其实都是由特定的Java类所产生的,在服务器运行时根据情况自动生成,表3.1给出了他们的对应关系。需要注意的问题是对象名的写法,包括这些对象方法的调用都要注意大小写。
JSP内置对象映射表
request和response “request” 对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等,是最常用的对象。关于它的方法使用较多的是getParameter、getParameterNames和getParameterValues,通过调用这几个方法来获取请求对象中所包含的参数的值 “response” 对象代表的是对客户端的响应,也就是说可以通过“response”对象来组织发送到客户端的数据。发送文字时直接使用“out” 对象即可。 response.sendRedirect(“URL”); response.setContentType(”text/html”);
request getParameter示例 <html><body> <form action="./Hello_req.jsp"> 姓名<input type="text" name="UserName"> <input type="submit" value="提交"> </form> </body></html>
request对象示例(Hello_req.jsp) <%@ page contentType="text/html;gb2312" %> <%@ page import="java.util.*" %> <HTML> <BODY> 你好, <%! String Name;%> <% Name=request.getParameter("UserName"); %> <%=Name%>, 今天是 Date today=new Date(); <%=today.getDate()%>号,星期<%=today.getDay()%> </BODY> </HTML>
输出结果 /teach/jsp6/login.html -> jsp6/jsp/login.jsp <HTML> <BODY> 你好, 独孤求败, 今天是 9号,星期1 </BODY> </HTML> /teach/jsp6/login.html -> jsp6/jsp/login.jsp
request对象其他方法 1.getAttribute 原型:public java.lang.Object getAttribute(java.lang.String name) 说明:以对象的形式返回特定名称的属性值。 参数:name 一个标示属性名的字符串 返回值:一个包含属性值的对象,当属性不存在是为空。 2. getContentLength、getServerPort()、getServerName()、getProtocol、getRemoteAddr、getHeaderNames、 getMethod()、getServletPath、isRequestedSessionIdValid /teach/jsp6/form.html
out对象 testBuffer.jsp ; testSystem.jsp “out” 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本形式的,可以通过“out” 对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为“out” 对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。 testBuffer.jsp ; testSystem.jsp
session对象 “session” 对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。“session” 对象建立在cookie的基础上,所以使用时应注意判断一下客户端是否打开了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。
session对象 概要 HTTP是无状态(stateless)协议; Web服务器对每一个客户端请求都没有历史记忆; 存于客户端; 客户端的每次访问都把上次的session记录传递给Web服务器; Web服务器读取客户端提交的session来获取客户端的状态信息;
session对象示例(Form表单—Logon_session.html) <html><body> <form action="./Logon_session.jsp"> 姓名<input type="text" name="UserName"> <input type="submit" value="提交"> </form> </body></html>
session对象示例 Logon_session.jsp <%@page contentType="text/html;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>
session对象示例(Check_session.jsp) <%@page contentType="text/html;gb2312" %> <HTML><BODY> <% String yourName=(String)session.getValue("LogName"); if (yourName= =null) { %>您还未登录 }else %> "<%=yourName%>"已经登录 } </BODY></HTML>
session使用示例 /teach/jsp6/testsession.html ->testsession1.jsp->testsession2.jsp->testsession3.jsp
cookie对象 用来保存少量的信息 /myjsp/06/VisitTimes.jsp <%@ page contentType="text/html;charset=GBK" %> <% int Counter = 0; // 得到所有的Cookie Cookie cookies[] = request.getCookies(); if(cookies != null) { for(int i=0; i<cookies.length; i++) { if(cookies[i].getName().equals("Counter")) Counter = Integer.parseInt(cookies[i].getValue()) + 1; } // 首次登陆,需要创建Cookie ; 以后登陆,需更新Cookie Cookie c = new Cookie("Counter", ""+Counter); c.setMaxAge(60*60*24*365); // Cookie response.addCookie(c); %>
<html> <head> <title>显示登陆次数</title> </head> <body bgcolor="#FFFFFF"> <% if(Counter == 0) { out.println("<Script>"); out.println("alert('欢迎首次光临!')"); out.println("</Script>"); } else { out.println("alert('您已经光临了" + Counter + " 次')"); %> </body> </html>
application对象 application对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有log()、getMajorVersion()、getMinorVersion()、getMimeType()、getRealPath()、getResouce()、getResourceAsStream()、getRequestDispatcher()等。 session用来保存用户的个人信息,application是保存所有用户的公共信息。 application.setAttribute(“counter”,”0”);
application对象实现网页计数器 <%--用application实现网页计数器teach/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>
运行结果(第一次访问)
刷新一次
application使用示例 留言板例子: teach/jsp6/board1.jsp->board2.jsp->board3.jsp
pageContext teach/jsp6/testpagecontext.jsp “pageContext” 对象直译时可以称作“页面上下文”对象,代表的是当前页面运行的一些属性,常用的方法包括findAttribute、getAttribute、getAttributesScope和getAttributeNamesInScope,一般情况下“pageContext” 对象用的不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。 getServletConfig、getSession、getServletContext、 getOut、getRequest等。 teach/jsp6/testpagecontext.jsp
config、 page、 exception “config” 对象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以获得Servlet初始化时的参数。使用getServletContext()来代替application对象。teach/jsp6/testconfig.jsp “page” 对象代表了正在运行的由JSP文件产生的类对象。 testpage.jsp “exception” 对象则代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage=”true “%>”的JSP文件中使用 testexception.jsp
exception对象示例 <html> <%@page import="java.io.*" errorPage="error.jsp"%> <head><title>test4.10.jsp</title><head> <body> <% File theFile; FileInputStream sFile; theFile=new File("noThisFile.txt"); sFile=new FileInputStream(theFile); %> </body> </html>
exception对象示例 <%--exception对象示例,error.jsp文件代码--%> <%@ page contentType="text/html; charset=gb2312"%> <html> <%@page isErrorPage="true"%> <head><title>error.jsp</title></head> <body> <% out.println("看到这句话就表示发生了错误!<br>"); out.println("exception.getMessage()="+exception.getMessage()); %> </body> </html>
JSP内置对象小结 介绍了JSP的几种内置对象。熟练使用这些内置对象是开发JSP应用程序的基本要求,尤其是对于request、session和application对象更是必须要掌握的。 会使用对象所具有的方法,能熟练使用每一种对象的几种常用方法。
JSP的汉字问题的原理 客户端和服务器用gb2312 HTTP传输编码用ISO8859_1 服务器需要指示客户端文档的编码方式
JSP的汉字问题出现环节 客户端显示文档时的编码方式(由服务器中的JSP、Servlet指明) 客户端发送汉字时自动转换为iso8859_1 服务器中采用gb2312对汉字编码,接收到客户端汉字需要转换为gb2312 服务器端将JSP转换为Servlet时自动将汉字转换为iso8859_1 服务器端应该告诉客户端汉字的编码方式
JSP汉字问题 JSP文件的汉字问题 表单处理的汉字问题 Servlet的汉字问题 JDBC的汉字问题
JSP文件的汉字问题 JSP中的汉字字符串在服务器端用gb2312 在编译为Servlet时自动转换为iso8859_1 汉字在传输中是正确的 在没有特别指示下,浏览器中无法正确显示 在HTML中指示浏览器文档的编码 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 在JSP中指示JSP引擎文档的编码 <%@ page contentType="text/html;charset=gb2312"%> 每个要显示汉字的JSP文档都应该包含该语句
JSP文件的汉字问题(JSPhanzi.jsp) <html> <head> <title>JSP中的汉字问题</title> </head> <body> 你好 </body> </html> <%--JSP的汉字问题JSPhanzi.jsp--%> <html> <head> <title>JSP中的汉字问题</title> </head> <body> <% String HelloMsg="你好"; out.println(HelloMsg); %> </body> </html>
JSP中增加编码指示后 <html> <head> <title>JSP中的汉字问题</title> </head> <body> 你好 </body> </html> <%--JSP的汉字问题JSPhanzi.jsp--%> <%@ page contentType="text/html; charset=gb2312"%> <html> <head> <title>JSP中的汉字问题</title> </head> <body> <% String HelloMsg="你好"; out.println(HelloMsg); %> </body> </html>
表单处理中的汉字问题 表单处理涉及到客户端和服务器的完整交互过程 在客户端和服务器是gb2312,传输用ISO8859_1 name=new String(name.getBytes("ISO8859_1"), "gb2312"); 服务器端指示客户端汉字的显示编码 <%@ page contentType="text/html;charset=gb2312"%>
表单处理的汉字问题(hanzi.jsp) <%--表单处理的汉字问题,hanzi.jsp文件代码--%> <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> <%--表单处理的汉字问题,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> <body> 用户名:????<br> </body> </html> <%--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> <%--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>
Servlet的汉字问题 1. 某个页面提交中文内容给Servlet,Servlet要对提交的内容 代码来解决问题: httpServlerRequest.setCharacterEncoding(“GB2312”); 2. Servlet写中文内容到某个页面, servlet中增加以下代码: httpServlerResponse.setContentType("text/html; charset=gbk" ); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { response.setContentType("text/html; charset=gbk" ); response.getWriter().println(“中文”); }
JDBC的汉字问题 从数据库中取出中文的转换 Result rs; String name = rs.getString(“name”); name = new String(desc.getBytes(“ISO-8859-1”),”GB2312”);
FTP ftp://ftp.hdss.org/teacher/xxl