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的列头
中添加sort与dir参数
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;
}
});
}
28、bug描述:当列太多时,拖动水平滚动条后再点击列上的排序会出现错位问题,详见附件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中配置的action的id为“objCheckAction”而在struts.xml中配置action的class值却为“ObjCheckAction”,导致出错。
31、前台点击表格的列会传来json字符串{[“property”:列名,“direction”:ASC或DESC]},有时后台需要把它转为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 name、class、method属性配置错误
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是否写正确
35、EXTJS日期控件想修改其传入后台的日期格式:
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.编辑tomcat的catalina.bat文件,在第一行的后面增加一句:
setJAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M
3.Linux系统
编辑tomcat的catalina.sh文件,在第一行的后面增加一句:
JAVA_OPTS='-server-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M'
注意:单引号不能少,-server表示以server模式运行(运行效率比默认的client高很多,自己云去测试),-Xms256m是最小内存,-Xmx512m是最大内存,其中的256与512可根据你自己的内存做相应调整,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>
40、eval函数
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
41、ibatis的配置文件.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、配置错误;2在Action中查看是否各个属性均有set与get方法了