java web 开发——第四章JSP内置对象

目录

前言

1.1request对象

1.1.1获取用户提交的信息

1.1.2处理汉字信息

1.1.3常用方法举例

1.1.4处理HTML标记

1.1.5处理超链接

1.2 response对象

1.2.1 动态响应contentType属性

1.2.2 response对象的HTTP文件头

1.2.3 response对象的重定向

1.3 session对象

1.3.1 session对象的id

1.3.2 session对象与URL重写

1.3.3 session对象存储数据

1.3.4 session对象的生存期限

1.4 application对象

1.4.1 application留言板

1.5 out对象

1.6 总结


前言

本文主要内容为request对象、response对象、session对象、out对象和application对象


1.1request对象

HTTP通信协议是用户与服务器之间一种提交(请求)信息与响应信息(reqest/response)的通信协议。在JSP中,内置对象request 封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
内置对象request 是实现了ServletRequest 接口类的一个实例,可以在Tomcat服务器的webapps\ tomcat-docs\servletapi 中查找 ServletRequest 接口的方法。
用户通常使用 HTML的form 表单(也称form标记)请求访问服务器的某个JSP页面(或servlet,见第6章),并提交必要信息给所请求的JSP 页面(servlet)。表单的一般格式是:

<form action="请求访问的页面或Servlet"method= get | post >

      提交手段

</form>

其中,<form>是form表单的开始标签、</form>是结束标签,开始标签与结束标签之间是form表单的标记体内容。action是form表单的属性,其属性值给出表单请求访问的JSP页面或servlet。form表单中的method属性取值get或post。get方法和post方法的主要区别就是:使用get方法提交的信息会在提交的过程中显示在浏览器地址栏中,而post方法提交的信息不会显示在地址栏中。

1.1.1获取用户提交的信息

request对象获取用户提交信息的最常用的方法是getParameter(String s).

下面的例子中,1.jsp通过表单向2.jsp提交三角形三边长度,2.jsp负责计算并显示三角形的面积。

1.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #ffccff> 
   <form action="example4_1_computer.jsp" method=post >
       <input type="text" name="sizeA" value=9 size=6 />
       <input type="text" name="sizeB" value=8 size=6 /> 
       <input type="text" name="sizeC" value=8 size=6 />
       <input type="submit" name="submit" value="提交"/>
   </form> 
</body></HTML>

2.jsp 

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #ccffff>
<p style="font-family:黑体;font-size:36;color:blue">
<%  
    String sideA=request.getParameter("sizeA");
    String sideB=request.getParameter("sizeB");
    String sideC=request.getParameter("sizeC");
    try {  double a=Double.parseDouble(sideA);
           double b=Double.parseDouble(sideB);
           double c=Double.parseDouble(sideC);
           double p=(a+b+c)/2,area=0;
           area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
           String result = String.format("%.2f",area);
           out.println("<BR>三边:"+sideA+","+sideB+","+sideC);
           out.println("<BR>三角形面积(保留2位小数):"+result);
    }
    catch(NumberFormatException ee){
          out.println("<BR>请输入数字字符");
    } 
%>
</p></body></HTML>

结果如下图所示。 

 1.jsp使用表单提交信息

 2.jsp获取并处理表单提交的信息

1.1.2处理汉字信息

request对象获取用户提交的信息中如果含有汉字字符或其他非ASCII字符,就必须进行特殊的处理方式,以防止乱码现象。

JSP页面文件的编码为UTF-8编码,只要让 request 对象在获取信息之前调用setCharacterEncoding方法设置编码为UTF-8(默认是ISO-8859-1)就可以避免乱码现象,代码如下:

request.setCharacterEncoding("utf-8");

 以下的例子通过form表单向自己提交不同语言的问候语,request对象在获取信息之前调用setCharacterEncoding方法设置编码为UTF-8,然后再获取数据。

3.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<style>
   #tom{
      font-family:宋体;font-size:26;color:blue 
   }
</style> 
<HTML><body id="tom" bgcolor = #ffccff>
可以输入各种语言的文字,单击提交键:
<%
   String content = "早上好,Good morning,อรุณสวัสดิ์ค่ะ(泰语),"+
                  " おはよう,Доброе утро,좋은 아침";
