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

目录

前言

内置对象简介:

HTTP请求

1.request对象

1.1获取用户提交的信息

1.1.2 处理汉字信息

1.3常用方法举例

1.4处理HTML标记

1.4.1 form标记

1.4.2 input标记

1.5 处理超链接HTML的超链接标记:

2. response对象

2.1  动态响应 contentType 属性

2.2 response 对象的 HTTP 文件头

2.3 response对象的重定向

3. session对象

3.1 session 对象的 id 

3.2 session 对象与 URL 重写

3.3 session对象存储数据

3.4 session 对象的生存期限

4. application对象

4.1 application 对象的常用方法

4.2 application 留言板

5. out对象

实验:

总结


前言

HTTP通信协议是用户与服务器之间一种提交(请求)信息与响应信息(request/response)的通信协议。在JSP中,内置对象 request 封装了用户提交的信息,request 对象获取用户提交信息的最常用的方法是 getParameter(String s)。response 对象对用户的请求作出动态响应,向用户端发送数据。


内置对象简介:

由JSP由JSP容器实现和管理( JSP 内部对象是 Web 容器加载的一组类),在所有JSP页面中都能使用内部对象。JSP 使用 Java 定义的内置对象来访问网页的动态内容
内置对象只对表达式和Scriptlet有用,在声明中不能使用
JSP的常用内置对象:request、response、session、application和out。

HTTP请求

HTTP通信协议使用用户与服务器之间一种提交信息和响应信息的通信协议。HTTP通信协议是用户与服务器之间一种提交(请求)信息与响应信息(request/response)的通信协议。在JSP中,内置对象 request 封装了用户提交的信息,request 对象获取用户提交信息的最常用的方法是 getParameter(String s)。response 对象对用户的请求作出动态响应,向用户端发送数据。

1.request对象

在JSP中,内置对象request对象封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象就可以获取用户提交的信息。
用户通常使用 HTML 的 form 表单(也称 form 标记)请求访问服务器的某个 JSP 页面,并提交必要信息给所请求的 JSP 页面( servlet )。表单的一般格式是:

< form action ="请求访问的页面或 Servlet " method = get | post >
       提交手段
 
</ form >

1,< form >是 form 表单的开始标签、</ form >是结束标签,开始标签和结束标签之间是 form 表单的标记体的内容。

2、action 是 form 表单的属性,其属性值给出表单请求访问的 JSP 页面或 servlet 。 form 表单中的 method 属性取值 get 或 post 。

3,get 方法和 post 方法的主要区别是:使用 get 方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而 post 方法提交的信息不会显示在地址栏中。提交手段包括文本框、列表、文本区等。
例如:

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

1.该 form 表单使用 post 方法向请求访问的 tom . jsp 页面提交信息

2.提交信息的手段是 text (文本框),文本框的名字由 name 属性的值指定(例如,名字是 boy )。

3.在文本框输入信息(其中默认信息是 ok )然后单击 submit 提交键向服务器的 JSP 页面 tom . jsp 提交信息。
    form 表单请求访问的 JSP 页面可以让内置 request 对象调用 getParameter ( String s )方
法,并让 s 取值是 input 标记中 name 给出的文本框 text 的名字(比如 boy ),获取该表单通过文本框 text 提交的文本信息(即用户在 GUI 控件文本框中输入的文本,默认值是 ok ),比如:

request . getParameter (" boy ");

1.1获取用户提交的信息

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

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

1.1.2 处理汉字信息

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

request . setCharacterEncoding (" utf -8");

例如:

<%@ 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.3常用方法举例

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

post/example3_1.jsp/HTTP.1.1
host: localhost:8080
accept - encoding: gzip,deflate

一个请求还包含信息体,即 HTML标记组成的部分,可能包括各式各样用于提交信息的表单等,如:

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

