发表用户:bj_meng
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=11&ID=3086
信息原始来源:bj_meng

文章标题:在jbuilderX中建立MapXtreme for Java4.7应用(bj_meng学习笔记 2004-5-26)

2004-05-26
1、 今天在同事sunday_28的帮助下,修正昨天做的页面还有服务端的方法,全部采用post访问。
a) 服务端dopost方法修改如下:增加编码设置,同时对jsp提交事件进行了判断。在getrushtrooprecord方法中增加了参数response以定向到报表数据页面rushtrooprpt.jsp。
  public void dopost(httpservletrequest request, httpservletresponse response) throws
      servletexception, ioexception {
        request.setcharacterencoding("gb2312");
    //doget(request, response);
    /**
     * 保存抢险队伍信息
     */
    if ((request.getparameter("savebtn") != null) &&
        (request.getparameter("savebtn").equals("提  交"))) {
      system.out.println("save record");
      saverushtrooprecord(request);
    }
    /**
     * 查询抢险队伍信息,以arraylist格式返回
     */
    if ((request.getparameter("searchbtn") != null) &&
          (request.getparameter("searchbtn").equals("报  表"))) {
      system.out.println("get record");
      getrushtrooprecord(request, response);
    }
  }

b) getrushtrooprecord方法修改如下:在最后增加response.sendredirect("rushtrooprpt.jsp");以定向到报表数据页面rushtrooprpt.jsp。
c) 做为酬劳,我为其编写了一个根据两个日期获取sql语句where条件的方法原型。其中涉及到date的格式设置、date和string的转换、string和date的转换等,对初学者会有一定帮助的,由于是原型,没有对其中的语法特别讲究,尤其是变量的命名。其代码原型如下:
  /**
   * 根据给定的起止日期返回sql语句的查询条件
   * @param begintime string 格式如:2004-05-25 09:00:00
   * @param endtime string
   * @return string
   */
  private string getfilter(string begintime, string endtime){
    try{
      long dis = 0;
      char chb[], che[];
      chb = begintime.tochararray();
      che = endtime.tochararray();

      dateformat df = new simpledateformat("yyyy-mm-dd");
      date bdt = df.parse(begintime);
      date edt = df.parse(endtime);
      long bint = bdt.gettime();
      long eint = edt.gettime();
      //天
      dis = (long)((eint - bint)/(24 * 60 * 60 * 1000)) + 1;

      int i = 0;
      string strfilter = "";
      string strequal = "";
      long lnewdate = bint;
      for(i = 0; i < dis; i++){
        date d1 = new date(lnewdate);
        string snewdate = df.format(d1);
        if(strfilter.equals(strequal)){
          strfilter = "(frd >='" +
              snewdate.copyvalueof(snewdate.tochararray(), 0, 10) + " 00'" +
              " and frd <='" +
              snewdate.copyvalueof(snewdate.tochararray(), 0, 10) + " 23')";
        }
        else{
          strfilter = strfilter + "or" + "(frd >='" +
              snewdate.copyvalueof(snewdate.tochararray(), 0, 10) + " 00'" +
              " and frd <='" +
              snewdate.copyvalueof(snewdate.tochararray(), 0, 10) + " 23')";
        }
        //毫秒
        lnewdate += (long)(24 * 60 * 60 * 1000);
      }

      return strfilter;
    }catch(exception e){
      e.printstacktrace();
      return "";
    }

  }
d) 其他
2、 避免服务需要重新启动的方法:修改c:\program files\mapinfo\mapxtreme-4.7.0\tomcat-4.1\conf下的server.xml,增加一行
  <context path="/water" docbase="/water" debug="0" reloadable="true"/>
其中water是发布的应用的名称。改语句在
        <context path="/examples" docbase="examples" debug="0"
                 reloadable="true" crosscontext="true">
