一个Jsp初学者的学习过程(四)

来源:互联网 发布:陕西省大数据集团 编辑:程序博客网 时间:2024/05/22 15:00
一个Jsp初学者的学习过程(四)

TheUnforgiven


第四章  第一个Javabean

一、先看看如何取当前时间并显示的代码:
------------------------------------------------
<%
    java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

    java.util.Date currentTime = new java.util.Date();//得到当前系统时间

    String str_date1 = formatter.format(currentTime);  //将日期时间格式化
    String str_date2 = currentTime.toString(); //将Date型日期时间转换成字符串形式
%>
格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时间:<%=str_date1%>
未经格式化的String格式的日期时间:<%=str_date2%>
未经格式化的Date格式的日期时间:<%=currentTime%>
-------------------------------------------------
页面的输出内容:
格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时间:2005-03-17 09:55:40
未经格式化的String格式的日期时间:Thu Mar 17 09:55:40 CST 2005
未经格式化的Date格式的日期时间:Thu Mar 17 09:55:40 CST 2005

    通常我们需要的是这种格式化后的时间:2005-03-17 09:55:40。现在有这样一个问题:“2005-03-17 09:55:40”是一个字符串,有些时候我们需要在这个字符串里提取出年、月、日等的相关信息,怎么办呢?看下面的代码:
----------------------规则的字符串----------------------------------------------
规则的字符串(年4位,月2位,日2位,中间用字符“-”分隔):
<br>原字符串为:
<%
  String date="1989-12-30";
  out.println(date+"<br>");
  String year=date.substring(0,4);//取第0+1位至第4位
  String month=date.substring(5,7);//取第5+1位至第7位
  String day=date.substring(8,10);//取第8+1位至第10位
  out.println("year="+year+",month="+month+",day="+day);
%>
----------------------------------------------------------------------------------
    从上面的代码我们可以看出来:这只能针对规则的字符串(年4位,月2位,日2位),要是不规则的呢?年可能2位也可能4位,月和日可能1位也可能2位,怎么办?通过对上面的代码修改,可以得到下面的通用的代码(这个“通用”有一个前提——年月日之间必须以“-”分隔):
----------------------不规则的字符串----------------------------------------------
不规则的字符串(年、月、日长度不一定,中间用字符“-”分隔):
<br>原字符串为:
<%
  String date="04-05-6";
  out.println(date+"<br>");
  int a=date.indexOf("-");//求第一个“-”的位数
  int b=date.lastIndexOf("-");//求最后一个“-”的位数
  int len=date.length();//求字符串的长度
  year=date.substring(0,a);//取第一个“-”前的字符串
  month=date.substring(a+1,b);//取两个“-”之间的字符串
  day=date.substring(b+1,len);//取最后一个“-”以后的字符串
  out.println("year="+year+",month="+month+",day="+day);
%>
----------------------------------------------------------------------------------
    现在这个问题解决了。可是我们会想到:每次需要对一个表示年月日的字符串进行分割的时候都需要在.jsp页面里写上这么一段代码,不但麻烦而且使页面显得混乱,能不能以一种看起来更清晰的方法解决这个问题呢?当然可以了,用javabean就行了。

二、第一个javabean
    什么是javabean?我在接触到这个问题时苦恼不已,因为我始终无法理解这个概念,直到我相继写了几个之后,我蓦然发现:它不就是一个类吗?!现在,我们先不去管什么是类,先看下面的这个javabean:
--------------------------------DateBean.java-------------------------------------
//该bean能够从jsp文件中得到一个表示年月日(用“-”分隔)的字符串,然后返回给jsp文件分别表示年、月、日的字符串
package ringz.javabeans;  //ringz.javabeans是我的包名,我自己写的javabean都在这个包里
public class DateBean   //这个class的名字是DateBean,那么这个javabean文件的名就必须叫:DateBean.java
{
   private String dateStr;
   private String year;
   private String month;
   private String day;
   //
   public void setDateStr(String str)    //私有变量dateStr的set方法
   {
     this.dateStr=str;
   }
   public String getDateStr()    //私有变量dateStr的get方法
   {
     return dateStr;
   }
   public String getYear()//得到年的字符串
   {
     int a=dateStr.indexOf("-");//求第一个“-”的位数
     year=dateStr.substring(0,a);//取第一个“-”前的字符串
     return year;
   }
   public String getMonth()//得到月的字符串
   {
     int a=dateStr.indexOf("-");//求第一个“-”的位数
     int b=dateStr.lastIndexOf("-");//求最后一个“-”的位数
     month=dateStr.substring(a+1,b);//取两个“-”之间的字符串
     return month;
   }
   public String getDay()//得到日的字符串
   {
     int b=dateStr.lastIndexOf("-");//求最后一个“-”的位数
     int len=dateStr.length();//求字符串的长度
     day=dateStr.substring(b+1,len);//取最后一个“-”以后的字符串
     return day;
   }
}
---------------------------------------------------------------------------------
    一个javabean里最主要的是set和get方法:set方法用于从.jsp页面向javabean传值;get方法用于从javabean向.jsp页面传值。下面看.jsp页面如何使用这个javabean:
