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


一、request对象

 HTTP通信协议是用户与服务器之间一种提交(请求)信息与响应信息(request/response)的通信协议。在JSP中,内置对象request封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
 内置对象request对象是实现了ServletRequest接口类的一个实例,可以在Tomcat服务器的webapps\tomcat-docs\servletapi中查找ServletRequest接口的方法
 用户通常使用HTML的form表单:

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

1.获取用户提交的信息

 request对象获取用户提交信息的最常用的方法是getParameter(String s)。
 例子4_1中,example4_1.jsp通过表单向example4_1_computer.jsp提交三角形三边的长度,example4_1_computer.jsp负责计算并显示三角形的面积。

example4_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>

example4_1_computer.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>

如果form表单中的action请求的页面是当前页面,可以用双引号"“或单引号代替当前页面,即写成action=”"或action =‘’,注意双引号或单引号中不能含有空格。也可省略action参数,即不显式写出action参数。

2.处理汉字信息

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

JSP页面文件的编码为utf-8编码。
内置对象request在获取信息之前调用setCharacterEncoding方法设置编码为utf-8(默认是iso-8859-1)就可以避免乱码现象,代码如下:
request.setCharacterEncoding(“utf-8”)

3.常用方法举例

request的getParameter方法获取form表单提交的有关信息,但实际上,request对象调用相关方法可以获取请求的许多细节信息。内置对象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 getRemoteAddr() 获取用户的IP地址。
  7. String getRemoteHost() 获取用户机的名称(如果获取不到,就获取IP地址)。
  8. String getServerName() 获取服务器的名称。
  9. String getServerPort() 获取服务器的端口号。

4.处理HTML标记

  • 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> 
  • input标记
<input type="GUI对象" name= "GUI对象的名子" value="GUI中的默认值"/>

Tom服务器的内置对象request通过name指定的名字来获取GUI对象中提交的数据。

  1. 文本框text
    < input type=“text” name=“m” value=“h” size=“8” algin=“left” maxlength=“9”/>
  2. 单选框radio
    < input type=“radio” name=“hi” value=“男” algin= “top” checked=“ok” />男生
    < input type=“radio” name=“hi” value=“女” algin= “top” />女生
    其中value指定radio的值,如果几个单选键的name取值相同,那么同一时刻只能有一个被选中。
  3. 复选框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取值相同,那么同一时刻可有多个chekbox被选中。
  4. 口令框password
    < input type= “password” name= “me” size= “12” maxlength=“30” />
    用户在口令框中输入tiger,单击提交键,tiger将被提交给form表单请求的页面,请求的页面的内置对象request调用getParameter方法获取password提交的值tiger(password仅仅起着不让别人偷看的作用,不提供加密措施)。
  5. 隐藏hidden
    < 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” />
  7. 重置键:reset
    重置键将表单中输入的数据清空,以便重新输入数据,例如:
    < input type=“reset” value=“重置”/>
  • select、option标记
    下拉列表或滚动列表
    < select name=“myName”>
    < option value=“item1”>文本描述< /option>
    < option value=“item2”>文本描述< /option>

例子6中用户通过下拉列表为当前页面选择一首音乐、通过滚动列表为当前页面选择一幅图像。

example4_6.jsp

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

  • textArea标记
    文本区
    < textArea name=“名字” rows= “文本可见行数” cols= “文本可见列数” >
  • 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属性值是样式名称来使用这个样式。
  • table标记
    主要用于显示数据,不能提交数据
    < table border =“边框的宽度”>
      < tr width=“该行的宽度”>
       < th width=“单元格的宽度” >单元格中的数据< /th>

      < td width= “单元格的宽度” >单元格中的数据< /td> … < /tr>
    … ….
    < /table>
  • < image>标记
    不能用于提交数据,用于显示图像。
    < image src=“图像文件的URL” >描述文字< /image>
  • embed标记
    不能用于提交数据。使用embed标记可以播放音乐和视频,当浏览器执行该标记时,会把浏览器所在机器上的默认播放器嵌入到浏览器中,以便播放音乐或视频文件。embed标记的基本格式为:
    < embed src=“音乐或视频文件的URL” >描述文字< /embed >

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

5.处理超链接

超链接标记
< a href=链接的页面地址 >文字说明< /a>
是一个常用标记。例如:
< a href ="example4_9_receive.jsp>购买< /a>
用户单击超链接标记的文字说明,可以访问超链接给出的链接页面。

例子4_9中example4_9.jsp用超链接向example4_9_receive.jsp传递商品的编号和价格。
example4_9.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 ="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.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>

