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

系列文章目录

文章目录

  • 4.1 request对象
  • 4.2 response对象
  • 4.3 session对象
  • 4.4 application对象
  • 4.4 out对象


前言

本章难点要理解session对象,学会使用session对象存储数据

4.1 request 对象

在JSP中,内置对象request封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。

用户通常使用HTML的form表单请求访问服务器的某个JSP页面(或servlet,见第六章),并提交必要信息给所请求的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 方法提交的信息不会显示在地址栏中。提变手段包括支本框,列表、文本区等,例如:

<form action="tom.jsp" method="post">

    <input type="text" name="boy" value=''ok''/>

    <input type="submit" name="submit" value=''提交''/>    

</form>

该form表单使用post方法向请求访问的tom.jsp页面提交信息,提交的是手段是text文本框,文本框的名字由name属性的值指定为boy。在文本框输入信息,然后单击submit提交按钮向服务器的JSP页面tom.jsp提交信息。

form 表单请求访问的JSP页面可以让内置request对象调用getParameter(String s)方法,并让s取值是input标记中的name给出的文本框text的名字,获取该表单通过文本框text提交的文本信息(即用户在GUI控件文本框中输入的文本,默认值是ok),比如

request. getParameter("boy");

4.1.1 获取用户提交的信息

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

例:example4_1.jsp 通过表单向example4 computer.jSp提交三角形三边的长度,example4_1_ computer. 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>
<%@ 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>

 4.1.2 处理汉字信息

request 对象获取用户提交的信息中如果含有汉字字符或其他非ASCII字符,就必须进行特殊的处理方式,以防出现乱码现象。JSP 页面文件的编码为UTF-8编码,只要让request 对象在获取信息之前调用setCharacterEncoding 方法设置编码为UTF-8(默认是ISO-8859-1)就可以避免乱码现象,代码如下:

request.setCharacterEncoding("utf-8");

4.1.3 处理HTML标记

1. form标记

用户经常使用form标记提交数据,格式为:

<form action=“请求访问的页面或servlet" method= get | post>
        各种提交手段

        提交键
</form>

提交手段包括文本框,列表,文本区等,例如:

< 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标记没有开始标签和结束标签。GUI的对象可以是文本框(text),复选框(checkbox),提交键(submit)等。

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

例4_5中,JSP 页面example4_5.jsp用 form 表单向example4_5_receive.jsp 提交数据,example4_5 receive. jsp 使用 request对象获得 example4_5.jsp 提交的数据。用户在example4_5.jsp单击form 表单submit 提交键 是交信息,所提交的信息包括通过radio选择的是否打开背景音乐的信息、通过checkbox选择回答的奥运项目信息、通过hidden隐藏的信息。调试例4_5时需要将名字是back. mp3的 mp3文件存放到Web服务目录ch4的子目录sound中。

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<style>
   #tom{
      font-family:宋体;font-size:26;color:blue 
   }
</style> 
<HTML><body id="tom" bgcolor = #ffccff>
<form action="example4_5_receive.jsp" method=post id=tom>
  <br>音乐:
  <input type="radio" name="R" value="on" />打开 
  <input type="radio" name="R" value="off" checked="default">关闭 
<br>哪些是奥运会项目:<br> 
  <input type="checkbox" name= "item" value="A"  algin= "top"  />足球
  <input type="checkbox" name= "item" value="B"  algin= "top"  />围棋
  <input type="checkbox" name= "item" value="C"  algin= "top"  />乒乓球
  <input type="checkbox" name= "item" value="D"  algin= "top"  />篮球
  <input type="hidden" value="我是球迷,但不会踢球" name="secret"/>
  <br><input type="submit" id="tom" name="submit" value="提交"/>
  <input type="reset" id="tom" value="重置" />
</form> 
</body></HTML>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<%@ page import  = "java.util.Arrays" %> 
<%! public boolean isSame(String []a,String [] b){
         Arrays.sort(a); 
         Arrays.sort(a);
         return Arrays.equals(a,b);
    }
%>
<HTML><body bgcolor = white >
<p style="font-family:宋体;font-size:36;color:blue"> 
<%   String answer[] = {"A","C","D"};
     request.setCharacterEncoding("utf-8");  
     String onOrOff=request.getParameter("R"); //获取radio提交的值
     String secretMess=request.getParameter("secret");//获取hidden提交的值
     String itemName[]=request.getParameterValues("item"); //获取checkbox提交的值
     out.println("<br> 是否打开音乐:"+onOrOff);
     out.println("<br> 您的答案:");
     if(itemName==null) {
          out.print("没给答案");
     } 
     else {
         for(int k=0;k<itemName.length;k++) {
           out.print(" "+itemName[k]);
         }
         if(isSame(itemName,answer)){
           out.print("<br>回答正确。");
         }
     }
     out.println("<br> 提交的隐藏信息:"+secretMess);
     if(onOrOff.equals("on")) {
%>       <br><embed src="sound/back.mp3" />
<%   } 
%>
</p></body></HTML>

 

 3. select,option 标记

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