%>
<form  action="" method='post' >
   <textArea  name="language" id="tom" rows=3 cols=50>
      <%= content %>
   </textArea>
   <input type="submit" id="tom" name="submit" value="提交"/>
</form>  
<%   request.setCharacterEncoding("utf-8");
     String variousLanguages=request.getParameter("language");
     out.print(variousLanguages);
%>
</p></body></HTML>

结果如图所示。

1.1.3常用方法举例

当用户访问一个页面时,会提交一个HTTP请求给 Tomcat服务器,这个请求包括一个请求行、HTTP头和信息体,例如:

post/3.jsp/HTTP.1.1

host:localhost:8080

accept-encoding:gzip,deflate

 尽管服务器非常关心用户提交的HTTP请求中form表单的信息,但实际上,request对象调用相关方法可以获取请求的许多细节信息。request对象常用方法如下:

(1)String getProtocol( )获取用户向服务器提交信息所使用的通信协议;

(2)String getServletPath( )获取用户请求的JSP页面文件的名字(带目录符号/)

(3)String getContextPath( )获取用户请求的当前web服务目录;

(4)int getContentLength( )获取用户提交的整个信息的长度;

.......

1.1.4处理HTML标记

 JSP页面可以含有HTML标记,当用户通过浏览器请求一个JSP页面时,Tomcat服务器将该JSP页面中的HTML标记直接发送到用户的浏览器,由用户的浏览器负责执行这些HTML标记。而JSP页面中的变量声明、程序片以及表达式由Tomcat服务器处理后,再将有关的结果用文本方式发送到用户的浏览器。

(1)form标记

form表单的一般格式是:

<form action="请求访问的页面或servlet"method=get | post >

      各种提交手段

      提交键

</form>

其中,<form>是form表单的开始标签、</form>是结束标签,开始标签与结束标签之间是form表单的标记体内容。action是form表单的属性,其属性值给出表单请求访问的JSP页面或servlet。form表单中的method属性取值get或post。get方法和post方法的主要区别就是:使用get方法提交的信息会在提交的过程中显示在浏览器地址栏中,而post方法提交的信息不会显示在地址栏中。提交手段包括文本框、列表、文本区等,例如:

<form action="tom.jsp"method="post"
       <input type="text"name="boy"value="ok"/>
       <input type="submit"name="submit"value="提交"/>
</form>

 (2)input标记

在form 表单将 input 标记作为子标记来指定form 表单中数据的输人方式以及form表单的提交键。 input 标记属于空标记,即没有标记体,所以 input 标记没有开始标签和结束标签(空标记的基本格式是<标记名称属性列表/>)。<input>标记的基本格式:

<input type="GUI对象"name="GUI对象的名字"value="GUI中的默认值"/>

 input中的type 属性的值指定输入方式的GUI对象,name 属性的值指定这个GUI对象的名字。Tomcat服务器的内置对象request 通过name指定的名字来获取GUI对象中提交的数据。GUI对象可以是text(文本框)、checkbox(复选框)、submit(提交键)等。以下为大家介绍一些GUI对象:
①文本框text
当type 属性值指定输人方式的GUI是text时,除了用name为text指定名字外,还可以为text指定其他的一些值。比如:

< input type = text" name ="m" value ="h"size="8" algin ="left" maxlength="9"/>

② 单选框radio
当type属性指定输人方式的GUI是radio时,除了用name为radio指定名字外,还可以为radio指定其他的一些值。比如:

<input type="radio"name="hi" value=”男” algin ="top" checked="ok"/>
<input type="radio" name="hi” value="女”algin= "top" />

 ③复选框checkbox
当ype属性指定输人方式的GUI是checkbox时,除了用name为checkbox指定名字外,还可以为checkbox指定其他的一些值。比如:

< input type ="checkbox" name="item" value ="A"algin="top" checked="ok"/>

< input type ="checkbox" name ="item" value ="B"algin="top"/>

< input type ="checkbox" name="item" value="C"algin="top" checked="ok"/>

< input type ="checkbox" name ="item" value="D"algin="top"/>

④口令框password

当type属性指定输人方式的GUI是password,用户输人的信息用“、“画显,即防止他人
偷看口令。例如:

< input type = password" name =” me” size="12"maxlength="30"/>

⑤ 隐藏hidden
当type属性指定输入方式是hidden时,input 没有可见的输入界面,form表单会将input 标记中 value 属性的值提交给所请求的页面。例如:

< input type= "hidden" name =" nogui" value ="hello"/>

⑥ 提交键submit
为了能把form 表单的数据提交给服务器, 一个form 表单至少包含一个提交键(可以有多个提交键),例如:

< input type = “submit" name ="me” value=“确定” size="12” />

⑦重置键reset
重置键将表单中输入的数据清空,以便重新输人数据,例如:

<imput type="reset" value=“重置”>

 以上7个就是比较常见常用的GUI 对象。

(3)select、option标记

下拉式列表和滚动列表通过seleet和option标记来定义,经常作为form的子标记,为表单提供选择数据的GUI。 select 标记将 option 作为子标记,形成下拉列表或滚动列表。
下拉列表的基本格式:

< select name ="myName">
    < option value="iteml">文本描述</option>
    <option value ="item2">文本描述</option>
.....
</select >

在select中增加size属性的值就变成滚动列表,size的值是滚动列表的可见行的数目。滚动列表的基本格式:

 < select name ="myName" size="正整数">
     < option value="iteml">文本描述</option>
     <option value ="item2">文本描述</option>
.....
</select >

 request对象通过滚动列表的name指定的值来获取下拉列表或滚动列表中被选中的option的参数value指定的值。

(4)textArea标记

<textArea >是一个能输入或显示多行文本 的文本区,在form 表单中使用<textArea>作为子标记可以提交多行文本给所请求的JSP页面。<textArea>的基本格式为:

<textArea name="名字"rows="文本可见行数"cols="文本可见列数">
</textArea>

(5)style样式标记

style 标记可用于定义HTML其他标记中的字体样式,例如,style标记给出样式:

< style>
     #textStyle{
         font-family:宋体;font-size:18;color:blue

    }
    #tom{
        font- family:黑体;font-size:16;color:black

    }
</style>

其中,#字符之后的字符序列是样式名称。

(6)table标记

表格以行列形式显示数据,不提供输入数据功能。经常将某些数据或GUI放置在表格的单元格中,让界面更加简练、美观。

表格由<table>标记定义,一般格式:

<table border="边宽的宽度“>
      <tr width=“该行的宽度">
            <th width=“单元格的宽度”>单元格中的数据</th>
               ......
            <td width=“单元格的宽度”>单元格中的数据</td>

       </tr>
.....
</table>

其中,<tr>.....</tr>定义表格的一个行,<th>或<td> 标记定义这一行中的表格单元,二者的区别是<th>定义的单元着重显示,<td>称为普通单元,不着重显示。table中增加选项border可给出该表格边框的宽度,当border=0时,相当于没有边框。

(7)<image>标记
使用image标记可以显示一幅图像,image标记的基本格式为:

<image src="图像文件的URL">描述文字</image>

如果图像文件和当前页面在同一web服务目录中,图像文件的地址就是该图像文件的名字,如果图像文件在当前web服务目录一个子目录中,那么图像文件的URL就是 “image/"图像文件的名字”。

(8)embed 标记

使用embed标记可以播放音乐和视频,当览器执行该标记时,会把浏览器所在机器上的默认播放器联人到浏览器中,以便播放音乐或视频文/件。embed标记的基本符式为:

<embed src="音乐或视频文件的URL”>描述文字</embed>

或者

 <embed sIc="音乐或视频文件的URL”/>

 (9)style样式标记

style标记可用于定义HTML其他标记中的字体样式,例如:

<style>
    #textStyle{
        font_size:18;color:blue
    }
</style>

(10) 属性值格式的说明:

许多html标记都有属性,并可以指定属性的值,例如:

<input type="text" name="testAmount" value=10 />

其中,type、name、value都是input标记的属性,属性值可以用双引号括起,也可以用单引号括起或者不用任何符号。

1.1.5处理超链接

 常用的HTML超链接标记:

<a href =链接的页面地址 >文字说明</a>