request 对象常用方法如下:
(1) String getProtocol ()获取用户向服务器提交信息所使用的通信协议,例如 http /1.1等。(2) String getServletPath ()获取用户请求的 JSP 页面文件的名字(带目录符号\,例如\ hello . jsp ).
(3) String getContextPath ()获取用户请求的当前 Web 服务目录(例如ch4)。
(4) int getContentLength ()获取用户提交的整个信息的长度。
(5) String getMethod ()获取用户提交信息的方式,例如 post 或 get 。
(6) String getHeader ( String s )获取 HTTP 头文件中由参数 s 指定的头名字的值,一般来说参数 s 可取的头名有 accept 、 accept - language 、 content - type 、 accept - encoding 、 user - agent 、 host . content - length . contioi 本号等信息。
(7) Enumeration getHeaderNames ()获取头名字的一个枚举。
(8)Enumeration getHederstrins ( String s )获取头文件中指定头名字的全部值的一个枚举。
(9) String getRemoteAddr ()获取用户的 IP 地址。(10) String getRemoteHost ()获取用户机的名称(如果获取不到,就获取 IP 地址)。
(11) String getServerName ()获取服务器的名称。
(12) String getServerPort ()获取服务器的端口号。
(13) Enumeration getParamtmname ()获取用户提交的信息体部分中各个name给出的参数的一个枚举。
例如:

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #ffccff>
<p style="font-family:宋体;font-size:36;color:blue"> 
   <% request.setCharacterEncoding("utf-8");
      String jsp=request.getServletPath();    //请求的JSP页面
      jsp = jsp.substring(1); //去掉JSP页面名称前面的目录符号/
      String webDir = request.getContextPath();//获取当前Web服务目录的名称
      webDir = webDir.substring(1); //去掉Web服务目录的名称前面的目录符号/
      String  clientIP=request.getRemoteAddr();//用户的IP地址
      int serverPort=request.getServerPort(); // 服务器的端口号
      out.print("<br>shenme:"+request.getServerName());
    %> 
用户请求的页面:<%= jsp %>
<br>Web服务目录的名字:<%= webDir %>
<br>用户的IP地址:<%= clientIP %>
<br>服务器的端口号:<%= serverPort %>
</p></body></HTML>

1.4处理HTML标记

1.4.1 form标记

习惯称form标记为form表单,用户经常需要使用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 方法提交的信息不会显示在地址栏中。

1.4.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 (提交键)等。

(1)文本框text

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

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

其中, value 的值是 text 中文本的初始值, size 是 text 的长度(单位是字符), algin 是 text 在浏览器窗体中的对齐方式, maxlength 指定 text 可输入的最多字符。 request 对象通过 name 指定的名字来获取用户在 text 输入的字符串。如果用户没有在 text 输入任何信息,就单击 form 表单中的 submit 提交键, request 对象调用 getParameter 方法将获取由 value 指定的默认值( text 中显示的默认文本),如果 value 未指定任何值, getParameter 方法获取的字符串的长度为0,即该字符串为""

(2)单选框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 "/>

其中, value 指定 radio 的值 algin 是 radio 在浏览器窗体中的对齐方式,如果几个单选键的
 name 取值相同,那么同一时刻只能有一个被选中。 request 对象调用 getParameter 方法获取
被选中的 radio 中 value 属性指定的值。 checked 如果取值是一个非空的字符串,那么该单选框的初始状态就是选中状态。

(3)复选框 checkbox

当 type 属性指定输入方式的 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 "/>

其中, value 指定 checkbox 的值。复选框与单选框的区别就是可以多选,即如果几个 checkbox 的 name 取值相同,那么同一时刻可有多个 checkbox 被选中。这时, request 对象需调用 getParameter Values 方法(不是 getParameter 方法)获取被选中的多个 checkbox 中 value 属性指定的值。 checked 如果取值是一个非空的字符串,那么该复选框的初始状态就是选中状态。

(4)口令框 password

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

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

用户在口令框中输入 tiger ,单击提交键, tiger 将被提交给 form 表单请求的页面,请求的页面的内置对象 request 调用 getParameter 方法获取 password 提交的值 tiger ( password 仅仅起着不让别人偷看的作用,不提供加密措施)。

(5)隐藏 hidden

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

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

用户单击 form 表单中的 submit 提交键,那么 form 表单所请求的页面的 request 对象调用 getParameter 方法将获取由 value 指定的值 hello 。

