ply

吞噬黑暗
posts - 1, comments - 11, trackbacks - 0, articles - 13
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2012年3月16日

jQuery调用JSON时,net.sf.json.JSONException: There is a cycle in the hierarchy!

遇到了一些问题,如hibernate延迟加载错误,这都是老掉牙的问题了,一看就知道加个lazy=flase就OK了。想不到快要完成了又遇到了新的问题,JSON死循环,实在让人郁闷。异常如下:


net.sf.json.JSONException: There is a cycle in the hierarchy!
        at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.
handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
        at net.sf.json.JSONObject._fromBean(JSONObject.java:674)
        at net.sf.json.JSONObject.fromObject(JSONObject.java:181)
        at net.sf.json.JSONArray._processValue(JSONArray.java:2381)
        at net.sf.json.JSONArray.processValue(JSONArray.java:2412)
        Truncated. see log file for complete stacktrace
>


仔细查了一下发现是hibernate主外键关联的错,后来就想下json源代码下来看,发现大费周章都没搞到json源码,还是老办法反编译瞅瞅,发现JSONArray根据判断取得的不同类型调用相应的方法,

if (object instanceof Collection)
    return _fromCollection((Collection)object, jsonConfig);

而我从hibernate那得到的是list,所以去调用了_fromCollection方法,而里面的方法发现一个问题:该方法会不断的拆开实体属性,直到没有为止,而我的ContactGroup里有两个属性用于自身关联

private Set contactGroups = new HashSet(0);
private Set contactGroupPersons = new HashSet(0);


也就是说主外键自身关联的是个死循环,那怎么才能不让他出现这种情况呢,应该有个配置的参数后者终止循环的地方吧,查看发
现,jsonConfig,呵呵,config应该是配置参数吧,参看JsonConfig看见巨多的属性,有点晕PropertyFilter
,不提了,看了老半天,发现了一个属性PropertyFilter,PropertyFilter 是一个interface,代码如下:


public interface PropertyFilter
{


public abstract boolean apply(Object obj, String s, Object obj1);
}


也就是说我可以通过这个方法过滤掉List里的相应属性,只要让它返回true就可过滤掉,……,有点悬……我们重写一下这个方法:


JsonConfig cfg = new JsonConfig();
    cfg.setJsonPropertyFilter(new PropertyFilter()
    {
         public boolean apply(Object source, String name, Object value) {
           if(name.equals("contactGroups")||name.equals("contactGroupPersons")) {
             return true;
           } else {
             return false;
          }
        }
       });

将hibernate产生的实体bean中的contactGroups和contactGroupPersons过滤掉就OK了!

然后调用JSONArray.fromObject(mychildren,cfg); mychildren是hibernate返回的list。

 

 1List<ShoppingCart> listCarts = sCartServiceImpl
 2                        .ShoppingCartTable(shoppingCart);
 3                // 先过滤对set集合的拆解
 4                JsonConfig config = new JsonConfig();
 5                config.setJsonPropertyFilter(new PropertyFilter() {
 6                    @Override
 7                    public boolean apply(Object arg0, String arg1, Object arg2) {
 8                        if (arg1.equals("shoppingCarts")) {
 9                            return true;
10                        }
 else {
11                            return false;
12                        }

13                    }

14                }
);
15                // 将数据转换成Json数据
16                JSONArray jsonObject = JSONArray.fromObject(listCarts, config);
17                System.out.println(jsonObject.toString());
18

搞了一下午,参考网络的资料!解决问题了!

posted @ 2012-03-16 18:38 ply 阅读(20640) | 评论 (10)编辑 收藏

2011年12月26日

-------------------------------------
MyEclipse
快捷键1(CTRL)
-------------------------------------
Ctrl+1 快速修复
Ctrl+D:
删除当前行
Ctrl+Q  定位到最后编辑的地方
Ctrl+L  定位在某行 
Ctrl+O  快速显示 OutLine