二、response对象

1.动态响应contentType属性

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

2.response的HTTP文件头

response对象可以使用方法
addHeader(String head,String value);

setHeader(String head ,String value);
动态添加新的响应头和头的值,将这些头发送给用户的浏览器。如果添加的头已经存在,则先前的头被覆盖

3.response重定向

  • response的sendRedirect(URL url)方法实现用户的重定向,即让用户从一个页面跳转到sendRedirect(URL: url)中url指定的页面。
  • 当使用sendRedirect(URL url)方法将用户从当前页面重定向另一个页面时,Tomcat服务器还是要把当前JSP页面执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前页面的执行效果。
  • 如果在执行sendRedirect(URL url)方法后,紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前JSP页面的执行。

用户在example4_12.jsp页面的form表单中输入姓名提交给example4_12_receive.jsp页面,如果未输入姓名就提交form表单就会重新定向到example4_12.jsp页面。
example4_12_receive.jsp

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

example4_12.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>

三、session对象

HTTP协议是一种无状态协议。一个用户向服务器发出请求(request),然后服务器返回响应(response),在服务器端不保留用户的有关信息,因此当下一次发出请求时,服务器无法判断这一次请求和以前的请求是否属于同一用户。

1.session对象的id

  • 当一个用户首次访问web服务目录中的一个JSP页面时,Tomcat服务器产生一个session对象,这个session对象调用相应的方法可以存储用户在访问该web服务目录中各个页面期间提交的各种信息。
  • 这个session对象被分配了一个String类型的id号,Tomcat服务器同时将这个id号发送到用户端,存放在用户(浏览器)的Cookie中。这样,session对象和用户之间就建立起一一对应的关系,即每个用户都对应着一个session对象(称作用户的会话),不同用户(不同浏览器)的session对象互不相同,具有不同的id号码。
  • 当用户再访问该Web服务目录的其它页面时,Tomcat服务器不再分配给用户的新session对象,而是使用完全相同的一个,直到session对象达到了最大生存时间或用户关闭自己的浏览器或Tomcat服务器关闭,Tomcat服务器将销毁用户的session对象

用户(浏览器)在访问一个Web服务目录期间,服务器为该用户分配一个session对象(称作和该用户的会话),服务器可以在各个页面使用这个session记录当前用户的有关信息。而且服务器保证不同用户的session对象互不相同。

2.session对象与URL重写

  • session对象能和用户建立起一一对应关系依赖于用户浏览器是否支持Cookie。
  • 如果用户不支持Cookie,JSP页面可以通过URL重写来实现session对象的唯一性。

如果从example4_13_b.jsp页面链接刀example4_13_a.jsp页面,先在程序片中实现URL重写:
String str=response.encodeRedirectURL(“example4_13_b.jsp”);
然后将连接目标写成<%= str %>

3.session对象存储数据

  • public void setAttribute (String key ,Object obj)。 session对象可以调用该方法将参数Object指定的对象obj添加到session对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加的对象被清除。
  • public Object getAttribute(String key)。获取session对象索引关键字是key的对象。由于任何对象都可以添加到session对象中,因此用该方法取回对象时,应显式转化为原来的类型。

4.session对象的生存期限

session对象的生存期限依赖于session对象是否调用invalidate()方法使得session无效或session对象达到了设置的最长的“发呆”状态时间以及用户是否关闭浏览器或服务器被关闭。

  • 所谓“发呆”状态时间是指用户对某个Web服务目录发出的两次请求之间的间隔时间(默认的发呆时间是30分钟)。
  • 打开Tomcat安装目录中conf文件下的配置文件web.xml,找到
    < session-config>
      < session-timeout>30< /session-timeout>
    < /session-config>
    将其中的30修改成所要求的值即可

例子15中session对象使用setMaxInactiveInterval(int interval)方法设置最长的“发呆”状态时间为6秒。用户可以通过刷新页面检查是否达到了最长的“发呆”时间,如果两次刷新之间的间隔超过6秒,用户先前的session将被取消,用户将获得一个新的session对象。
example4_15.jsp

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

四、application对象

1.application 对象的常用方法

  • public void setAttribute(String key ,Object obj)。application对象可以调用该方法将参数Object 指定的对象 obj添加到application对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。
  • public Object getAttibute(String key)。获取application对象含有的关键字是key的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应显式转化为原来的类型。

2.application 留言板

例子16是为了练习使用application内置对象,让其担当留言板的角色,并设置留言板上最多可留言99999条。
用户通过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>

五、out对象

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值