(6)提交键 submit

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

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

单击提交键后, form 表单请求的页面才有机会获取 form 表单提交的各个数据。

(7)重置键 reset

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

< input type =" reset " value ="重置"/>

注: HTML embed 标记可以播放音乐,音乐文件可以是. wav 和.mp3格式。

例如:

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

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 >

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

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
   #tom{
      font-family:宋体;font-size:26;color:blue 
   }
</style> 
<%   String music = request.getParameter("music");
     String pic = request.getParameter("pic");
     String onOrOff=request.getParameter("R"); 
     if(music==null) music = "";
     if(pic==null)   pic = "";
     if(onOrOff==null) onOrOff = "off";
%>
<HTML><body id=tom background="image/<%= pic %>" >
<form action=""  method=post >
   <b>选择音乐:<br>
   <select id=tom name="music" >
      <Option selected value="back1.mp3">绿岛小夜曲
      <Option value="back2.mp3">我是一片云</option>
      <Option value="back3.mp3">红河谷</option>
   </select> 
   <input type="radio" name="R" value="on" />打开 
   <input type="radio" name="R" value="off" />关闭 
   <br><b>选择背景图像:<br>
   <select id=tom name="pic" size = 2>
      <option value="back1.jpg">荷花图</option>
      <option value="back2.jpg">玫瑰图</option>
      <option value="back3.jpg">校园图</option>
   </select> <br> 
   <input id=tom type="submit"  name="submit" value="提交"/>
</form> 
<%   if(onOrOff.equals("on")) {
%>       <br><embed src="sound/<%= music %>" height=50 />
<%   } 
%>
</body></HTML> 

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

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

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

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

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

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

6.table标记
表格以行列形式显示数据,不提供输入数据功能。经常将某些数据或GUI放置在表格的单元格

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

其中

<tr>....</tr>

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

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
   #textStyle{
      font-family:宋体;font-size:28;color:blue 
   }
</style> 
<HTML><body id = textStyle bgcolor = #ffccff>  
<form action="example4_7_showCalendar.jsp" method=post >
输入日期的年份选择月份查看日历.<br>
年份:<input type="text" name="year" id = textStyle value=2022 size=12 />
月份 <select name="month" id = textStyle size =1>
  <option value="1">1月</option>
  <option value="2">2月</option>
  <option value="3">3月</option>
  <option value="4">4月</option>
  <option value="5">5月</option>
  <option value="6">6月</option>
  <option value="7">7月</option>
  <option value="8">8月</option>
  <option value="9">9月</option>
  <option value="10">10月</option>
  <option value="11">11月</option>
  <option value="12">12月</option>
</select><br>  
<input type="submit" id = textStyle value="提交"/>
</form> 
</body></HTML>
<%@ page import="java.time.LocalDate" %>
<%@ page import="java.time.DayOfWeek" %>
<%
    request.setCharacterEncoding("utf-8");  
    String year=request.getParameter("year"); 
    String month=request.getParameter("month");
    int y = Integer.parseInt(year);
    int m = Integer.parseInt(month);
    LocalDate date = LocalDate.of(y,m,1);
    int days = date.lengthOfMonth(); //得到该月有多少天。
    int space = 0;                   //存放空白字符的个数
    DayOfWeek dayOfWeek = date.getDayOfWeek(); //得到1号是星期几
    switch(dayOfWeek) {
          case SUNDAY:    space = 0;
                          break;
          case MONDAY:    space = 1;
                          break;
          case TUESDAY:   space = 2;
                          break;
          case WEDNESDAY: space = 3;
                          break;
          case THURSDAY:  space = 4;
                          break;
          case FRIDAY:    space = 5;
                          break;
          case SATURDAY:  space = 6;
                          break;
   }
   String [] calendar = new String[space+days]; //用于存放日期和1号前面的空白
   for(int i=0;i<space;i++)
       calendar[i]="--";
   for(int i = space,n=1;i<calendar.length;i++){
       calendar[i] = String.valueOf(n) ;
       n++;
   }  