------------------------------ymd_use_bean.jsp----------------------------------
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<jsp:useBean id="ymd" scope="page" class="ringz.javabeans.DateBean">
<jsp:setProperty name="ymd" property="*"/>
</jsp:useBean>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>使用javabean从字符串中取得年月日信息</title>
</head>
<body>
<%
try
{
out.println("您输入的字符串是:"+ymd.getDateStr()+"<br>");
out.println("year="+ymd.getYear()+",month="+ymd.getMonth()+",day="+ymd.getDay());
}
catch(Exception e){}
%>
<br><br><hr><br>请在下边的文本框中输入代表年月日的字符串,格式:XXXX-XX-XX,其中代表年、月、日的位数可以不限定。
<form method="post" action="ymd_use_bean.jsp">
  <input type="text" name="dateStr"><!--必须和所使用的javabean:DateBean中的这个“private String dateStr;”所定义的名称完全一致!!!-->
  <input type="submit"  value="确定">
(必须使用两个“-”分开,如:1999-9-29)
</form>
</body>
</html>
--------------------------------------------------------------------------------
    你在这段代码里能看到get方法,可是set方法呢?怎么没看见?这里面的玄机在<jsp:useBean></jsp:useBean>之间和form里的这句:<input type="text" name="dateStr">,这里我不想重点说明.jsp文件如何引用javabean,你不清楚的话请查阅其他资料。
    另外在这里提一个小技巧你自己试一试:把try和catch的内容去掉,看看结果是什么样的;把catch的内容改成这样:
    catch(Exception e)
     {out.print(e);}
再看看结果是什么样的。然后自己分析一下为什么会这样。这是一个我经常使用的小技巧,不知道别人是不是也用这种方法来解决这种问题。(后补:关于异常的处理学问实在是很多啊。这里说的这个小技巧实际上是我之前的一种自作聪明——就是这样一种情况:有时候一个字符串变量可能得不到值(比如接收一个可以为空的表单文本框),但是下边还需要对这个变量操作,如果变量为空的话下边的这个操作就会抛出异常,这里说的这个小技巧就是指如果出现这种情况的异常,那么对这个异常的处理是NOTHING,什么都不做,也就是视为一切正常。)

    上面已经说了javabean就是一个类,下面我要用自己的话说一下什么是类,我是怎么理解类这个概念(理解的不一定准确,还请高手们给予指正,免的误人子弟^_^!):
    先是想起一个笑话:说有一种机器,从机器的一侧放进一头猪,机器的另一侧就会出香肠。引申一下。这台机器在一个仓库里,这个仓库里还有一台能自动出猪毛和一台出猪皮的机器。现在这个仓库就可比做一个类,而每台机器就是一个方法,因为这个仓库是只针对猪的仓库,所以这个仓库一定在java.pig这个包(java的API——说白了就是类库或者按照C的说法就是函数库——里有很多类,这些类是分类存放的,每一个分类称做一个包,比如,和输入输出有关的类就放在java.io包里,和绘制图形相关的类就放在java.awt包里)里面,我们给这个仓库起名叫PigFactory,这就是类名。现在拿来一头猪:Japanese属于类Pig,先通过和PigFactory同名的构造函数PigFactory()为处理这头猪新建一个实例:
    java.pig.PigFactory pf = new java.pig.PigFactory();
现在我们可以通过这个实例对这头猪进行操作了——由于我们只想要它的皮,那就使用出皮的机器就行了,这台机器作为一个方法叫做getSkin(),那么:
    Skin pigskin = pf.getSkin(Japanese);
猪皮(pigskin)出来了,并且运送出仓库,它属于类“皮”(Skin)了。
    类似的,还有一些专门处置牛、羊的仓库,它们也有自动出皮的机器,所以也是方法:getSkin(),这也就是为什么我们会发现很多不同的类里边有相同名称的方法,如:getString方法。
    我们可以发现:这台自动出皮的机器是如何工作的,我们并不关心,我们所关心的只是怎样使用它。我们也可以自己开发一个类(或者javabean),它的工作原理和SUN给我们开发好的API里的类是基本一致的。在使用时我们所关心的仅仅是如何把值传给它和如何从它那里得到值。
    以上是我的理解,可能有很多不确切的地方,希望大家指正。

    说了这很多废话以后,你可能想问:我们上面写的javabean现在可以用了吗?还不行。刚刚我们写好的是一个.java文件,必须把它编译成.class文件以后Jsp才能调用它。下面说怎么编译,由于我现在没有使用专门的java开发工具(如JBuilder),所以只能使用我们安装的JDK(java 2 sdk)所提供的编译工具:
    把DateBean.java这个文件放到C:/下,“开始”-“运行”-“cmd命令”,在开启的窗口中将当前路径改为C:/,然后输入:javac DateBean.java,回车,如果窗口中没有提示出错的话,OK,编译成功了。这时你会发现和DateBean.java处于同目录的地方多了一个DateBean.class文件,就是它了。现在的问题是它应该放在哪了。由于是我自己写的javabean,所以我不打算把他们和Tomcat自带的放在一起:之前我们定义了自己的根目录:e:/MyJsp,在它的下面新建一个WEB-INF文件夹(注意大小写),其下再建一个classes文件夹,放在这里就行了。当然你可以专门为你自己开发的javabean做一个包——就像SUN那样——我自己的包名叫ringz.javabeans,所以我在classes文件夹下建了一个ringz的文件夹,里面再建一个javabeans文件夹,然后把我开发的.class文件放到这里。这时使用的时候要注意包名:<jsp:useBean id="ymd" scope="page" class="ringz.javabeans.DateBean" />。(后补:实际上,类外层的包名是必须的)

    本章需要注意的当然是每次改完后的.java文件都要重新编译成.class文件,而且使用.class文件时要重启Tomcat服务器。(后补:实际上,这是不正确的,有时候并不需要重启TC,这大概是和TC的版本有关)


原创粉丝点击