Ctrl+T  快速显示当前类的继承结构
Ctrl+W  关闭当前Editer
Ctrl+K  快速定位到下一个
Ctrl+E
快速显示当前Editer的下拉列表
Ctrl+J 
正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,)   

Ctrl+Z 返回到修改前的状态
Ctrl+Y 与上面的操作相反
Ctrl+/  注释当前行,再按则取消注释

Ctrl+D删除当前行。
Ctrl+Q跳到最后一次的编辑处
Ctrl+M切换窗口的大小
Ctrl+I格式化激活的元素Format
Active
Elements。
Ctrl+F6切换到下一个Editor
Ctrl+F7切换到下一个Perspective
Ctrl+F8切换到下一个View
------------------------------------------
MyEclipse
快捷键2(CTRL+SHIFT)
------------------------------------------
Ctrl+Shift+E
显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+Shift+/ 自动注释代码

Ctrl+Shift+\自动取消已经注释的代码
Ctrl+Shift+O 自动引导类包
Ctrl+Shift+J
反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 
把当前选中的文本全部变为小写
Ctrl+Shift+Y  把当前选中的文本全部变为小写
Ctrl+Shift+F 
格式化当前代码
Ctrl+Shift+M(先把光标放在需导入包的类名上) 作用是加Import语句
Ctrl+Shift+P
定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)
Ctrl+Shift+F格式化文件Format
Document。
Ctrl+Shift+O作用是缺少的Import语句被加入,多余的Import语句被删除。

Ctrl+Shift+S保存所有未保存的文件。
Ctrl+Shift+/ 在代码窗口中是这种/*~*/注释,在JSP文件窗口中是
<!--~-->。
Shift+Ctrl+Enter
在当前行插入空行(原理同上条)
-----------------------------------------
MyEclipse
快捷键3(ALT)
-----------------------------------------
Alt+/ 代码助手完成一些代码的插入
,自动显示提示信息
Alt+↓  当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑  当前行和上面一行交互位置(同上)

Alt+←  前一个编辑的页面
Alt+→  下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter
显示当前选择资源(工程,or 文件 or文件)的属性


MyEclipse 快捷键4(ALT+CTRL)


Alt+CTRL+↓ 复制当前行到下一行(复制增加)
Alt+CTRL+↑
复制当前行到上一行(复制增加)
-------------------------------------------
MyEclipse
快捷键5(ALT+SHIFT)
-------------------------------------------
Alt+Shift+R
重命名
Alt+Shift+M 抽取方法
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L 抽取本地变量
Alt+Shift+F 把Class中的local变量变为field变量
Alt+Shift+I
合并变量
Alt+Shift+V 移动函数和变量
Alt+Shift+Z 重构的后悔药(Undo) Shift+Enter
在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Alt+Shift+O(或点击工具栏中的Toggle Mark
Occurrences按钮) 当点击某个标记时可使本页面中其他地方的此标记黄色凸显,并且窗口的右边框会出现白色的方块,点击此方块会跳到此标记处。

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)


--------------------------------------------
MyEclipse 快捷键(6)
--------------------------------------------
F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show
Tooltip Description。
F3跳到声明或定义的地方。
F5单步调试进入函数内部。

F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的。
F7由函数内部返回到调用处。

F8一直执行到下一个断点。



posted @ 2011-12-26 17:17 ply 阅读(271) | 评论 (0)编辑 收藏

2011年12月2日

length是数组的属性,
length()是字符串获取长度的方法,
size是list的个数

posted @ 2011-12-02 13:37 ply 阅读(241) | 评论 (0)编辑 收藏

2011年12月1日

从对象的内存角度来理解试试.

假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.

现在通过代码来看看内存的分配情况:

Father f = new Father();//系统将分配1M内存.

Son s = new Son();//系统将分配1.5M内存.


因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.

由于s中包含了父类的实例,所以s可以调用父类的方法.


Son s1 = s;//s1指向那1.5M的内存.(可以理解为就是:子类引用指向子类对象)


Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).


Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.


Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

 


