java开发遇到的问题总结(四)

26、判断各种类型的空,不过要加包importorg.apache.commons.lang3.StringUtils;

if(StringUtils.isEmpty(sort)){

   代码;

}

27、后台排序代码(之前已经把查询到的数据放入list,然后对总的list里的数据进行排序):

a.前台的remoteSort: true会传来json字符串[{property:"column0",direction:"ASC"}]

b.Action中先声明2个变量:private String sort;private String dir;用来接收

c.json对象转为java字符串:当点击页面的排序时会再进行一次查询,所以在查询方法中进行转换

public String queryPerEventList(){

if(sort!=null){

     System.out.println(sort);

     Map<String, String> map=JsonUtil.getSort(sort);

     sort=map.get("property");

     dir=map.get("direction");

   }

 

}

JsonUtil为自己写的一个工具类,里面有getSort方法,具体怎么转换的代码

  publicstatic Map<String,String> getSort(String sort){

      Gsongson = new Gson();

      Map<String,String>map = new HashMap<String,String>();

      if(sort == null || "".equals(sort)){

         map.put("direction", "");

       map.put("property", "");

      }else{

        List<SortData> sortData =gson.fromJson(sort, newTypeToken<List<SortData>>(){}.getType());

        map.put("direction", sortData.get(0).getDirection());

        map.put("property", sortData.get(0).getProperty());

      }

      return map;

    }

d.然后在String jsondatas=this.service.findDatas(codenames,codenameList,fromtime,totime,isfirst,currentPage,pageSize,perg,sort,dir); //grid的列头

中添加sortdir参数

e.service中写具体的排序方法,不过首先把合计提取出来,使其不参与排序,一直在最下方

booleanflat=false;//is first

     if((isfirst!=null&&!isfirst.equals("")&&isfirst.equals("1"))){

        flat=true;

     }

    //当首次进入时将合计计算并提出来

   list=this.findNewList(list,b,codenames,codenameList,flat,currentPage,pageSize,false);

     }

     Map<String,String> total=null;

     for(int i=0;i<list.size();i++){

        Map<String,String>map=list.get(i);

        if(map==null){

          list.remove(i);

          i--;

        }else{

          if(map!=null&&

                ((map.get("taskname")!=null&&map.get("taskname").equals("合计"))

                ||(map.get("TASKNAME")!=null&&map.get("TASKNAME").equals("合计")))

               ){

             total=list.get(i);

             list.remove(i);

             i--;

          }

        }

     }

具体排序方法如下:

if(sort!=null){//Collection.sort为特有的方法

Collections.sort(list, new Comparator<Map<String,String>>(){

@Override//重写此方法,使其改为适合此情况的方法

publicint compare(Map<String, String> map1, Map<String, String> map2) {

   if(map1!=null&&map2!=null){

      Stringsort1=map1.get(sort);

      Stringsort2=map2.get(sort);

      if((sort1!=null&&!sort1.trim().equals(""))&&(sort2!=null&&!sort2.trim().equals(""))){

      if(((sort1!=null&&!sort1.trim().equals(""))&&!(sort.trim().equals("taskname")||             sort.trim().equals("TASKNAME")))&&((sort2!=null&&!sort2.trim().equals(""))&&!             (sort.trim().equals("taskname")||sort.trim().equals("TASKNAME")))){

           float f1=0;

           float f2=0;

              if(sort1.indexOf('%')!=-1){

                f1=Float.valueOf(sort1.trim().replace("%",""))/100;

              }else{

                f1=Float.valueOf(sort1.trim());

              }

              if(sort2.indexOf('%')!=-1){

                f2=Float.valueOf(sort2.replace("%",""))/100;

              }else{

                f2=Float.valueOf(sort2.trim());

              }

                if(f1>f2){

                   if(dir.equals("ASC")){

                     return 1;

                   }else{

                     return -1;

                   }

                }

                if(f1==f2){

                   return 0;

                }

                if(f1<f2){

                   if(dir.equals("ASC")){

                     return -1;

                }else{

                     return 1;

                        }

                     }

                    

                   }

              }

              }

             return 0;

              }

           });

     }