%>
<HTML><body bgcolor = #ffccff>
<h3> <%=year %>年<%=month %>月的日历:</h3>
<table  border=0>
  <tr><th>星期日</th><th>星期一</th><th>星期二</th><th>星期三</th>
      <th>星期四</th><th>星期五</th><th>星期六</th>
  </tr>
<% 
   int n = 0;
   while(n<calendar.length){
       out.print("<tr>");
       int increment = Math.min(7,calendar.length-n);
       for(int i=n;i<n+increment;i++) {
         out.print("<td align= center>"+calendar[i]+"</td>");
       }
       out.print("</tr>");
       n = n+increment;
   }
%> 
</table></body></HTML>

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

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

  如果图像文件和当前页面在同﹣ Web 服务目录中,图像文件的地址就是该图像文件的名字,如果图像文件在当前 Web 服务目录一个子目录中,比如 image 子目录中,那么"图像文件的 URL "就是" image /图像文件的名字"。
  image 标记中可以使用 width 和 height 属性指定被显示的图像的宽和高,如果省略 width 
和 height 属性, image 标记将按图像的原始宽度和高度来显示图像。

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

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

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

如果音乐或视频文件和当前页面在同一 Web 服务目录中, embed 标记中 src 属性的值就是该文件的名字;如果视频文件在当前 Web 服务目录一个子目录中,比如 avi 子目录中,那么 embed 标记中 src 属性的值就是" avi /视频文件的名字"。
embed标记中经常使用的属性及取值如下:
<embed src="音乐或视频文件的 URL”/>
autostart 属性取值 true 或 false,autostart 属性的值用来指定音乐或视频文件传送完毕后是否立刻播放,该属性的默认值是 false。
loop 属性取值正整数指定音乐或视频文件重复播放的次数,取值-1 为无限循环播放width height 属性取值均为正整数,用 width 和 height 属性的值指定播放器的宽和高,如果省略 width 和 height 属性,将使用默认值。
例如:

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

9.属性值格式的说明
许多HTML标记都有属性,并可以指定属性的值,例如:

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

type、name、value 都是input 标记的属性,属性值可以用双引号括起,也可以用单引括起或者不用任何符号,比如 type 属性的值可以用双引号括起"text”,也可以用单引号插'text",或者不用任何符号text。

1.5 处理超链接
HTML的超链接标记:

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

是一个常用标记。例如

<a href ="example4_9_receive, jsp">购买</ a>

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

<%@ 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 ="example4_9_receive.jsp?id=A1001&price=8765">购买</a><br>
商品编号A1002,价格<%= price%>
<a href ="example4_9_receive.jsp?id=A1002&price=<%= price%>">购买</a>
</p></body></HTML>
example4_9_receive

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


2. response对象

前面学习了用 request 对象获取用户请求提交的信息,与 request 对象相对应的对象是 response 对象。可以用 response 对象对用户的请求作出动态响应,向用户端发送数据。

2.1  动态响应 contentType 属性

页面用 page 指令设置页面的 contentType 属性的值,那么 Tomcat 服务器将按照这种属性值作出响应,将页面的静态部分返回给用户,用户浏览器接收到该响应就会使用相应的手段处理所收到的信息。由于 page 指令只能为 contentType 指定一个值来决定响应的 MIME 类型,如果想动态地改变这个属性的值来响应用户,就需要使用response 对象的 setContent Type ( String s )方法来改变 contentType 的属性值,该方法中的参数 s 可取值: text / html 、text / plain 、image / gif 、image / x - xbitmap 、image / jpeg 、image / pipeg 、application / x - shockwave - flash 、application / vnd . ms - powerpoint 、 application / vnd . ms - excel , application / msword 等。
       当用 setContentType ( String s )方法动态改变了 contentType 的属性值,即响应的 MIME 类型, Tomcat 服务器就会按照新的 MIME 类型将 JSP 页面的输出结果返回给用户。

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>#textStyle
   { font-family:宋体;font-size:36;color:blue 
   }
   #tomStyle
   { font-family:黑体;font-size:26;color:black 
   }