示例:

class Father{

void print(){};

}


class Son extends Father{

void print(){System.out.println("子类中!");}

void show(){System.out.println("show 中!");}

}


class Demo{

public static void main(String args[]){

Father obj=new Son();

obj.print();

obj.show();  //这个调用会报错!

}

}


1 .如果你想实现多态,那么必须有三个条件,父类引用,子类对象,方法覆盖

你这里如果Fathor类有一个show()方法,那么形成方法覆盖,那么此时就可以这么写:obj.show(),此刻形成了多态.

2. 没有方法覆盖,那你这里只能解释为父类引用去访问一个子类的方法,当然,父类引用没有这么大范围的权限,当然会报错

PS:多态实际上是一种机制,在编译时刻,会生成一张虚拟表,来记录所有覆盖的方法,没有被覆盖的方法是不会记录到这张表的.

若一个父类引用调用了没有覆盖的子类方法,那么是不符合该表的,那么编译时刻就会报错.

在执行程序的时候,虚拟机会去这张虚拟表中找覆盖的方法,比如引用中实际上存的是一个子类对象引用,那么就会去找子类中的相应的覆盖的方法来执行

定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

对多态的理解:多态体现在继承中,所以需要有继承关系,然后子类要重写父类方法,最后父类指向子类(父类本身具有一些方法,这些方法被子类重写了,但调用这些方法时,会自动调子类重写的那些)。

多态具体表现在重写和重载,多态就是类的多种表现方式,比如同名不同参,子类重写父类。

看下面这段程序:

class Father{

    public void func1(){

        func2();

    }


    //这是父类中的func2()方法,因为下面的子类中重写了该方法

    //所以在父类类型的引用中调用时,这个方法将不再有效

    //取而代之的是将调用子类中重写的func2()方法

    public void func2(){

        System.out.println("AAA");

    }

}

 

class Child extends Father{

    //func1(int i)是对func1()方法的一个重载

    //由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用

    //所以在下面的main方法中child.func1(68)是不对的

    public void func1(int i){

        System.out.println("BBB");

    }


    //func2()重写了父类Father中的func2()方法

    //如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法

    public void func2(){

        System.out.println("CCC");

    }

}


public class PolymorphismTest {

    public static void main(String[] args) {

        Father child = new Child();

        child.func1();//打印结果将会是什么?  

    }

}


  
上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int
i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int
i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。


    那么该程序将会打印出什么样的结果呢?

    很显然,应该是“CCC”。







变量是不存在重写覆盖的!

public class A { int a = 1; }

public class B extends A { int a = 2; }


测试类里调用了这个方法void compare(){

if(super.a == this.a)

System.out.println("not overrided");

else

System.out.println("overrided");}

控制台出来的是overrided

 类中的属性是没有多态性的,即你在引用上面使用属性时,系统只会去找引用的静态类型中的那个属性,而与它的实际类型无关。

静态方法也是没有多态性的。

posted @ 2011-12-01 22:24 ply 阅读(2833) | 评论 (0)编辑 收藏

2011年9月15日

web应用类型的转换分为两种情况:

1.从客房端的字符串到自定义类型的转换。

2.页面输出时从自定义类型到字符串的转换。

在struts2中分两种转换,一种是局部转换,另一种是全局类型转换。具体转换的实施需要一个转换类和一个自定义类。我们先来看局部类型转换。

局部类型转换

对于int等基本类型,struts2会自动完成类型转换,像age年龄,在输入页面是String型的,到Action后会自动转换成int型。而如果是转换成对象类型的话,就需要自定义类型转换。这样就需要一个自定义类。要定义一个转换类,需要继承ognl.DefaultTypeConverter这个类 ,这是个类型转换的类。代码如下:

 1 public class PointConverter extends DefaultTypeConverter{

 2     public Ojbect convertValue(Map context,Object value,Class tyType){//重写方法
 3         if(Point.class==toType){
 4             Point point = new Point();
 5             String[] str = (String[])value;//将String转换成类的代码处理
 6             return point;
 7          }
 8          if(String.class==toType){//说明由类转换成String
 9              Point point = (Point)value;//将类转成String的代码处理
10              return String型的一个变量;
11          }
12          return null;
13     }
14 }