28bug描述:当列太多时,拖动水平滚动条后再点击列上的排序会出现错位问题,详见附件1.解决办法:

var grid = Ext.create('Ext.grid.Panel', {invalidateScrollerOnRefresh: false})

29、extjs中如果一列即有带%的数字字符串,又有不带%的字符串,想对它们进行排序,需要重写extjs框架里的方法,代码如下(前台排序):

 

function changeSortVal(val){

       if(val.indexOf('%')>-1){

              val = val.substring(0,val.length-1)/100;

       }

              return val-0;

       };

              Ext.data.Store.prototype.createComparator= function(sorters){ 

                 returnfunction(r1, r2){ 

                      var s =sorters[0], f=s.property; 

                      var v1 =r1.data[f], v2 = r2.data[f];

                      var result= 1;

                    

                      if(s.direction== 'ASC'){ 

                          result *=-1; 

                         // alert("result:"+result);

                      }

                      v1 = changeSortVal(v1);

                      v2 = changeSortVal(v2);

                      var a =result * (v1 == v2 ? 0 : (v1 > v2 ? -1 : 1));

                      if(a==0&&(r1.data[f]!=r2.data[f])){

                             if(r1.data[f].indexOf("%")>-1){

                              //  alert("1:"+result);

                                    returnresult;

                             }else{

                                   //alert("2:"+result);

                                    return-result;

                             }

                      }

                     // alert("dss:"+a);

                      return a;

                 }; 

              }; //end

30、报错:Unableto instantiate Action, ObjCheckAction, defined for 'exportObjCheckAction' in namespace '/'ObjCheckAction

原因:查看spring中的配置,比如此处错误为在spring中配置的actionidobjCheckAction而在struts.xml中配置actionclass值却为ObjCheckAction,导致出错。

31、前台点击表格的列会传来json字符串{[“property”:列名,“direction”:ASCDESC]},有时后台需要把它转为JAVA可用的字符串,可以先把其转为MAP,再遍历出来:(与27讲同一问题,但这个没有实现出来排序,在此只是学习JSON的转换)

Iterator<Map<String,Object>> it = JsonUtil.getList(sort).iterator();

StringsortStr = "";

while (it.hasNext()) {

   Map<String, Object> map = it.next();

   String property = (String)map.get("property");

   int val = (int)property.charAt(0);

   if(val>=48 && val<=57){

     property=property.substring(1);

   }

   sortStr += "\""+property+"\" "+ map.get("direction")+",";

}

sortStr= sortStr.substring(0,sortStr.length()-1);

returnsortStr;

}

32、报错: There is no Action mapped for action namequeryAlarmCode. - [unknown location]

原因:1.struts2的配置文件没有放在src目录下,

2.struts2中配置的package标签的namespace属性配置有误,或action nameclassmethod属性配置错误

3.页面调用Action的方式有错

但我这次产生这错误都不是上面的原因.

因为我是使用ajax方式提交,所以package扩展于json-default,其它配置(),

检查配置都没有问题,检查调用方式也没问题,最后想想好像JSON for struts2的插件JAR包还没加上,找到对应STRUTS2相应版本的struts-json-plugin-xxx.jar,加入到应用,问题解决.

最后,加入最后一个导致如题的问题原因:

4.没有加入json对应的插件JAR

33、有些Action中会有privatestaticfinallongserialVersionUID =4955166347375237879L;

原因ActionSupport类中实现了, java.io.Serializable 接口,加以上的常量是为了防止序列化时出现问题。

序列化:流变为对象,反序列化:对象变为注。当它们互相转换时如果参数个数不相等,并且没上以上的那个常量就会出错,有了它便不会。

34、报错:命令未正确结束

原因:查看ibatis中的.xml文件中是否有无用的字符,查看SQL是否写正确

35EXTJS日期控件想修改其传入后台的日期格式:

modifyTime:modifyTime_ele.getRawValue(),