用户单击超链接标记的文字说明,可以访问超链接给出的链接页面。使用超链接标记时还可以增加参数,以便向链接的页面传递值,格式如下:

<a href =链接的页面地址 ?参数1=字符串1&参数2=字符串2...>文字说明</a>

超链接所连接的页面,使用request 对象调用getParameter("参数")方法获得超链接的参数传递过来的参数的值,即字符串。需要注意的是,超连接标记向所链接的页面传递的参数的值,即字符串不允许含有非ASCII字符(例如汉字等)。

下面的例子中,4.jsp用超链接向5.jsp传递商品的编号和价格。

4.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #ffccff>
<%
   double price = 98.78;
%>
<p style="font-family:宋体;font-size:36;color:blue">
商品编号A1001,价格8765
<a href ="5.jsp?id=A1001&price=8765">购买</a><br>
商品编号A1002,价格<%= price%>
<a href ="5.jsp?id=A1002&price=<%= price%>">购买</a>
</p></body></HTML>

5.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #EEEEFF>
<p style="font-family:宋体;font-size:36;color:blue"> 
<%  String id = request.getParameter("id");
    String price = request.getParameter("price");
%>
<b>商品编号:<%= id %><br>
商品价格:<%= price %>
</p></body></HTML>

结果如下图所示。

 4.jsp 带参数的超链接

5.jsp 获取超链接传递的参数值

1.2 response对象

1.2.1 动态响应contentType属性

页面用page 指令设置页面的contentType属性的值,那么Tomcat服务器将按照这种属性值作出响应,将页面的静态部分返回给用户,用户浏览器接收到该响应就会使用相应的手段处理所收到的信息。由于page指令只能为contentType指定一个值来决定响应的MIME类型,如果想动态地改变这个属性的值来响应用户,就需要使用response对象的setContentType(String s)方法来改变contentType的属性值。

1.2.2 response对象的HTTP文件头

当用户访问一个页面时,会提交一个TTP请求给tomcat服务器,这个请求包括一个请求行、HTTP头和信息体,例如:

post/example3_1.jsp/HTTP.1.1
host:localhost:8080
aaccept-encodong:gzip,deflate

1.2.3 response对象的重定向

在某些情况下,当响应用户时,需要将用户重新引导至另一个页面。可以使用response对象的sendRedirect(URL url)方法实现用户的重定向,即让用户从一个页面跳转到的sendRedirect(URL url)中url指定的页面,即所谓的客户端跳转。需要注意的是当使用的sendRedirect(URL url)方法将用户从当前页面重定向另一个页面时,Tomcat服务器还是要把当前JSP页面执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前页面的执行效果。如果在执行的sendRedirect(URL url)方法后,紧接着执行了return返回语句后,那么Tomcat服务器会立刻结束当前JSP页面的执行

1.3 session对象

HTTP协议是一种无状态协议。 一个用户向服务器发出请求(request),然后服务器返回响应(response),在服务器端不保留用户的有关信息,因此当下一次发出请求时,服务器无法判断这一次请求和以前的请求是否属于同一 用户。当一个用户访问一个Web服务目录时,可能会在这个服务目录的几个页面反复链接,反复刷新一个页面或不断地向一个页面提交信息等,服务器应当通过某种办法知道这是同一个用户。 Tomcat 服务器可以使用内置对象session(会话)记录用户的信息。内置对象 session由 Tomcat 服务器负责创建,session 是实现了HttpSession 接口类的一个实例,可以在Toamcat服务器的 webapps \ tomcat-docs servletapi 中查找HttpSession 接口的方法。

1.3.1 session对象的id

Web服务目录中各个页面期间提交的各种信息,比如姓名、号码等信息。这个session对象被分配了一个String类型的id号,Tomcat服务器同时将这个d号发送到用户端,存放在用户(浏览器)的Cookie中。这样,session对象和用户之间就建立起一一对应的关系,即每个用户都对应着一个 session 对象(称作用户的会话),不同用户(不同浏览器)的session对象互不相同,具有不同的号码。当用户再访问该Web服务目录的其他页面时,或从该Web服务目录链接到其他Web服务器再回到该Web服务目录时,Tomcat 服务器不再分配给用户的新session 对象,而是使用完全相同的一个,直到 session对象达到了最大生存时间或用户关闭自己的浏览器或 Tomcat服务器关闭,Tomcat 服务器将销毁用户的session对象,即和用户的会话对应关系消失。 如果用户的session 对象被销毁,当用户再请求访问该Web服务目录时,Tomcat服务器将为该用户创建一个新的 session对象。