方法对数说明:1、Map context  ——应用上正文

                    2、Object value ——是要进行类型转换的值。如果是从客户端到自定义的类,那么value是个字符串。注意:它是一个字符串的数组。因为:在表单中可以有多个文本域,而所有文本域可以是同一个名字,这时是考虑通用性而作为数组处理的。如果只有一个文本域,则数组只有一个元素,下标为0。注:jsp的servlet中接收多个相同名字的输入域用request.getParameterValues()方法。

                    3、class toType ——来指定向哪 一种类型转换,即是向类转换还是向客户端转换。

                    4、Point是一个类,即是我们的自定义类。不是系统内置的类型

 1 if(类.class == toType){//说明由客户端向类转换
 2     Point point = new Point();//向哪个类转换,就实例化这个类
 3     String[] str = (String[])value;//因为是由客户端向类转换,所以此时value是一个String[]数组
 4     String[] paramValues = str[0].split(",");
 5     //下面部分代码就是进行转换处理
 6 }
 7 if(String.class == toType){//说明由类向客户端的String转换,此时value是一个对象
 8     Point point = (Point)value;
 9     //下面部分的代码就是进行转换处理;
10 }

 自定义类、转换类、action都创建好之后,要通告struts2转换类在什么地方,并且告诉struts2是对谁进行转换。写一个文件:action文件名-conversion.properties,此属性文件要与action在同一包下,此文件说明对此action中的属性进行转化。

 文件中的内容如下:

point = 转换类名

 内容说明:

1、point是Action中的一个属性,转换类指明所使用哪个转换类对此属性进行转换

2、properties文件中的注释为“#”号,前面加“#”的行是被注释的

类型转换的流程

 1、用户进行请求,根据请求名在struts.xml中寻找Action

 2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好了类型转换,则会去检查在Action同一目录下的 action文件名-conversion.properties 文件。

 3、从文件中找到要转换的属性及其转换类。

 4、然后进入转换类中,在此类中判断转换的方向。我们是先从用户请求开始的,所以这时先进入从字符串到类的转换。返回转换后的对象。流程返回Action。

 5、将返回的对象赋值给Action中的属性,执行Action中的execute()

 6、执行完execute()方法,根据struts.xml的配置转向页面

 7、在jsp中显示内容时,根据页面中的属性名去调用相应的get方法,以便输出

 8、在调用get方法之前,会检查有没有此属性的自定义类型转换。如果有,再次跳转到转换类当中。

 9、在转换类中再次判断转换方向,进入由类到字符串的转换,完成转换后返回字符串。

 10、将返回的值直接带出到要展示的页面当中去展示。

posted @ 2011-09-15 14:39 ply 阅读(466) | 评论 (0)编辑 收藏

2011年9月5日

<?xml version='1.0' encoding='utf-8'?>

  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager-gui"/>
  <role rolename="admin"/>
  <user username="admin" password="admin" roles="admin,manager-gui"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>

 

</tomcat-users>

posted @ 2011-09-05 20:34 ply 阅读(213) | 评论 (0)编辑 收藏

2011年9月3日

tomcat官网

http://tomcat.apache.org/download-60.cgi

免安装版

1.把jdk放在C:\Program Files目录下:

1)在环境变量Path前面添加

C:\Program Files\jdk1.6.0_10\bin;

2)添加环境变量JAVA_HOME

值为 C:\Program Files\jdk1.6.0_10

2.把tomcat安装在C:\Program Files目录下:

1)添加环境变量classpath

值为.;C:\Program Files\jdk1.6.0_10\jre\lib;C:\Program Files\jdk1.6.0_10\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\bootstrap.jar

2)添加环境变量TOMCAT_HOME