<select name = myName">
   <option value ="item1">文本描述</option>

   <option value= “item2">文本描述</option>

......
</select>

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

< select name = “myName" size = “正整数">

    <option value ="item1">文本描述</option>

    < option value="item2">文本描述</option>

.......
</select>

4.textArea 标记

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

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

</textArea>

5.style 样式标记

style 标记可以用于定义HTML其他标记的字体样式

<style>
#textstyle(
   font- family:宋体;font-size:18;color:blue
}
#tom
   font- family:黑体;font-size:16;color:black
}
</style>

其中,#字符之后的字符序列是样式名称,例如 1,#textStyle 给出的样式名称是textStyle(起一个自己喜欢且容易理解的名字),其他 HTMI 标记可以让其id属性值是样式名称来使用这个样式。例如,段落标记p就可以如下使用textStyle 样式:

<p id="textStyle">你好</p >

textArea标记如下使用 tom样式:

<textArea name ="english" id="tom" rows=5 cols=38>大家好</textArea>

submit 标记如下使用textStyle样式:

< input type ="submit" name ="submit " id="textStyle" value="提交"/>

6.table 标记

表格以行列形式显示数据(不提供输入数据功能经常将某些数据或GUI放置在表格的单元格中,让界面更加简练、美观。
表格由<table>标记定义,一般格式:

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

......
     <td width=“单元格的宽度”>单元格中的数据</td>
</tr>

.....
</table>

其中

<tr> ....</tr>

7.<image> 标记

使用image标记可以显示一幅图像,格式为:

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

8.embed 标记

使用embed标记可以播放音乐和视频,格式为:

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

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

例4_8中,example4_8.jsp 页面使用image标记显示一幅图像,用户使用下拉列表选择要播放视频提交给 example4_8_play_mp4.jsp,exan ple4_8_play_mp4.jsp 页面使用embed标记潘放用户选择的视频。其中图像文件flower.jpg和视频文件“高山.mp4”和“湖水,mp4"分别存放在当前Web服务目录ch4的子目录image和 video中。

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #ffccff>
<p style="font-family:宋体;font-size:18;color:blue">  
<form action="example4_8_play_mp4.jsp" method=post name=form>
<b>选择视频:<br>
  <select name= "mp4"  >
     <option value="高山.mp4">美丽的珠峰
     <option value="湖水.mp4">美丽的高原湖
  </select> 
  <input type="submit" name="submit" value="提交" />
</form> <br>
<image src="image/flower.jpg"   width=300 height=190> </image><br>
</p></body></HTML>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<%  
    request.setCharacterEncoding("utf-8"); 
    String mp4 = request.getParameter("mp4");
%>
<HTML><body bgcolor = #ffccff>
<embed src="video/<%= mp4 %>" width=300 height=180 ></embed>
</p></body></HTML>

4.1.5 处理超链接

HTML的超链接标记

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

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

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

超链接所链接的页面可以使用request对象调用getParameter("参数")方法来获得超链接传递过来的值,例如:

String idSte=request.getParameter("id");

 4.2 response对象

使用response对象可以对用户的请求做出动态响应,向用户端发出数据。

4.2.1 动态响应contentType属性

页面用page指令设置页面的contentType属性的值,服务器将按照这种属性的值作出响应,将页面的静态部分返回给用户,用户浏览器收到该响应就会采用相应的手段处理所收到的信息。若要动态地改变这个属性的值来响应用户,就需要使用response对象的setContentType(String s)方法来改变contentType的属性值。

4.2.2 response 对象的HTTP文件头

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

post/example3_1.jsp/HTML.1.1

host:localhost:8080

accept-encoding:gzip,deflate

首行叫请求行,规定了请求访问的页面提交信息的方式,例如:post,get等方式,以及请求的页面的名字和使用的通信协议。
第2、3行分别是两个头(Header): host 和 accept-encoding,称 host,accept-encoding是头名字,而localhost:8080以及gzip, deflate分别是两个头的值。 一个典型的请求通常包含很多的头,有些头是标准的,有些和特定的浏览器有关。
同样,响应也包括一些头。response 对象可以使用方法

addHeader(String head, String value);

setHeader(String head ,String value)

动态添加新的响应头和头的值,将这些头发送给用户的浏览器。如果添加的头已经存在,则先
前的头被覆盖。
在下面的例4_11中,response 对象添加一个响应头refresh.其头值是5.那么用户收到文个头之后,5秒后将再次刷新该页面,导致该网页每5秒刷新一次。

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<%@ page import="java.time.LocalTime" %>
<HTML><body bgcolor = #ffccff>
<p style="font-family:宋体;font-size:36;color:blue">
现在的时间是:<br>
<%  out.println(""+LocalTime.now());
    response.setHeader("Refresh","5");
 %>
</p></body></HTML>

4.2.3 response 对象的重定向


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

4.3 session

Tomcat服务器可以使用内置对象session记录用户的信息。内置对象session由Tomcat服务器负责创建,session是实现了HttpSession接口类的一个实例。

4.3.1 session对象的id


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

4.3.2 session对象与URL重写


session 对象能和用户建立起一一对应关系依赖于用户测览器是否支持Cookie。如果用户端浏览器不支持Cookie,那么用户在不同网页之间的 session对象可能是互不相同的,因为Tomeat服务器无法将id存放到用户端浏览器中,就不能建立session 对象和用户的 一一对应关系。用户将浏览器Cookie 设置为禁止后(选择测览器(IE)菜单→工具→Internet 选项→隐私→高级,将第三方Cookie设置成禁止),会得到不同的结果。也就是说,同一用户对应了多个session对象,这样Tomcat 服务器就无法知道在这些页面上访问的实际上是同一个用户。 
如果用户不支持Cookie,JSP页面可以通过URL重写来实现 session 对象的唯一性, 所谓URL重写,就是当用户从一个页面重新链接到一个页面时,通过向这个新的URL添加参数,把session对象的d传带过去,这样就可以保障用户在该Web服务目录的各个页面中的session 对象是完全相同的。可以让response 对象调用encodeURL()或 encodeRedirectURL()方法实现URL重写,比如,如果从example4_1 _a.jsp页面链接到example4_13_b.jsp页面,首先在程序片中实现URL重写:

String str = response. encodeRedirectURL("example4_ 13_ b.jsp");

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

< form action="example4_13_b.jsp" method = post>

更改为:

< form action=<= str %> method= post>

4.3.3 sessionn 对象存储数据


session对象驻留在服务器端,该对象调用某些方法保存用户在访问某个Web 服务目录期间的有关数据。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 getAttributeNamesO)。 session对象调用该方法产生一个枚举对象,该枚举对象使用nextElemets()遍历 session 中的各个对象所对应的关键字。
(4) public void removeAttribute(String key)。 session 对象调用该方法移掉关键字key对应的对象。
 