</style> 
<HTML><body id="textStyle" bgcolor = #ffccff> 
<form action="example4_10_show.jsp"  method=post >
输入圆半径:<br>
半径:<input type="text" name="radius" id = "textStyle" value=100.8 size=12 /><br>
<input type="submit" name="submit" id = "tomStyle" value="提交看面积"/><br>
<input type="submit" name="submit" id = "tomStyle" value="提交看圆形"/>
</form> 
</body></HTML>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<%@ page import="java.awt.*" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="java.awt.geom.*" %>  
<%@ page import="javax.imageio.ImageIO" %>
<style>#textStyle
   { font-family:宋体;font-size:36;color:blue 
   }
</style> 
<%! void drawCircle(double r,HttpServletResponse response) { //定义绘制圆的方法
        int width=320, height=300;
        BufferedImage image = 
        new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.fillRect(0, 0, width, height);
        Graphics2D g_2d=(Graphics2D)g; 
        Ellipse2D ellipse=new Ellipse2D.Double(160-r,150-r,2*r,2*r);
        g_2d.setColor(Color.blue);
        g_2d.draw(ellipse); 
        try {
          OutputStream outClient= response.getOutputStream();//指向用户端的输出流
          boolean boo =ImageIO.write(image,"jpeg",outClient);
        }
        catch(Exception exp){}
    }
    double getArea(double r) { //定义求面积的方法
       return  Math.PI*r*r;
    }
%>
<%  request.setCharacterEncoding("utf-8"); 
    String submitValue = request.getParameter("submit");
    String radius = request.getParameter("radius");
    double r =Double.parseDouble(radius);
    if(submitValue.equals("提交看圆形")){
       response.setContentType("image/jpeg");//response更改相应用户的MIME类型
       drawCircle(r,response) ; //绘制圆
    }
%>
<HTML><body bgcolor = #EEEEFF>

<p id ="textStyle">
<%  
    double area=getArea(r);
    String result = String.format("%.2f",area);
%> 
半径:<%= radius %><br>
<b>面积(保留2位小数)<br><%= result %>
</p></body></HTML>

2.2 response 对象的 HTTP 文件头

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

post /example3_ I . jsp / HTTP .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 );

 set Header ( String head , String value );
<%@ 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>

2.3 response对象的重定向

  在某些情况下,当响应用户时,需要将用户重新引导至另一个页面。例如.果用户输入的form 表单信息不完整,就会再被引导到该form表单的输入页面.
      可以使用response 对象的sendRedirect(URLurl)方法实现用户的重定间即让用户从一个页面跳转到sendRedirect(URL url)中url指定的页面,即所谓面客户端跳转。需要注意的是当使用 sendRedirect(URL url)方法将用户从当前更面重定向另一个页面时,Tomcat 服务器还是要把当前 JSP 页面执行完毕后才实施重定向(转)操作,但Tomcat 服务器不再给用户看当前页面的执行效果。如果在执行sendRedire(URL url)方法后,紧接着执行了return返回语句,那么Tomcat 服务器会立刻结束当前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">
填写姓名(<%= (String)session.getAttribute("name")%>):<br>
<form action="example4_12_receive.jsp" method="post" name=form>
   <input type="text" id="textStyle"  name="name">
   <input type="submit" id="textStyle" value="确定"/>
</form>
</body></HTML>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #DDEEFF> 
<%  request.setCharacterEncoding("utf-8"); 
    String name=request.getParameter("name");
    if(name==null||name.length()==0) {
       response.sendRedirect("example4_12.jsp"); 
       String str =(String)session.getAttribute("name");//这个仍然会被执行。
       session.setAttribute("name","李四"+str);//这个仍然会被执行。
    }
%> 
<b>欢迎<%= name %>访问网页。
</body></HTML>

3. session对象

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

3.1 session 对象的 id 

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

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

<%@ 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"> 
这是example4_13_a.jsp页面<br>单击提交键连接到example4_13_b.jsp
<% String id=session.getId();
   out.println("<br>session对象的ID是<br>"+id);
   String str=response.encodeRedirectURL("example4_13_b.jsp");
%>
<form action=<%=str%> method=post name=form>
  <input type="submit" id="textStyle" value="访问example4_13_b.jsp" />