值C:\Program Files\Apache Software Foundation\Tomcat 6.0

3)添加环境变量CATALINA_HOME

值C:\Program Files\Apache Software Foundation\Tomcat 6.0

4)添加环境变量CATALINA_BASE

值C:\Program Files\Apache Software Foundation\Tomcat 6.0

验证Tomcat是否安装成功:

1)启动Tomcat;

2)在Ie浏览器中敲入http://localhost:8080/,出来Tomcat首页,说明Tomcat安装成功;

3)写一个jsp页面a.jsp,放到Tomcat的webapps/Root目录下,在Ie浏览器中敲入http://localhost:8080/a.jsp,

如果不报错,说明Tomcat的JDK配置正确

安装版

第一步:下载jdk和tomcat:JDK下载 Tomcat下载
    最新的jdk为1.6.10,tomcat为6.0,建议jdk1.4以上,tomcat4.0以上
第二步:安装和配置你的jdk和tomcat:执行jdk和tomcat的安装程序,然后设置按照路径进行安装即可。
1.安装jdk以后,需要配置一下环境变量,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的jdk安装在C:\Program Files\Java):
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_10
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
path=%JAVA_HOME%\bin 接着可以写一个简单的java程序来测试JDK是否已安装成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}


将上面的这段程序保存为文件名为Test.java的文件。
然后打开命令提示符窗口,cd到你的Test.java所在目录,然后键入下面的命令
javac Test.java
java Test
此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。

2.安装Tomcat后,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat):
CATALINA_HOME:C:\Program Files\Apache Software Foundation\Tomcat 6.0 CATALINA_BASE:C:\Program Files\Apache Software Foundation\Tomcat 6.0
TOMCAT_HOME: C:\Program Files\Apache Software Foundation\Tomcat 6.0
然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;
【注意最新版本的Tomcat中可能没有common这个文件夹了。所以servlet-api.jar应该的路径为
%CATALINA_HOME%\lib\servlet-api.jar;请根据自己的情况自己修改!】
接着可以启动tomcat,在IE中访问http://localhost:8080,如果看到tomcat的欢迎页面的话说明安装成功了。
第三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录;
2.在webapps目录下新建一个目录,起名叫myapp;
3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的;
4.WEB-INF下新建一个文件web.xml,内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>



5.在myapp下新建一个测试的jsp页面,文件名为index.jsp,文件内容如下:

<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>
</center>
</body>
</html>


6.重启Tomcat
7.打开浏览器,输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。

答案补充

第四步:建立自己的Servlet:写入你的第一个Servlet:在你新建的Application myapp/WEB-INF/classes/test目录下新建HelloWorld.javapackage test;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
    public void doGet(HttpServletRequest request,HttpServletResponse response)th
rows ServletException,IOException
   {
    response.setContentType("text/html");

答案补充

PrintWriter out = response.getWriter();
    out.println("<html><head><title>");
    out.println("This is my first Servlet");
    out.println("</title></head><body>");
    out.println("<h1>Hello,World!</h1>");
    out.println("</body></html>");
  
   }
   }


然后照样用javac HelloWorld.java来编译这个文件,如果出现无法import javax.servl
et.*
   那么就是应该把C:\Tomcat\common\lib里面的servlet-api.jar文件拷贝到C:\JDK\jre\lib\ext中,再次编译,就没有问题了!

posted @ 2011-09-03 13:31 ply 阅读(308) | 评论 (0)编辑 收藏

2011年9月2日

1---:java.lang.NoClassDefFoundError: org/apache/struts2/dojo/views/jsp/ui/HeadTag

解决办法:原因缺少了dojo的JAR包,引入即可:struts2-dojo-plugin-2.1.2.jar

The "head" tag renders required JavaScript code to configure Dojo and is required in order to use any of the tags included in the Dojo plugin.

--------------------

If you are planning to nest tags from the Dojo plugin, make sure you set parseContent="false", otherwise each request made by the inner tags will be performed twice.