4.3.4 session 对象的生存期限


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

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

将其中的30修改成所要求的值即可(单位为分钟)。
session 对象可以使用下列方法获取或设置和生存时间有关的信息:
(1) public long getCreation Time()获取session 创建的时间,单位是毫秒(GMT时间,1970年7月1日午夜起至session 创建时刻所走过的毫秒数)。
(2) public long getLastAccessed Time()获 取 session 最后一次被操作的时间,单位是毫秒。
(3) public int getMaxInactiveInterval()获取 session 最长的“发呆”时间(单位是秒)。
(4) public void setMaxInactiveInterval(int interval)设置session最长的“发呆”时间(单位是秒)。
(5) public boolean isNew()判断 session是否是一个新建的 session。
(6) invalidate()使 session 无效。

4.4 application对象

4.4.1 application对象的常用方法

(1) public void setAttribute( String key, Object obj). application 对象可以调用该方法将参数 Object 指定的对象obj添加到application对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加的对象被清除。
(2) public Object getArtibute(String key). 获取 application 对象含有的关键字是key的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时应显式转化为原来的类型。
(3) public Enumeration getAttributeNames ()。 application 对象调用该方法产生一个Enumeration(枚举)对象,该 Enumeration 对象使用nextElemets()遍历application 中的各个对象所对应的关键字。
(4) public void removeAttribute(String key) 。从当前application 对象中删除关键字是key的对象。
(5) public String getServletInfo()。获取 Servlet编译器的当前版本的信息。由于application对象对所有的用户都是相同的,因此,在某些情况下,对该对象的操作需要实现同步(synchronized)处理。
需要注意的是,Tomcat 服务器启动后,application对象中已经有8个关键字,因此,JSP 程序使用setAttribute(String key. Object obj)在application对象中存储数据时,key要避免使用这8个关键字。这8关键字的名字都很长,例如:javax. servlet. context. tempdir,Org.apache. jasper. runtime. JspApplicationContextImpl等。

4.4.2 application 留言板


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

<%@ 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>
<%@ 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>

<%@ 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>
<%@ 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>

 

 

4.5 out 对象


out 对象是一个输出流,用来向用户端输出数据。在前面的许多例子里曾多次使用out对象进行数据的输出。out对象可调用如下的方法用于各种数据的输出,例如:
视频讲解
(1) out. print(boolean)或 out. println(boolean)用于输出一个布尔值。
(2) out.print(char)或 out. println(char)用于输出一个字符。
(3) out. print(double)或out. printIn(double)用于输出一个双精度的浮点数。
(4)out. print(fload)或out. println(float)用于输出一个单精度的浮点数。
(5) out. print(long)或out. println(long)用于输出一个长整型数据。
(6) out. print(String) 或 out. println(String)用于输出一个String对象的字符序列。
println 和 print 方法的区别是:println会向缓存区写入一个换行,而print 不写人换行。但是浏览器的显示区域目前不识别println写入的换行,如果希望浏览器显示换行,应当向浏览器写入“<br>“实现换行。
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值