</form>  
</body></HTML>

<%@ 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">  
这是example4_13_b.jsp页面
<%  String id=session.getId();
    out.println("<br>session对象的ID是<br>"+id);
%>
<br>连接到example4_13_a.jsp的页面。<br>
<a href="example4_13_a.jsp">example4_13_a.jsp</a>   
</body></HTML>

3.2 session 对象与 URL 重写

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

3.3 session对象存储数据

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

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<style>#textStyle
   { font-family:宋体;font-size:36;color:blue 
   }
</style> 
<style>#tomStyle
   { font-family:黑体;font-size:26;color:black 
   }
</style> 
<HTML><body bgcolor = #ccffff>
<p id ="textStyle">
随机分给了一个1到100之间的数,请猜!
<%  int number=(int)(Math.random()*100)+1;
    session.setAttribute("count",new Integer(0));
    session.setAttribute("saveGuessNumver",new Integer(number)); //保存需要猜测的数
%>
<br>输入猜测:
<form action="example4_14_judge.jsp" method="post" >
   <input type="text" id ="tomStyle" name="guess" > 
   <input type="submit" id ="tomStyle" value="提交" />
</form>
</p></body></HTML>
<%   String str=request.getParameter("guess");
     if(str==null||str.length()==0) {
         response.sendRedirect("example4_14.jsp");
     }
     else {
        int userGuessNumber=Integer.parseInt(str);//用户的猜测
        session.setAttribute("userGuess",new Integer(userGuessNumber));
        Integer saveGuessNumver=
        (Integer)session.getAttribute("saveGuessNumver");
        if(userGuessNumber == saveGuessNumver.intValue()) {
           int n=((Integer)session.getAttribute("count")).intValue();
           n=n+1;
           session.setAttribute("count",new Integer(n));
           response.sendRedirect("example4_14_success.jsp");
        } 
        else if(userGuessNumber > saveGuessNumver.intValue()){
           int n=((Integer)session.getAttribute("count")).intValue();
           n=n+1;
           session.setAttribute("count",new Integer(n));
           response.sendRedirect("example4_14_large.jsp");
        }
        else if(userGuessNumber < saveGuessNumver.intValue()) {
           int n=((Integer)session.getAttribute("count")).intValue();
           n=n+1;
           session.setAttribute("count",new Integer(n));
           response.sendRedirect("example4_14_small.jsp");
        }
     }
%>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>#textStyle
   { font-family:宋体;font-size:36;color:blue 
   }
</style>
<style>#tomStyle
   { font-family:黑体;font-size:26;color:black 
   }
</style>  
<HTML><body bgcolor = white> 
<%  Integer userGuess=(Integer)session.getAttribute("userGuess");
%>
<p id="textStyle"> 
<%= userGuess %>数大了,请再猜:
<form action="example4_14_judge.jsp" method="post" name=form >
    <input type="text" id="tomStyle" name="guess" > 
    <input type="submit" id="tomStyle" value="送出" />
</form>
</p></body></HTML>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>#textStyle
   { font-family:宋体;font-size:36;color:blue 
   }
</style>
<style>#tomStyle
   { font-family:黑体;font-size:26;color:black 
   }
</style>   
<HTML><body bgcolor = white> 
<%  Integer userGuess=(Integer)session.getAttribute("userGuess");
%>
<p id="textStyle"> 
<%= userGuess %>数小了,请再猜:
<form action="example4_14_judge.jsp" method="post" name=form >
    <input type="text" id="tomStyle" name="guess" /> 
    <input type="submit" id="tomStyle" value="送出" />
</form>
</p></body></HTML>

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<%  Integer count = (Integer)session.getAttribute("count");
    Integer num = (Integer)session.getAttribute("saveGuessNumver");
%>
<HTML><body bgcolor = pink > 
<p style="font-family:黑体;font-size:36;color:blue">
<br>恭喜猜对了,
<br><b>共猜了<%=count%>次。
<br>这个数字就是<%=num%>。
</p></body></HTML>


3.4 session 对象的生存期限

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