2---:Unable to load configuration. -bean -jar:file:/F:/Struts2/Struts2/WebRoot/WEB-INF/lib/struts2-core- 2.1.2.jar!/struts-default.xml:46:178

Caused by: Unable to load bean: type:org.apache.struts2.dispatcher.multipart.MultiPartRequest class:org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest -bean -jar:file:/F:/Struts2/Struts2/WebRoot/WEB-INF/lib/struts2-core-2.1.2.jar!/struts-default.xml:46:178

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/RequestContext
解决办法:缺少JAR包,引入commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar即可

3---:No tag "datetimepicker" defined in tag library imported with prefix "s"

原因版本问题:缺少struts-dojo-plugin JAR包,以及HTML的,<HEAD></HEAD>中没有使用<s:head/>标签

If you're using Struts 2.1.x you're probablymissing the>struts-dojo-plugin. Michal's reference below applies to Struts 2.1.xonly. In the lasts versions (since 2.0.9 I guess), all AJAX are in dojo> plugin.
> > So you need toinclude <%@ taglib uri="/struts-dojo-tags" prefix="sx"%>
> > and <sx:head/>
> >( Temp1:
<sx:datetimepicker name="picker" />
Temp2:
<sx:datetimepicker type="time" name="picker" /><br/>
Temp3:
<sx:datetimepicker value="%{'2008-06-08'}" name="picker" />
Temp4:
<sx:datetimepicker value="date" name="picker" />)
> > and call :<sx:datetimepicker .../>

4---:使用TILES框架

If you use the Tiles 2 plugin, check your tiles.xml file(s) to ensure they contain a DOCTYPE.

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"><tiles-definitions>


5---:struts2中不支持EL表达式

Struts2.1 tags do not allow evaluation of JSP EL within their attributes.Instead, Struts2 tags evaluate attribute values as OGNL. Allowing bothexpression languages within the same attribute opens major securityvulnerabilities.


6---文件上传过程中取不到文件名和文件类型,即都取到NULL

原因:如果页面中file的name=“a”则我们ACTION中设置String aContentType,String aFileName;(此两个其实无所谓,关键是SET方法)

setA(File file)(){}; setAContentType(String s){};setAFileName(String name){} 即格式如下:setXContentType() setXFileName().X代表你给FILE取的NAME名字

必须和它相同,固定格式


7---严重: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [struts.valueStack]
2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
严重: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)
2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [org.apache.catalina.jsp_file]

原因:上传文件大小超过预定大小,可以在struts.properties配置文件中设置struts.multipart.maxSize=XXX(XXX为文件大小)


8---配置了文件类型限制后,当传错误类型可以拦截不让用户上传该文件,可是跳转的页面却没有跳转到input配置的错误页面,而是返回

到了success正确页面。

严重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain
《我的打印输出DEBUG语句内容:File:null FlieName:null type:null》即拦截类型成功了
java.lang.NullPointerException
at java.io.FileInputStream.<init>(FileInputStream.java:103)
at com.study.web.util.FileUploadUtil.uploadFile(FileUploadUtil.java:36)
at com.study.web.action.UploadFileAction.execute(UploadFileAction.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)。。。

2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [org.apache.catalina.jsp_file]
2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [struts]
2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Removing file filedata \tmp\upload__5b01657_11a329d4dcf__8000_00000000.tmp

原因及解决办法:在该文件上传Action中只配置了FileUploadInterceptor后缺少配置了defaultStack拦截器.

在ACTION中配置玩defaultStack拦截器后改错误消失。


9---struts.properties中全局配置文件大小,再使用默认FileUploadInterceptor拦截器时候能实现拦截的功能但是后台出现异常。

严重: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (380) exceeds the configured maximum (10)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)

原因:未知。将全局配置中的限制大小去掉,再重新在ACTION中覆盖配置FileUploadInterceptor拦截器设置大小和文件类型限制,可消除异常。