注:同一个用户在不同的Web服务目录中的session对象是互不相同的。

 下列例子中用户在服务器的某个Web服务目录中的两个页面6.jsp和7.jsp进行链接,2个页面的session对象是完全相同的。

6.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>#textStyle
   { font-family:宋体;font-size:36;color:blue 
   }
</style> 
<HTML><body bgcolor=#ffccff> 
<p id="textStyle"> 
这是6.jsp页面<br>单击提交键连接到7.jsp
<% String id=session.getId();
   out.println("<br>session对象的ID是<br>"+id);
%>
  <form action="example4_13_b.jsp" method=post name=form>
  <input type="submit" id="textStyle" value="访问7.jsp" />
</form>  
</body></HTML>

7.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<style>#textStyle
   { font-family:黑体;font-size:36;color:red 
   }
</style> 
<HTML><body bgcolor=cyan> 
<p id="textStyle">  
这是7.jsp页面
<%  String id=session.getId();
    out.println("<br>session对象的ID是<br>"+id);
%>
<br>连接到6.jsp的页面。<br>
<a href="6.jsp">6.jsp</a>   
</body></HTML>

1.3.2 session对象与URL重写

 session 对象能和用户建立起一一对应关系依赖于用户浏览器是否支持Cookie。如果用户端浏览器不支持 Cookie,那么用户在不同网页之间的 session对象可能是互不相同的,因为 Tomcat 服务器无法将 id 存放到用户端浏览器中,就不能建立session 对象和用户的一一对应关系。用户将浏览器 Cookie 设置为禁止后(选择测览器(IE)菜单尖头→工具→Internet 选项→隐私→高级,将第三方 Cookie 设置成禁止),运行相同的代码会得到不同的结果。也就是说,同一用户对应了多个 session 对象,这样 Tomcat 服务器就无法知道在这些页面上访问的实际上是同一个用户。

如果用户不支持 Cookie,JSP 页面可以通过 URL重写来实现 session 对象的唯一性。所谓URL重写,就是当用户从一个页面重新链接到一个页面时,通过向这个新的 URL 添加参数,把 session 对象的 id 传带过去,这样就可以保障用户在该 Web 服务目录的各个页面中的session 对象是完全相同的。可以让 response 对象调用 encodeURL()或 encodeRedirectURL()方法实现 URA重写,比如,如果从6.jsp 页面链接到7.jsp 页面,首先在程序片中实现 URL 重写:

String str = response.encodeRedirectURL("7. jsp");

 然后将链接目标写成<%= str %> 即可。例如,将 6.jsp 的代码:

<form action ="7.jsp" method = post >  更改为<form action =<%= str %> method = post>

1.3.3 session对象存储数据

session 对象驻留在服务器端,该对象调用某些方法保存用户在访问某个Wa服务目录期间的有关数据。session 对象使用下列方法处理数据。

(1) public void setAttribute (String key,Object obj)。session 对象可以调该方法将参数 Object 指定的对象 obj添加到 session 对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加的对象被清除。
(2) public Object getAttribute(String key)。获取 session 对象索引关键字是 key 的对象。由于任何对象都可以添加到 session 对象中,因此用该方法取回对象时,应显式转化为原来的类型。
(3)public Enumeration getAttributeNames()。session 对象调用该方法产生一个枚举对象,该枚举对象使用 nextElemets()遍历 session 中的各个对象所对应的关键字。
(4) public void removeAttribute(String key)。session 对象调用该方法移掉关键字 key对应的对象。 

1.3.4 session对象的生存期限

