Java Web 开发 授课人:张鸽
第三讲 JSP 内置对象 JSP 有以下九种内置对象,包括: ·request ,请求对象 ·response ,响应对象 ·pageContext ,页面上下文对象 ·session ,会话对象 ·application ,应用程序对象 ·out ,输出对象 ·config ,配置对象 ·page ,页面对象 ·exception ,例外对象
重点介绍 request ,请求对象 session ,会话对象 application ,应用程序对象
综述 有几种对象看起来和 ASP 的内置对象差 不多,功能也类似,这是因为这些内置 对象的构建基础是标准化的 HTTP 协议。 如果使用过 ASP ,那么对这几种 JSP 内 置对象的使用应该能迅速掌握。需要注 意的问题是对象名的写法,包括这些对 象方法的调用时也要书写正确,因为 Java 语言本身是大小写敏感的。
request 和 response “request” 对象代表的是来自客户端的请求,例如我们在 FORM 表单中填写的信息等,是最常用的对象。关于它 的方法使用较多的是 getParameter 、 getParameterNames 和 getParameterValues ,通过调用这几个方法来获取请求对 象中所包含的参数的值 “response” 对象代表的是对客户端的响应,也就是说可以 通过 “response” 对象来组织发送到客户端的数据。但是由 于组织方式比较底层,所以不建议使用,需要向客户端 发送文字时直接使用 “out” 对象即可。
request 对象示例 <html><body> 姓名 <input type="text" 姓名 <input type="text" name="UserName"> name="UserName"> <input type="submit" <input type="submit" value=" 提交 "> value=" 提交 "> </body></html>
request 对象示例( Hello_req.jsp <HTML> 你好, 你好, <% <% Name=request.getParameter("UserName"); Name=request.getParameter("UserName"); %> %>,, 今天是 今天是 <% <% Date today=new Date(); Date today=new Date(); %> %> 号,星期 号,星期 </HTML>
request 对象示例(输出结果) <HTML> 你好, 你好, 独孤求败, 今天是 今天是 9 号,星期 1 9 号,星期 1 </HTML>
session 对象 “session” 对象代表服务器与客户端所建 立的会话,当需要在不同的 JSP 页面中 保留客户信息的情况下使用,比如在线 购物、客户轨迹跟踪等。 “session” 对象 建立在 cookie 的基础上,所以使用时应 注意判断一下客户端是否打开了 cookie 。 常用的方法包括 getId 、 getValue 、 getValueNames 和 putValue 等。
session 对象 概要 Web Server 对每一个客户端请求都没有历史记忆; Session 用来保存客户端状态信息; 由 Web Server 写入; 存于客户端; 客户端的每次访问都把上次的 session 记录传递给 Web Server ; Web Server 读取客户端提交的 session 来获取客户 端的状态信息;
session 对象示例 (Form 表单 -Logon_session.html) <html><body> 姓名 姓名 </body></html>
session 对象示例 Logon_session.jsp <HTML> <% <% String Name=request.getParameter("UserName"); String Name=request.getParameter("UserName"); session.putValue("LogName", Name); session.putValue("LogName", Name); %> %> 你的名字 " " 已经写入 session 你的名字 " " 已经写入 session check check </HTML>
session 对象示例 (Check_session.jsp) <HTML><BODY> <% <% String yourName=(String)session.getValue("LogName"); String yourName=(String)session.getValue("LogName"); if (yourName= =null) if (yourName= =null) { %> 您还未登录 %> 您还未登录 <% <% }else }else { %> %> " " 已经登录 " " 已经登录 <% <% } %> %></BODY></HTML>
application 对象 “application” 对象负责提供应用程序 在服务器中运行时的一些全局信息, 常用的方法有 getMimeType 和 getRealPath 等。 MIME 表示多用途 Internet 邮件扩允协议。 MIME 扩允了基本的面向 文本的 Internet 邮件系统,以便可以在消息中包含二进制附件。 MIME 类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型, 当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
out “ out ” 对象代表了向客户端发送数据的对象,与 “ response ” 对象不同,通过 “ out ” 对象发送的内容将是浏 览器需要显示的内容,是文本一级的,可以通过 “ out ” 对 象直接向客户端写一个由程序动态生成 HTML 文件。常用 的方法除了 pirnt 和 println 之外,还包括 clear 、 clearBuffer 、 flush 、 getBufferSize 和 getRemaining ,这是因为 “ out ” 对 象内部包含了一个缓冲区,所以需要一些对缓冲区进行 操作的方法。
config 、 page 、 exception “config” 对象提供一些配置信息,常用的方法有 getInitParameter 和 getInitParameterNames ,以 获得 Servlet 初始化时的参数。 “page” 对象代表了正在运行的由 JSP 文件产生的 类对象,不建议一般读者使用。 “exception” 对象则代表了 JSP 文件运行时所产 生的例外对象,此对象不能在一般 JSP 文件中直 接使用,而只能在使用了 “ ” 的 JSP 文件中使用
request 请求对象 1 . getAttribute getAttribute(String name) :获得指定名字的 属性,如果该属性不存在,将会返回 null 。
request 请求对象 如果所给名称的属性不存在将返回空值。 属性名应该遵循和包命名方式同样的约 定,不要采用如 “java.*” 、 “ javax.*” 及 “sun.*”. 这样的命名。 参数: name 一个标示属性名的字符串 返回值:一个包含属性值的对象,当属性 不存在是为空。
request 对象使用示例( test3.1.jsp ) <html><head><title>request</title></head><body> 用户登录 用户登录 用户名: 密码: 密码:
浏览器类型 : IE Netscape Netscape 资料选项: 资料选项: 标题 标题 详细 详细 </form></body></html>
Post.jsp 代码 <html><head><title>test</title></head><body><% out.println(" 用户名: "+request.getParameter("User")+" "); out.println(" 密码: "+request.getParameter("pwd")+" "); out.println(" 浏览器: "+request.getParameter("radio")+" "); out.println(" 标题: "+request.getParameter("check1")+" "); out.println(" 详细: "+request.getParameter("check2")+" "); out.println(" 隐含: "+request.getParameter("hidden")+" "); out.println("getContentLength()="+request.getContentLength()+"<br>");
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.isRequestedSessionIdVa lid()+ " "); " ");%></body></html>
运行结果
session 对象示例 <html><head><title>session</title></head><body> 请输入您的姓名: </body></html>
post1.jsp <html><head><title>post.jsp</title></head><body> <p><% name = request.getParameter("username"); // 将 username 存入 session session.putValue("username", name); %> 您的姓名是: 您的姓名是: 您最喜欢的娱乐是: </form></body></html>
post11.jsp <html><head><title>post1.jsp</title></head><body> <%amuse=request.getParameter("amuse"); String user=(String)session.getValue("username"); %> 您的姓名是: 您的姓名是: 您喜欢的娱乐是: 您喜欢的娱乐是: </body></html>
运行结果
提交后
输入值
再次提交(保存名字)
application 对象运行示例 <html><head><title>application</title><head><body> <% out.println("Java Servlet API Version "+application.getMajorVersion() +"."+application.getMinorVersion()+"<br>"); out.println(“test3.3.jsp's MIME type is:"+application.getMimeType(“test3.3.jsp") +"<br>"); out.println("URL of ‘test3.3.jsp' is: "+application.getResource(“/test3.3.jsp")+" "); out.println("getServerInfo()="+application.getServerInfo()+"<br>"); out.println(application.getRealPath(" ")); application.log("Add a Record to log_file"); %> </body></html>
运行结果
application 对象实现网页计数器 <html> 网页计数器 网页计数器 <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)); } %> 您是第 位访问者! </body></html>
运行结果 ( 第一次访问 )
刷新一次
内置对象小结 全面介绍了 JSP 的几种内置对象。熟练使 用这些内置对象是开发 JSP 应用程序的基 本要求,尤其是对于 request 、 session 和 application 对象更是必须要掌握的。 会使用对象所具有的方法,能熟练使用每 一种对象的几种常用方法。
参考: HTML 表单 复习 Web 运行原理 HTML 表单的概念 表单元素介绍 HTML 表单的客户端确认 客户端表单确认实例
Web 运行原理- 1 客户端同 Web 服务器之间的协议为 http HTTP 为超文本传输协议 HTPP 协议为 “ 请求和响应 ” 协议 客户端请求包括:请求行、头、信息体 客户端请求的方法 GET 、 POST 、 HEAD DELETE 、 TRACE 、 PUT 提交表单的方法: GET 、 POST
Web 运行原理- 2 服务器接收到请求后,返回 HTTP 响应 每个响应:状态行、头、信息体 常见状态 404 所请求的文件不存在 500 服务器程序出错 200 OK 成功 信息体用于浏览器显示
页面访问失败
HTML 表单 表单是具有输入域、文本域的页面 用于客户端同服务器端交互 用户在客户端填写表单,然后 “ 提交 ” 表单中的信息发送到服务器 服务器返回处理情况
HTML 表单标记 表单主标记 表单中的标记 是表单开始标记, 结束
表单的例子 <html> 表单 表单 <body> 用户登录 用户登录 用户名: 密码: 密码: </form></body></html>
运行结果
form 标记 描述表单的特性,语法 method 表单传输方法 GET 方法将表单信息在 URL 后传输 POST 方法将表单信息作为信息体传输 action 为表单处理方式,通常为一个 URL enctype 为编码方式
标记 标记 表单中输入信息的区域 属性 type 类型 name 名称 id 标识 maxlength 最大字符数 size 输入域宽度 value 域的初始值 button 按钮 用 javascript 响应
的类型 的类型 text 文本 passwowrd 口令方式 checkbox 多选框 name 相同 radio 单选按钮 name 相同 image 图片 hidden 隐藏表单 发送数据 submit 提交按钮 向服务器提交表单 reset 复位按钮 将表单充置为初始状态
文本框: TEXTAREA 多行文本域: 多行文本域: 参数 COLS :宽度 ROWS :高度 NAME :名称 CPU PIV 1500 Memory 512M
下拉框: SELECT 定义列表框: 定义列表框: 参数 MULTIPLE 可同时选取多行 NAME 名称 SIZE 可见项目数 每个项目用 option 标记 属性 SELECTED 出现在 option 表示选中
select 的例子 北京 北京 天津 天津 上海 上海 重庆 重庆 </select>
表单提交 提交方式: submit 类型按钮提交表单 通过普通按钮的 javascript 函数 传输方法依据 中的 method 推荐使用 POST 传输编码依据 中的 enctype 处理方式依据 中的 action
表单清除 reset 按钮重置表单为初始值
综合例子 <html> 表单 表单 <body> 用户注册 用户注册 用户名: 密码: 密码: 你喜欢: 你喜欢: 足球 足球 篮球 篮球
性别: 男 男 女 女 你的计算机 你的计算机 CPU PIV 1500 Memory 512M 你计算机的操作系统 你计算机的操作系统
你所在地: 北京 北京 天津 天津 上海 上海 重庆 重庆 </select> </form></body>
运行结果
表单的确认 客户端确认 减少服务器负载 缩短用户等待时间 兼容性难 服务器端确认 统一确认 兼容性强 服务器负载重
客户端确认 采用 javascript 进行确认 常用函数 isBetween isDate isTime isDigit is isEmpty isInt isReal
客户端确认例子 <html> 客户端确认 客户端确认 <body> 用户登录 用户登录 用户名: 密码: 密码: </form>
function checkform(frm){ var flag=true; if(frm.name.value==""){ alert(" 姓名不能为空,请输入值! "); alert(" 姓名不能为空,请输入值! "); frm.name.focus(); frm.name.focus(); flag=false; flag=false;} return flag; }</SCRIPT></body></html>
运行结果
2.3.4 JSP 与客户机的交互 从表单中获得参数 返回参数 表单的服务器端确认
从表单中获得参数 JSP 通过 request 内置对象获取表单信息 用不同的方法获取不同种类的信息 获取参数的主要方法: getParameter() 获取参数的值 getParameterNames() 获取参数的名称 getParameterValues() 获取多个值
getParameter() 可以获得文本框、文本区域、单选、多选 的值 表单中各元素的 NAME 属性是它的唯一标 识,用它获取参数。 参考 peixun2.11.jsp 及 post.jso request.getParameter("User");
向客户端输出 使用内置对象 out out.println(content) 使用 “=”
表单的服务器端确认 在客户端不能用 JSP 进行确认 分工:数据处理在服务器端 实效性:客户端得到服务器确认后表明数 据已经到达服务器 客户端兼容性好 缺点:加大服务器负载和用户等待时间
服务器端确认方法 采用 Java 类对表单数据进行复杂的检查 采用 JSP 进行确认
服务器端确认的例子 <html> 服务器端确认 服务器端确认 <body> 用户登录 用户登录 用户名: 密码: 密码: </form></body></html>
loginAction.jsp <html> 确认 JSP 确认 JSP <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+" "); out.println(" 密码: "+pwd+" "); }else{%>
用户名不能为空 用户名不能为空 用户登录 用户登录 用户名: "> 密码: "> 密码: "> </form><%}%></body></html>
运行结果( TOMCAT )
( 未输入姓名 ) 直接提交
输入用户名
输入用户名后提交
JSP 的汉字问题的原理 客户端和服务器用 gb2312 HTTP 传输编码用 ISO8859_1 服务器需要指示客户端文档的编码方式 ISO8859_1 gb2312
JSP 的汉字问题出现环节 客户端显示文档时的编码方式(由服务器 中的 JSP 、 Servlet 指明) 客户端发送汉字时自动转换为 iso8859_1 服务器中采用 gb2312 对汉字编码,接收到 客户端汉字需要转换为 gb2312 服务器端将 JSP 转换为 Servlet 时自动将汉 字转换为 iso8859_1 服务器端应该告诉客户端汉字的编码方式
JSP 汉字问题的范围 JSP 文件的汉字问题 表单处理的汉字问题 Servlet 的汉字问题(以后讲解) JDBC 的汉字问题(以后讲解)
JSP 文件的汉字问题 JSP 中的汉字字符串在服务器端用 gb2312 在编译为 Servlet 时自动转换为 iso8859_1 汉字在传输中是正确的 在没有特别指示下,浏览器中无法正确显示 在 HTML 中指示浏览器文档的编码( myJSP\index.html ) 在 JSP 中指示 JSP 引擎文档的编码 每个要显示汉字的 JSP 文档都应该包含该语句
JSP 文件的汉字问题 ( JSPhanzi.jsp ) JSP 中的汉字问题 <% String HelloMsg=" 你好 "; out.println(HelloMsg); %> JSP 中的汉字问题 你好
JSP 中增加编码指示后 page contentType="text/html; charset=gb2312"%> JSP 中的汉字问题 <% String HelloMsg=" 你好 "; out.println(HelloMsg); %> JSP 中的汉字问题 你好
表单处理中的汉字问题 表单处理涉及到客户端和服务器的完整交 互过程 在客户端和服务器是 gb2312 ,传输用 ISO8859_1 在服务器端接收到客户端数据时需要转换 为 gb2312 后进行处理,方法 name=new String(name.getBytes("ISO8859_1"), "gb2312"); 服务器端指示客户端汉字的显示编码
表单处理的汉字问题 (hanzi.jsp) 表单处理的汉字问题 <form method="POST" name="frm1" action="hanziAction.jsp"> 用户登录 用户名: 表单处理的汉字问题 <form method="POST" name="frm1“ action="hanziAction.jsp"> 用户登录 用户名:
处理过程 contentType="text/html; charset=gb2312"%> 表单中汉字的处理 <% String name=request.getParameter("name"); //name=new String(name.getBytes("ISO8859_1"), "gb2312"); out.println(" 用户名: " +name+" "); %> 表单中汉字的处理 用户名: ????
处理过程(修改后) contentType="text/html; charset=gb2312"%> 表单中汉字的处理 <% String name=request.getParameter("name"); name=new String(name.getBytes("ISO8859_1"), "gb2312"); out.println(" 用户名: " +name+" "); %> 表单中汉字的处理 用户名:测试
综合练习 综合练习:我的网上商店 myshop ,具有以下功能 综合练习:我的网上商店 myshop ,具有以下功能 用户登录、注册 口令空转向 loginError.jsp (采用 ) 建立 web 应用 myshop ,参考 softshop 目录结构 体会表单的两种发送方法 页面设计: 完成首页、用户登录、注册( index.jsp 、 login.jsp 、 registor.jsp ) 首页 index.jsp 包括简介、商品分类、新注册用户、登录用户计数, 按钮:用户登录、注册 用户计数采用 application 对象 login.jsp 包括输入用户名、口令的表单,用户名是否为空由服务 器端确认,口令是否为空由客户端确认,处理表单的 jsp 为 check.jsp ,当口令为空时转向显示错误页面,登录成功时显示用 户名和口令(表单采用 GET 方法发送)
实践:练习 JSP 编程- 综合练习 registor.jsp 中录入用户信息,综合使用表单的功能: form 标记(表单采用 POST 方法发送) text :用户名、口令 radio 按钮:性别 select :出生年月、所在地、行业 其中会使用到 option 标记 checkbox :选择兴趣 textarea :自我介绍 按钮:提交和重新输入 处理 registor.jsp 的 jsp 为 record.jsp , record.jsp 接收 text 、 textarea 、 radio 、 select 的数据,并显示出来(注意汉字问题)。 record.jsp 中用 session 存储新注册的用户名。 record.jsp 包含返回首页 index.jsp 的超链接 index.jsp 中用 session 提取新注册用户并显示