10---多文件上传中,其中一个传被限制的文件如限制aplication/msword(即.doc)文件,允许传文本文件。然而当夹杂在一起传的时候,后台能截获类型错误不可传信息,但是

实际却还是上传成功。

严重: Content-Type not allowed: filedata "upload_4d958287_11a33e76ab9__8000_00000007.tmp" application/msword
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000006.tmp fileName:project.txt fileType:text/plain
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000007.tmp fileName:application base.doc fileType:application/msword
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000008.tmp fileName:zhongqi-bug.txt fileType:text/plain

原因:忘记了继承ActionSupport类。继承后异常消失。


11--文件上传异常,不能创建File文件

Cannot create type class java.io.File from value C:\Documents and Settings\admin\桌面\OrderReporterServiceImp.java - [unknown location]

原因:忘记了在form表单里将enctype设置成文件上传格式:enctype="multipart/form-data"

12--当使用限制文件类型和大小的时候抛出空指针异常

java.lang.NullPointerExceptiondemo.struts2.action.ValidatFileUploadAction.execute(ValidatFileUploadAction.java:71)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)原因:在ACTION中配置了fileUpload拦截器后忘记了配置默认拦截器:defautlStack。注意当ACTION中配置自己的拦截器后需要显示配置默认

拦截器defaultStack


13--在国际化时候抛空指针异常:

16:31:12,812 ERROR [jsp]:253 - Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException at java.text.MessageFormat.applyPattern(MessageFormat.java:414)

at java.text.MessageFormat.<init>(MessageFormat.java:350)
at com.opensymphony.xwork2.DefaultTextProvider.getText(DefaultTextProvider.java:70)

原因:忘记了在struts.xml中配置国际化常量,或者在struts.properties中配置全局国际化常量 struts.custom.i18n.resources=globeMessage


14-- struts action的配置文件加载失败:

Unable to load configuration. - result - file:/D:/Java/apache-tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26

Caused by: No result type specified for result named 'error', perhaps the parent package does not specify the result type? - result - file:/D:/Java/apache-tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:609)

原因:忘记了继承包struts-default


15-- struts action 配置文件注意事项:

1. 别忘记了继承struts-default默认配置包

2.如果配置命名空间,一定要以"/"开始,例如:namespace="/test"

3.每个模块struts action配置文件中都可以配置全局result,global-result 经测试不会冲突,STRTUS会智能寻找该Action请求的

模块STRUTS ACTION配置包

关键字: 警告: no configuration found for the specified action

警告: No configuration found for the specified action: 'ShowMessage' in namespace: ''. Form action defaulting to 'action' attribute's literal value.

解决方法:

经过测试发现,是没有正确使用tag的原因,这种情况下,正确的写法应该是,<s:form name="login" method="post" action="login" >

您是否添加了action这个呢?

posted @ 2011-09-02 23:07 ply 阅读(1487) | 评论 (0)编辑 收藏

2011年9月1日

  实习过程中,需要在Linux环境下配置免安装版本的Tomcat,下面列出详细步骤,希望对大家有帮助。

一、下载免安装版Tomcat

      打开Tomcat主页http://tomcat.apache.org/,下载Tomcat免安装版,我这里下载的是apache-tomcat-7.0.2.tar.gz。

二、配置Java环境变量

      Java的环境变量已经在前几篇文章里有了概述,详细见:http://www.fengwenxuan.com/index.php/red-hat-enterprise-linux/238.html

三、解压Tomcat

      将Tomcat解压缩到/usr/local目录下

      # tar zxvf apache-tomcat-7.0.2.tar.gz 

四、启动Tomcat

      # cd /usr/local/apache-tomcat-7.0.2/bin

      # ./startup.sh

      如果启动成功,shell终端会出现如下提示:

 

      Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.2

      Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.2

      Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.2/temp

      Using JRE_HOME:       /usr/local/jdk1.6.0_21

      如果终端报错,基本上可以肯定是Jdk环境变量没有配置好,仔细在检查一下Jdk环境变量的配置