一个用户在某个 Web 服务目录的 session 对象的生存期限依赖于 session 对象是否调用invalidate()方法使得 session 无效或 session 对象达到了设置的最长的“发呆”状态时间以及用户是否关闭浏览器或服务器被关闭。所谓“发呆”状态时间是指用户对某个 Web 服务目录发出的两次请求之间的间隔时间(默认的发呆时间是 30分钟)。比如,用户对某个 Web 服务目录下的JSP 页面发出请求.并得到响应,如果用户不再对该 Web 服务目录发出请求(可能去请求其他的 Web 服务目录),那么用户对该 We 服务目录进人“发呆”状态,直到用户再次请求该 Web 服务目录时,“发呆”状态结束。 

可以修改 Tomcat 服务器下的 web.xml,重新设置各个 Web 服务目录下的 session 对象的最长“发呆”时间。打开 Tomcat 安装目录中 conf文件下的配置文件 web.xml,找到

< session - config >

               < session- timeout > 30 </session -timeout >

</session- config >

 将其中的 30 修改成所要求的值即可(单位为分钟)。

session 对象可以使用下列方法获取或设置和生存时间有关的信息:

(1)public long getCreationTime()获取 session 创建的时间,单位是毫秒(GMT 时间,1970年7月1日午夜起至 session 创建时刻所走过的毫秒数)。

(2)public long getLastAccessedTime()获取 session 最后一次被操作的时间,单位是毫秒。

(3)public int getMaxInactiveInterval()获取 session 最长的“发呆”时间(单位是秒)。

(4)public void setMaxInactiveInterval(int interval)设置 session 最长的“发呆”时间(单位是秒)。

(5)public boolean isNew()判断session 是否是一个新建的 session。

(6)invalidate()使 session 无效。

1.4 application对象

 1.3节学习了session 对象,用户第一次访问Web服务目录时,Tomcat 服务器创建和该用户相对应的session对象,当用户在所访问的Web服务目录的各个页面之间浏览时,这个session 对象都是同一个,而且不同用户的session对象是互不相同的。本节学习的application 对象也是由 Tomcat 服务器负责创建,但与session对象不同的是,application 过象被访问该Web服务目录的所有的用户共享,但不同 Web服务目录下的 application互不相同。

1.4.1 application留言板

在实际项目中一般是使用数据库来实现留言板,不会用application对象(除非是非常简单的告示留言板)。下面的例子是为了练习使用application内置对象,让其担当留言板的角色,并设置留言板上最多可留言99999条,即让 application 对象用1至99999之间的一个整数作为关键字(key)存放一条留言。用户通过example4_16.jsp 向example4_16_pane. jsp 提交姓名、留言标题和留言内容,example4_16_pane. jsp 页面用application存放这些内容,查找这些内容所使用的关键字是1至99999之间的某个整数。当留言数目超过99999时,提示用户无法再留言。example4_16_show. jsp 负责显示全部留言example4_16_ delete. jsp 页面负责删除留言(删除留言时需要输入密码123456,这个密码可以只让管理者知道)。

example4_16.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML>
<style>
   #textStyle{
      font-family:宋体;font-size:18;color:blue 
   }
</style>
<body id='textStyle' bgcolor = #ffccff>
<form action='example4_16_pane.jsp' method='post' >
留言者:<input  type='text' name='peopleName' size = 40/>
<br>标题:<input  type='text' name='title' size = 42/>
<br>留言:<br>
<textArea name='contents' id='textStyle' rows='10' cols=36 wrap='physical'>
</textArea>
<br><input type='submit' id='textStyle' value='提交留言' name='submit'/>
</form>
<a href='example4_16_show.jsp'>查看留言</a>
<a href='example4_16_delete.jsp'>删除留言</a>
</body></HTML>

 example4_16_pane.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.time.LocalDateTime" %>
<%@ page import="java.util.Stack" %>
<HTML><body>
<%!
    Stack<Integer> maxAmount = null;  //存放留言序号。
    //向application添加对象的synchronized方法
    synchronized void addMess(ServletContext application,StringBuffer mess){    
        int index = -1;//留言序号
        if(!maxAmount.empty()){
          index = maxAmount.pop(); 
          mess.insert(0,"No."+index+".");
          application.setAttribute(""+index,new String(mess));
        }
    }