前面加即可,用了觉得很不错。
3、 昨天提到了报表数据不能看到的问题,今天调试试,发现相同的代码在我的同时sunday_28那里可以看到,最后发现是配置的问题。正在查看。
4、 报表数据看不到的原因终于查明:是由于服务端的getrushtrooprecord方法中的valuerd定义的位置不正确,应该放到while语句之中。这应该是初用java的人很容易犯的错误。我的思路是这样:用valuerd保存一条记录的各个字段,valuers保存各个valuerd对象,由于是demo才这样做的,不提倡。当valuers.add完一个valuerd后,把valuerd中的内容清除,因此在今天调试时还曾经用了arraylist的remove方法,这是错误的。按照我个人的理解,valuerd中的对象实际上指向内存中的某一个地址,在valuers中也是指向该地址的,如果把valuerd中的对象remove掉,则valuers中也必然找不到该对象,在jsp端自然也不能看到该对象的数据。另一方面,如果不new一个新的valuerd,则valuers每add一个valuerd,实际上都是一样的内容,而且valuerd中不再是一条记录的各个字段的信息,而是所有记录的累加。由于我在数据表中又一条记录的非关键字段都是空,又是最末一条记录,所以在jsp端显示都是这一条记录,自然在页面上看不到数据。因此原先所怀疑的xml配置的问题实际上也是病急乱投医的一种做法,因此劝告大家在碰到问题时,要拓宽思路,从各个方面都予以考虑、怀疑,这样会有所增益的。
5、 不小心一下子写了三十多页,还真的有点成就感,^_^ ,希望大家也都如是。
6、 今天尽管没做什么,但感觉还是很有收获的,但愿每一天都不白过。
7、 晚上帮我的同时sunday_28调试方法,做了补充和修改,其中用到了arraylist、string、date、integer等相关的方法,有一定的参考价值,没有做任何优化,结果是正确,其他就留给sunday_28去处理啦,^_^。
  /**
   * 获取条件记录集中的最高最低水位及其时间,偷懒没有用存储过程,只好如此
   */
  public void getfluxtable() {
    arraylist arr = new arraylist();
    arraylist valuers = new arraylist();
    try {
      operationbean ob = new operationbean();
      statement stat = null;
      resultset rs = null;
      string date = "";
      string mintime = "", maxtime = "";
      int tempb = 0, temps = 0, i = 0;
      string strsql = "select waterstationid,flux ,daytime from water where daytime between '2004-5-21 00:00' and '2004-5-22 23:00' and waterstationid='w00001' order by daytime";
      if (stat == null)
        stat = ob.getconnection().createstatement();
      rs = stat.executequery(strsql);
      arraylist valuerd = new arraylist();
      while (rs.next()) {
        if (! (rs.getdate("daytime").tostring()).equals(date)) {
          if (i != 0) valuerd = new arraylist();
          date = rs.getdate("daytime").tostring();
          system.out.println(mintime + " " + maxtime);
          system.out.println(temps + " " + tempb);
          mintime = rs.getdate("daytime").tostring() + " " +
              rs.gettime("daytime").tostring();
          maxtime = rs.getdate("daytime").tostring() + " " +
              rs.gettime("daytime").tostring();
          temps = tempb = rs.getint("flux");
          system.out.println(mintime + " " + maxtime);
          system.out.println(temps + " " + tempb);
          valuerd.add(0, mintime);
          valuerd.add(1, maxtime);
          integer temps = new integer(temps);
          valuerd.add(2, temps);
          integer tempb = new integer(tempb);
          valuerd.add(3, tempb);
          valuers.add(i, valuerd);
          i++;

        }
        else {
          if (rs.getint("flux") > tempb) {
            tempb = rs.getint("flux");
            maxtime = rs.getdate("daytime").tostring() + " " +
                rs.gettime("daytime").tostring();
            system.out.println("tempb=" + tempb + " maxtime" + maxtime);
            integer tempb1 = new integer(tempb);
            valuerd.set(3, tempb1);
            valuerd.set(1, maxtime);
            valuers.set(i - 1, valuerd);
          }
          else {
            if (rs.getint("flux") < temps) {
              mintime = rs.getdate("daytime").tostring() + " " +
                  rs.gettime("daytime").tostring();
              temps = rs.getint("flux");
              system.out.println("temps=" + temps + " mintime" + mintime);
              integer temps1 = new integer(temps);
              valuerd.set(2, temps1);
              valuerd.set(0, mintime);
              valuers.set(i - 1, valuerd);
            }
          }
        }

      }
      if (valuers != null) {
        for (int j = 0; j < valuers.size(); j++) {
          arraylist value = (arraylist) valuers.get(j);
          if (value != null) {
            system.out.println(value.get(0).tostring() + " " +
                               value.get(1).tostring() + " " +
                               value.get(2).tostring() + " " +
                               value.get(3).tostring());
          }
        }
      }
    }
    catch (exception e) {
      system.out.println(e.getmessage());
      e.printstacktrace();
    }
  }
8、 其他