五、测试Tomcat

      打开火狐浏览器,地址栏输入http://localhost:8080,回车后看到Tomcat的LOGO,表示一切正常。也可以更改Tomcat目录下的conf文件夹,里面有一个server.xml文件,修改成使用80端口,这样浏览器只要输入http://localhost/就可以直接进入你的主页了。

六、停止Tomcat

      # cd /usr/local/apache-tomcat-7.0.2/bin

      # ./shutdown.sh

七、设置开机自动启动Tomcat

 

方法一:

在/usr/local/apache-tomcat-7.0.2/bin/startup.sh 为:

JAVA_HOME=/home/fwx/jdk1.6.0_14

CLASSPATH=.:$JAVA_HOME/lib/tools.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH

export CATALINA_HOME=/usr/local/apache-tomcat-7.0.2
/usr/local/tomcat/bin/catalina.sh start

 

在/etc/rc.d/rc.local中加入:
/usr/local/apache-tomcat-7.0.2/bin/startup.sh


方法二:
1、把下面的代码保存为tomcat文件,并让它成为可执行文件 chmod 755 tomcat.
#!/bin/bash
#
# fengwx0413@163.com
# /etc/rc.d/init.d/tomcat
# init script for tomcat precesses
#
# processname: tomcat
# description: tomcat is a j2se server
# chkconfig: 2345 86 16
# description: Start up the Tomcat servlet engine.

if [ -f /etc/init.d/functions ]; then
        . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ]; then
        . /etc/rc.d/init.d/functions
else
        echo -e "/atomcat: unable to locate functions lib. Cannot continue."
        exit -1
fi

RETVAL=$?
CATALINA_HOME="/usr/local/apache-tomcat-7.0.2"

case "$1" in
start)
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
            $CATALINA_HOME/bin/startup.sh
        fi
        ;;
stop)
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
            $CATALINA_HOME/bin/shutdown.sh
        fi
        ;;
*)
        echo $"Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit $RETVAL

2、将tomcat文件拷贝到/etc/init.d/下,并运行:chkconfig --add tomcat

3、在apache-tomcat-7.0.2/bin/catalina.sh文件中加入以下语句:
export JAVA_HOME=/home/fwx/jdk1.6.0_14
export CATALINA_HOME=/usr/local/apache-tomcat-7.0.2

export CATALINA_BASE=/usr/local/apache-tomcat-7.0.2
export CATALINA_TMPDIR=/usr/local/apache-tomcat-7.0.2/temp

启动tomcat: service tomcat start
停止tomcat: service tomcat stop 

posted @ 2011-09-01 23:06 ply 阅读(11350) | 评论 (0)编辑 收藏

2011年8月22日

关于getInitParameter()的调用
关于getInitParameter()的调用        
getInitParameter()方法是在GenericServlet接口中新定义的一个方法,用来调用初始化在web.xml中存放的参量。
在web.xml配置文件中一个servlet中参量的初始化是使用

<init-param>

<param-name>name</param-name>

<param-value>zhangsan</param-value>

</init-param>

来实现的。这里的参量只对这个servlet可用。

 

如果通过在web.xml中的ServletContext上下文中定义参量,那么整个web应用程序中的servlet都可调用,web.xml中的格式为:

<context-param>

<param-name>test</param-name>

<param-value>Is it me</param-value>

< context -param>

 

 

调用<init-param>中的参量:

一般我们写servlet都是用HttpServlet类来写,它是实现了GenericServlet接口,所以它就有getInitParameter()方法。调用格式为:

String name = getInitParameter(“name”); 或

String name = getServletConfig().getInitParameter(“name”);

 

调用<context-param>中的参量:

调用格式为:

String name =getServletContext(). getInitParameter(“name”); 或

String name = getServletConfig().getServletConfig().getInitParameter(“name”);

 

注意:<context-param>中定义的参数在Jsp中也能调用


posted @ 2011-08-22 01:44 ply 阅读(2841) | 评论 (1)编辑 收藏