%>
<%  
   if(maxAmount == null){
       maxAmount = new Stack<Integer>();//最多可以有999999条留言
       for(int i=999999;i>=1;i--){
          maxAmount.push(i);
       }
    }
    boolean isSave = true;
    request.setCharacterEncoding("utf-8");
    String peopleName=request.getParameter("peopleName");
    String title=request.getParameter("title");
    String contents=request.getParameter("contents");
    if(peopleName.length()==0||title.length()==0||contents.length()==0){
       isSave = false;
       out.print("<h2>"+"请输入留言者,标题和内容");
    }
    if(isSave) {
      LocalDateTime dateTime = LocalDateTime.now();
      StringBuffer message = new StringBuffer();
      message.append("留言者:"+peopleName+"#");
      message.append("<br>留言标题《"+title+"》#");
      message.append("<br>留言内容:<br>"+contents+"#");
      String timeFormat= String.format("%tY年%<tm月%<td日,%<tH:%<tM:%<tS",dateTime);
      message.append("<br>留言时间<br>"+timeFormat+"#");
      if(maxAmount.empty()){
        out.print("<h2>"+"留言版已满,无法再留言"+"</h2");
      }
      else {
        addMess(application,message);//信息存放到appication(留言板角色)。
      }
    }
%>
<br><a href="example4_16.jsp">返回留言页面</a><br>
<a href="example4_16_show.jsp">查看留言板</a>
</body></HTML>

example4_16_show.jsp 

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.util.Enumeration" %>
<HTML><body bgcolor = cyan> 
<p style="font-family:宋体;font-size:14;color:black">
<a href="example4_16.jsp" >返回留言页面 </a><br><br>
<% 
    Enumeration<String> e = application.getAttributeNames();
    while(e.hasMoreElements()) {
        String key  = e.nextElement();
        String regex ="[1-9][0-9]*";//匹配用户的关键字
        if(key.matches(regex)){
           String message=(String)application.getAttribute(key);
           String [] mess =message.split("#");
           out.print(mess[0]); //留言者和序号。
           out.print(mess[1]); //标题。
           out.print(mess[2]); //留言内容。
           out.print(mess[3]); //留言时间。
           out.print("<br>-----------------------------------<br>");
        }
    } 
%>
</p></body></HTML>
 

 example4_16_delete.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.util.Enumeration" %>
<HTML><body bgcolor = pink> 
<p style="font-family:宋体;font-size:18;color:blue">
管理员删除留言.
<form action="" method=post >
输入密码:<input type="password" name="password"  size=12 /><br>
输入留言序号:<input type="text" name="index" size=6 /> 
<br><input type="submit" name="submit"  value="删除"/>
</form> 
<%  String password=request.getParameter("password");
    String index=request.getParameter("index");
    if(password == null ) password = "";
    if(index == null ) index = "";
    if(password.equals("123456")){
      Enumeration<String> e = application.getAttributeNames();
      while(e.hasMoreElements()) {
        String key  = e.nextElement();
        if(key.equals(index)){
           application.removeAttribute(key);
           out.print("<br>删除了第"+index+"条留言<br>");
        }
      }
    } 
%>
<a href="example4_16.jsp" >返回留言页面</a> <br>
<a href="example4_16_show.jsp">查看留言板</a>
</p></body></HTML>

 结果如下所示。

提交留言

查看留言

删除留言 

1.5 out对象

out对象是一个输出流,用来向用户端输出数据。在前面的许多例子里曾多次使用 out 对象进行数据的输出。out 对象可调用如下的方法用于各种数据的输
出,例如:

(1) out.print(boolean)或 out.println(boolean)用于输出一个布尔值。

(2) out.print(char)或 out.println(char)用于输出一个字符。

(3)out.print(double)或 out.println(double)用于输出一个双精度的浮点数。

(4)out.print(fload)或 out.println(float)用于输出一个单精度的浮点数。

(5)out.print(long)或 out.println(long)用于输出一个长整型数据。

(6)out.print(String)或 out.println(String)用于输出一个 String 对象的字符序列。

printIn 和 print 方法的区别是: println 会向缓存区写人一个换行,而 print 不写入换行。

但是浏览器的显示区域目前不识别 println 写入的换行,如果希望浏览器显示换行,应当向浏览器写入"< br >"实现换行。

1.6 总结

以上就是本文要讲的内容,本文仅仅介绍了request对象、response对象、session对象、out对象和application对象及其使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值