一般是在查询按钮里添加此代码,其中modifyTime为控件的ID,modifyTime_ele为日期控件

36、在JAVA中导出EXCEL表时报错Caused by: java.lang.OutOfMemoryError: Javaheap space

原因:内存溢出,这个异常和JVM默认划分的内存上限是128M有关。

解决方法:设置TOMCAT的内存大小

1.MyEclipse

Window-->Preference-->MyEclipse-->ApplicationServers-->Tomcat-->Tomcat 6.x-->JDK-->Optional Java VM arguments下填上:

-Xms256m-Xmx512m -XX:PermSize=256m -XX:MaxPermSize=600m

2.Window系统

 2.1.编辑tomcatcatalina.bat文件,在第一行的后面增加一句:

setJAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M

3.Linux系统

 编辑tomcatcatalina.sh文件,在第一行的后面增加一句:

JAVA_OPTS='-server-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M'

注意:单引号不能少,-server表示以server模式运行(运行效率比默认的client高很多,自己云去测试)-Xms256m是最小内存,-Xmx512m是最大内存,其中的256512可根据你自己的内存做相应调整,PermSize/MaxPermSize最小/最大堆大小.一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置,我自己的文件如下:

#!/bin/sh

JAVA_OPTS='-server-Xms1024m -Xmx1024m XX:PermSize=128M -XX:MaxPermSize=256M'

#-----------------------------

37、在EXTJS中会有请求超时这一说,一般默认是30S,当超过这个时间就不再发送请求,可以在页面进行改变:timeout : 30*60*1000,

可以在火狐浏览器的BUG页面的脚本查看请求时间,详看附件(看请求时间)

38、有关查询的小结:在JAVA中可以把页面中所有的控件等封装到bean里,在action中直接使用bean来使用其封装起来的属性,不过action需要实现ModelDriven方法,还需要有这个getModel方法:

publicMonitorChangeBean getModel() {

    

     returnmonitorChangeBean;

   }

39、取得一年中某周的起始与结束日期

附件:工具类DateUtil.java。在Action中的方法为:

/**

    * 获取一年中某一周的起始日期结束日期

    */

   public String queryWeekDate() throws Exception{

     Date date = null;

     date = DateUtil.getWeekFirstDate(year, week);

     String firstDate = DateUtil.dateToString(date,"yyyy-MM-dd");

    

     date = DateUtil.getWeekLastDate(year, week);

     String lastDate = DateUtil.dateToString(date,"yyyy-MM-dd");

    

     data.put("firstDate", firstDate);

     data.put("lastDate", lastDate);

     returnSUCCESS;

   }

struts-xml中配置:

<action name="getWeekDate" class="monitorChangeAction" method="queryWeekDate">

       <result name="success" type="json">

              <param name="root">data</param>

       </result>

</action>

40eval函数

  success: function (response, options) {

        varres  = eval('('+response.responseText+')');

       onlineTime_ele.setValue(res.firstDate);

        endTime_ele.setValue(res.lastDate);

 },

eval函数作用是动态执行,即可以把字符串当作脚本来执行,response.responseText得到的是字符串类型,赋给res变成对象,然后便可以调用lastDate了。

网上解说:eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined

需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:

varcode1='"a" + 2';    //表达式

varcode2='{a:2}';      //语句

alert(eval(code1));    //->'a2'

alert(eval(code2));    //->undefined

alert(eval('('+ code2 + ')'));    //->[object Object] 例如JSON 对象就是利用这个

可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到,第二个alert语句输出的是undefined,而第三个加了括号后输出的是语句表示的对象。

http://blog.csdn.net/ikmb/article/details/4411237

41ibatis的配置文件.xml中的<typeAliasalias=>作用

42、报错:Bean property'orgFrameService' is not writable or has an invalid setter method. Does theparameter type of the setter match the return type of the getter?

原因:1、配置错误;2Action中查看是否各个属性均有setget方法了

 


你可能感兴趣的:(java,spring,struts2,ibatis)