<%@ page import="java.time.LocalTime" %>
<%@ page import="java.time.temporal.ChronoUnit" %>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<HTML><body bgcolor = #ffccff> 
 <%  out.println("session的Id:"+session.getId());
     session.setMaxInactiveInterval(6);
     LocalTime time = LocalTime.now();
     out.print("<br>(时:分:秒:纳秒)"+time);
     out.println("<br>开始发呆");
%>
</body></HTML>

4. application对象

4.1 application 对象的常用方法

  (1) public void setAttribute ( String key , Object obj ). applicationXT 调用该方法将参数 Object 指定的对象 obj 添加到 application 对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。
(2) public Object getAttibute ( String key . plicationK 
键字是 key 的对象。由于任何对象都可以添加到 application 对象中,因此用该方法取回对象时,应显式转化为原来的类型。
(3) public Enumeration getAttributeNamliio Enumeration (枚举)对象,该 Enumeration 对象使用 ncxtElemets ()遍历 application 中的各个对象所对应的关键字。
(4) public void removeAttribute ( String key ). MM application 
 key 的对象。
(5) public String getServletlnfo ()。获取 Servlet 编译器的当前版本的信息。
由于 application 对象对所有的用户都是相同的,因此,在某些情况下,对该对象的操作需要实现同步( synchronized )处理。

4.2 application 留言板

  在实际项目中一般是使用数据库来实现留言板,不会用 application 对象(除非是非常简单的告示留言板)。

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

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 对象的字符序列。

实验:

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
   #tomStyle{
      font-family:宋体;font-size:36;color:blue 
   }
</style> 
<HTML><body id=tomStyle bgcolor = #ffccff>
<form action="huiwenNumber.jsp" method=post name=form>
输入一个正整数数:<br>
  <input type=text name="number" id=tomStyle size=16 value = 520 />
  <br><input type="submit" id=tomStyle value="提交" />
</form> 
</body></HTML>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<%@ page import = "java.math.BigInteger" %> 
<HTML><body bgcolor = cyan>
<p style="font-family:宋体;font-size:36;color:black">
<%!
   public static String reverse(String s) {  //定义方法返回参数的反序。
        StringBuffer  buffer = new StringBuffer(s);
        StringBuffer  reverseBuffer = buffer.reverse();  
        return  reverseBuffer.toString();
   }
%>
<% 
   String regex = "[1-9][0-9]*";
   String startNumber=request.getParameter("number");
   if(startNumber==null||startNumber.length()==0) {
        startNumber = "520";
   }
   if(!startNumber.matches(regex)) {
        response.sendRedirect("inputNumber.jsp"); 
        return;
   }
   long step = 1;
   BigInteger number = new  BigInteger(startNumber);    //开始的数。
   BigInteger reverseNumber = new BigInteger(reverse(number.toString())); //反序后的数。
   BigInteger resultNumber = number.add(reverseNumber);    //二者和的结果。
   out.print("<br>"+number+"+"+reverseNumber+"="+resultNumber);//输出计算过程。
   BigInteger p = new BigInteger(reverse(resultNumber.toString()));  //二者和的结果的反序。
   while(!resultNumber.equals(p)) {   //判断是否是回文数。
         number = new  BigInteger(resultNumber.toString());
         reverseNumber = new  BigInteger(reverse(number.toString()));
         resultNumber = number.add(reverseNumber);
         p = new BigInteger(reverse(resultNumber.toString()));
         out.print("<br>"+number+"+"+reverseNumber+"="+resultNumber);//输出计算过程。
         step++;
   }
   out.print("<br>"+step+"步得到回文数:"+resultNumber);         
%>
</p></body></HTML>

总结

   一个用户在某个 Web 服务目录的 session 对象的生存期限依赖于用户是否关闭浏览器,依赖于session 对象是否调用 invalidate()方法使得 session 无效或 session 对象达到了设置的最长的“发呆”状态时间。
  内置对象application由服务器负责创建,每个 Web 服务目录下的 application 对象被访问该服务目录的所有的用户共享;不同 Web 服务目录下的 application 互不相同。以上就是本章所讲的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值