??xml version="1.0" encoding="utf-8" standalone="yes"?> 遇到了一些问?如hibernate延迟加蝲错误Q这都是老掉牙的问题了,一看就知道加个lazy=flaseOK了。想不到快要完成了又遇到了新的问题,JSONd@环,实在让h郁闷。异常如下: net.sf.json.JSONException: There is a cycle in the hierarchy! 仔细查了一下发现是hibernated键关联的错,后来想下json源代码下来看Q发现大费周章都没搞到json源码Q还是老办法反~译瞅瞅Q发现JSONArrayҎ判断取得的不同类型调用相应的ҎQ?br /> if (object instanceof Collection) 而我从hibernate那得到的是listQ所以去调用了_fromCollectionҎQ而里面的Ҏ发现一个问题:该方法会不断的拆开实体属性,直到没有为止Q而我的ContactGroup里有两个属性用于自w关?br /> private Set contactGroups = new HashSet(0); public interface PropertyFilter public abstract boolean apply(Object obj, String s, Object obj1); 也就是说我可以通过q个Ҏqo掉List里的相应属性,只要让它q回true可qo掉,……Q有Ҏ……我们重写一下这个方法: JsonConfig cfg = new JsonConfig(); hibernate产生的实体bean中的contactGroups和contactGroupPersonsqo掉就OK了! 然后调用JSONArray.fromObject(mychildren,cfg); mychildren是hibernateq回的list?/p> 搞了一下午Q参考网l的资料Q解决问题了Q?/p> ------------------------------------- MyEclipse 快捷?(ALT+CTRL) Alt+CTRL+↓ 复制当前行到下一?复制增加) --------------------------------------------
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
>
return _fromCollection((Collection)object, jsonConfig);
private Set contactGroupPersons = new HashSet(0);
也就是说d键自w关联的是个d@环,那怎么才能不让他出现这U情况呢Q应该有个配|的参数后者终止@环的地方吧,查看?br />玎ͼjsonConfigQ呵呵,config应该是配|参数吧Q参看JsonConfig看见巨多的属性,有点晕PropertyFilter
Q不提了Q看了老半天,发现了一个属性PropertyFilterQPropertyFilter 是一个interfaceQ代码如下:
{
}
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;
}
}
});List<ShoppingCart> listCarts = sCartServiceImpl
2 .ShoppingCartTable(shoppingCart);
3 // 先过滤对set集合的拆?/span>
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
MyEclipse
快捷?(CTRL)
-------------------------------------
Ctrl+1 快速修?br />Ctrl+D:
删除当前?
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某?nbsp;
Ctrl+O 快速显C?OutLine
Ctrl+T 快速显C当前类的承结?
Ctrl+W 关闭当前Editer
Ctrl+K 快速定位到下一?
Ctrl+E
快速显C当前Editer的下拉列?br />Ctrl+J
正向增量查找(按下Ctrl+J?你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显C没有找C,)
Ctrl+Z q回C改前的状?
Ctrl+Y 与上面的操作相反
Ctrl+/ 注释当前?再按则取消注?
Ctrl+D删除当前行?br />Ctrl+Q跛_最后一ơ的~辑?br />Ctrl+M切换H口的大?
Ctrl+I格式化激zȝ元素Format
Active
Elements?br />Ctrl+F6切换C一个Editor
Ctrl+F7切换C一个Perspective
Ctrl+F8切换C一个View
------------------------------------------
MyEclipse
快捷?(CTRL+SHIFT)
------------------------------------------
Ctrl+Shift+E
昄理当前打开的所有的View的管理器(可以选择关闭,Ȁzȝ操作)
Ctrl+Shift+/ 自动注释代码
Ctrl+Shift+\自动取消已经注释的代?
Ctrl+Shift+O 自动引导cd
Ctrl+Shift+J
反向增量查找(和上条相?只不q是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X
把当前选中的文本全部变为小?
Ctrl+Shift+Y 把当前选中的文本全部变为小?
Ctrl+Shift+F
格式化当前代?br />Ctrl+Shift+M(先把光标攑֜需导入包的cd? 作用是加Import语句
Ctrl+Shift+P
定位到对于的匚wW?譬如{}) (从前面定位后面时,光标要在匚wW里?后面到前?则反?
Ctrl+Shift+F格式化文件Format
Document?br />Ctrl+Shift+O作用是缺的Import语句被加入,多余的Import语句被删除?
Ctrl+Shift+S保存所有未保存的文件?br />Ctrl+Shift+/ 在代码窗口中是这U?*~*/注释Q在JSP文gH口中是
<!--~-->?
Shift+Ctrl+Enter
在当前行插入I(原理同上?
-----------------------------------------
MyEclipse
快捷?(ALT)
-----------------------------------------
Alt+/ 代码助手完成一些代码的插入
Q自动显C提CZ?br />Alt+↓ 当前行和下面一行交互位|?特别实用,可以省去先剪?再粘贴了)
Alt+↑ 当前行和上面一行交互位|?同上)
Alt+← 前一个编辑的面
Alt+→ 下一个编辑的面(当然是针对上面那条来说了)
Alt+Enter
昄当前选择资源(工程,or 文g or文g)的属?
Alt+CTRL+↑
复制当前行到上一?复制增加)
-------------------------------------------
MyEclipse
快捷?(ALT+SHIFT)
-------------------------------------------
Alt+Shift+R
重命?
Alt+Shift+M 抽取Ҏ
Alt+Shift+C 修改函数l构(比较实用,有N个函数调用了q个Ҏ,修改一ơ搞?
Alt+Shift+L 抽取本地变量
Alt+Shift+F 把Class中的local变量变ؓfield变量
Alt+Shift+I
合ƈ变量
Alt+Shift+V Ud函数和变?br />Alt+Shift+Z 重构的后悔药(Undo) Shift+Enter
在当前行的下一行插入空?q时鼠标可以在当前行的Q一位置,不一定是最?
Alt+Shift+O(或点dh中的Toggle Mark
Occurrences按钮) 当点L个标记时可本页面中其他地方的此标记黄色凸显Qƈ且窗口的双框会出现白色的方块,点击此方块会跛_此标记处?
下面的快捷键是重构里面常用的,本hp己喜Ƣ且常用的整理一??一般重构的快捷键都是Alt+Shift开头的?
MyEclipse 快捷?6)
--------------------------------------------
F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标Ud时Tooltipq会昄即Show
Tooltip Description?
F3跛_声明或定义的地方?
F5单步调试q入函数内部?
F6单步调试不进入函数内部,如果装了金山词霸2006则要?#8220;取词开?#8221;的快捷键Ҏ其他的?
F7由函数内部返回到调用处?
F8一直执行到下一个断炏V?
]]>
size是list的个?img src ="http://www.aygfsteel.com/peiliangye/aggbug/365370.html" width = "1" height = "1" />
]]>
假设现在有一个父cFather,它里面的变量需要占?M内存.有一个它的子cSon,它里面的变量需要占?.5M内存.
现在通过代码来看看内存的分配情况:
Father f = new Father();//pȝ分?M内存.
Son s = new Son();//pȝ分?.5M内存.
因ؓ子类中有一个隐藏的引用super会指向父cd?所以在实例化子cM前会先实例化一个父c?也就是说会先执行父类的构造函?
׃s中包含了父类的实?所以s可以调用父类的方?
Son s1 = s;//s1指向?.5M的内?(可以理解为就是:子类引用指向子类对象)
Father f1 = (Father)s;//q时f1会指向那1.5M内存中的1M内存,x?f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方?存储?M内存?,而不能调用子cȝҎ(存储?.5M内存?.
Son s2 = (Son)f;//q句代码q行时会报ClassCastException.因ؓf中只?M内存,而子cȝ引用都必要?.5M的内?所以无法{?
Son s3 = (Son)f1;//q句可以通过q行,q时s3指向?.5M的内?׃f1是由s转换q来?所以它是有1.5M的内存的,只是它指向的只有1M内存.
CZQ?br />
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(); //q个调用会报错!
}
}
1 .如果你想实现多?那么必须有三个条?父类引用,子类对象,Ҏ覆盖
你这里如果FathorcL一个show()Ҏ,那么形成Ҏ覆盖,那么此时可以这么写:obj.show(),此刻形成了多?
2. 没有Ҏ覆盖,那你q里只能解释为父cd用去讉K一个子cȝҎ,当然,父类引用没有q么大范围的权限,当然会报?
PS:多态实际上是一U机?在编译时?会生成一张虚拟表,来记录所有覆盖的Ҏ,没有被覆盖的Ҏ是不会记录到q张表的.
若一个父cd用调用了没有覆盖的子cL?那么是不W合该表?那么~译时刻׃报错.
在执行程序的时?虚拟Z去这张虚拟表中找覆盖的方?比如引用中实际上存的是一个子cd象引?那么׃L子类中的相应的覆盖的Ҏ来执?br />
定义一个父cȝ型的引用指向一个子cȝ对象既可以用子cd大的功能Q又可以抽取父类的共性?/p>
所以,父类cd的引用可以调用父cM定义的所有属性和ҎQ而对于子cM定义而父cM没有的方法,它是无可奈何的;
同时Q父cM的一个方法只有在在父cM定义而在子类中没有重写的情况下,才可以被父类cd的引用调用;
对多态的理解Q多态体现在l承中,所以需要有l承关系Q然后子c要重写父类ҎQ最后父cL向子c(父类本nh一些方法,q些Ҏ被子c重写了Q但调用q些ҎӞ会自动调子类重写的那些)?/p>
多态具体表现在重写和重载,多态就是类的多U表现方式,比如同名不同参,子类重写父类?br />
看下面这D늨序:
class Father{
public void func1(){
func2();
}
//q是父类中的func2()ҎQ因Z面的子类中重写了该方?/p>
//所以在父类cd的引用中调用Ӟq个Ҏ不再有?/p>
//取而代之的是将调用子类中重写的func2()Ҏ
public void func2(){
System.out.println("AAA");
}
}
class Child extends Father{
//func1(int i)是对func1()Ҏ的一个重?/p>
//׃在父cM没有定义q个ҎQ所以它不能被父cȝ型的引用调用
//所以在下面的mainҎ中child.func1(68)是不对的
public void func1(int i){
System.out.println("BBB");
}
//func2()重写了父cFather中的func2()Ҏ
//如果父类cd的引用中调用了func2()ҎQ那么必然是子类中重写的q个Ҏ
public void func2(){
System.out.println("CCC");
}
}
public class PolymorphismTest {
public static void main(String[] args) {
Father child = new Child();
child.func1();//打印l果会是什么?
}
}
上面的程序是个很典型的多态的例子。子cChildl承了父cFatherQƈ重蝲了父cȝfunc1()ҎQ重写了父类的func2()Ҏ。重载后的func1(int
i)和func1()不再是同一个方法,׃父类中没有func1(int i)Q那么,父类cd的引用child׃能调用func1(int
i)Ҏ。而子c重写了func2()ҎQ那么父cȝ型的引用child在调用该Ҏ时将会调用子cM重写的func2()?/p>
那么该程序将会打印出什么样的结果呢Q?/p>
很显Ӟ应该?#8220;CCC”?/p>
变量是不存在重写覆盖的!
public class A { int a = 1; }
public class B extends A { int a = 2Q?}
试c里调用了这个方法void compare(){
if(super.a == this.a)
System.out.println("not overrided");
else
System.out.println("overrided");}
控制台出来的是overrided
cM的属性是没有多态性的Q即你在引用上面使用属性时Q系l只会去扑ּ用的静态类型中的那个属性,而与它的实际cd无关?/p>
静态方法也是没有多态性的?/p>
1.从客房端的字W串到自定义cd的{换?br />
2.面输出时从自定义类型到字符串的转换?/p>
在struts2中分两种转换Q一U是局部{换,另一U是全局cd转换。具体{换的实施需要一个{换类和一个自定义cR我们先来看局部类型{换?br />
局部类型{?/strong>
对于int{基本类型,struts2会自动完成类型{换,像ageq龄Q在输入面是String型的Q到Action后会自动转换成int型。而如果是转换成对象类型的话,需要自定义cd转换。这样就需要一个自定义cR要定义一个{换类Q需要?span style="color: #0000ff">ognl.DefaultTypeConverterq个c?Q这是个cd转换的类。代码如下:
1 public class PointConverter extends DefaultTypeConverter{
2 public Ojbect convertValue(Map context,Object value,Class tyType){//重写ҎҎҎ说明Q?、Map context ——应用上正?/p>
2、Object value ——是要q行cd转换的倹{如果是从客L到自定义的类Q那么value是个字符丌Ӏ注意:它是一个字W串的数l。因为:在表单中可以有多个文本域Q而所有文本域可以是同一个名字,q时是考虑通用性而作为数l处理的。如果只有一个文本域Q则数组只有一个元素,下标?。注Qjsp的servlet中接收多个相同名字的输入域用request.getParameterValues()Ҏ?/p>
3、class toType ——来指定向?一U类型{换,x向类转换q是向客L转换?/p>
4、Point是一个类Q即是我们的自定义类。不是系l内|的cd
自定义类、{换类、action都创建好之后Q要通告struts2转换cd什么地方,q且告诉struts2是对谁进行{换。写一个文Ӟaction文g?conversion.properties,此属性文件要与action在同一包下Q此文g说明Ҏaction中的属性进行{化?br />
文g中的内容如下Q?/p>
point = 转换cd
内容说明Q?/p>
1、point是Action中的一个属性,转换cL明所使用哪个转换cd此属性进行{?
2、properties文g中的注释?#8220;#”P前面?#8220;#”的行是被注释?/p>
cd转换的流E?/span>
1、用戯行请求,Ҏh名在struts.xml中寻找Action
2、在Action中,Ҏh域中的名字去L对应的setҎ。找到后在赋g前会查这个属性有没有自定义的cd转换。没有的话,按照默认q行转换Q如果某个属性已l定义好了类型{换,则会L查在Action同一目录下的 action文g?conversion.properties 文g?br />
3、从文g中找到要转换的属性及其{换类?br />
4、然后进入{换类中,在此cM判断转换的方向。我们是先从用户h开始的Q所以这时先q入从字W串到类的{换。返回{换后的对象。流E返回Action?/p>
5、将q回的对象赋值给Action中的属性,执行Action中的execute()
6、执行完execute()ҎQ根据struts.xml的配|{向页?/p>
7、在jsp中显C内ҎQ根据页面中的属性名去调用相应的getҎQ以便输?br />
8、在调用getҎ之前Q会查有没有此属性的自定义类型{换。如果有Q再ơ蟩转到转换cd中?/p>
9、在转换cM再次判断转换方向Q进入由cd字符串的转换Q完成{换后q回字符丌Ӏ?br />
10、将q回的值直接带出到要展C的面当中dC?/p>
</tomcat-users>
http://tomcat.apache.org/download-60.cgi
免安装版
1.把jdk攑֜C:\Program Files目录?
1)在环境变量Path前面d
C:\Program Files\jdk1.6.0_10\bin;
2Q添加环境变量JAVA_HOME
gؓ C:\Program Files\jdk1.6.0_10
2.把tomcat安装在C:\Program Files目录?
1Q添加环境变量classpath
gؓ.;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)d环境变量TOMCAT_HOME
值C:\Program Files\Apache Software Foundation\Tomcat 6.0
3)d环境变量CATALINA_HOME
值C:\Program Files\Apache Software Foundation\Tomcat 6.0
4)d环境变量CATALINA_BASE
值C:\Program Files\Apache Software Foundation\Tomcat 6.0
验证Tomcat是否安装成功Q?/p>
1)启动TomcatQ?/p>
2)在Ie览器中敲入http://localhost:8080/,出来Tomcat首页Q说明Tomcat安装成功Q?/p>
3)写一个jsp面a.jsp,攑ֈTomcat的webapps/Root目录下,在Ie览器中敲入http://localhost:8080/a.jsp,
如果不报错,说明Tomcat的JDK配置正确
安装?
W一步:下蝲jdk和tomcatQJDK下蝲 Tomcat下蝲
最新的jdk?.6.10Qtomcat?.0Q徏议jdk1.4以上Qtomcat4.0以上
W二步:安装和配|你的jdk和tomcatQ执行jdk和tomcat的安装程序,然后讄按照路径q行安装卛_?br />1.安装jdk以后Q需要配|一下环境变量,在我的电?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的jdk安装在C:\Program Files\JavaQ:
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_10
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Q?;一定不能少Q因为它代表当前路径)
path=%JAVA_HOME%\bin 接着可以写一个简单的javaE序来测试JDK是否已安装成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}
上面的q段E序保存为文件名为Test.java的文件?
然后打开命o提示W窗口,cdC的Test.java所在目录,然后键入下面的命?
javac Test.java
java Test
此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印句话Q你需要仔l检查一下你的配|情c?
2.安装Tomcat后,在我的电?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的tomcat安装在c:\tomcatQ:
CATALINA_HOMEQC:\Program Files\Apache Software Foundation\Tomcat 6.0 CATALINA_BASEQC:\Program Files\Apache Software Foundation\Tomcat 6.0
TOMCAT_HOME: C:\Program Files\Apache Software Foundation\Tomcat 6.0
然后修改环境变量中的classpathQ把tomat安装目录下的common\lib下的servlet.jarq加到classpath中去Q修改后的classpath如下Q?
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;
【注意最新版本的Tomcat中可能没有commonq个文g夹了。所以servlet-api.jar应该的\径ؓ
%CATALINA_HOME%\lib\servlet-api.jar;h据自q情况自己修改Q?br />接着可以启动tomcatQ在IE中访问http://localhost:8080Q如果看到tomcat的欢q页面的话说明安装成功了?
W三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录Q可以看到ROOTQexamples, tomcat-docs之类Tomcat自带的的目录Q?
2.在webapps目录下新Z个目录,起名叫myappQ?
3.myapp下新Z个目录WEB-INFQ注意,目录名称是区分大写的;
4.WEB-INF下新Z个文件web.xmlQ内容如下:
<?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下新Z个测试的jsp面Q文件名为index.jspQ文件内容如下:
<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>
</center>
</body>
</html>
6.重启Tomcat
7.打开览器,输入http://localhost:8080/myapp/index.jsp 看到当前旉的话说明成功了?/span>
{案补充
W四步:建立自己的ServletQ写入你的第一个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文g拯到C:\JDK\jre\lib\ext中,再次~译Q就没有问题了!
解决办法Q原因缺了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
解决办法Q缺JAR包,引入commons-fileupload-1.2.1.jarQcommons-io-1.3.2.jar卛_
3---:No tag "datetimepicker" defined in tag library imported with prefix "s"
原因版本问题Q缺struts-dojo-plugin JAR包,以及HTML?<HEAD></HEAD>中没有?lt;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---文g上传q程中取不到文g名和文gcdQ即都取到NULL
原因Q如果页面中file的name=“a”则我们ACTION中设|String aContentType,String aFileName;(此两个其实无所谓,关键是SETҎ)
setA(File file)(){}; setAContentType(String s){};setAFileName(String name){} x式如下:setXContentType() setXFileName().X代表你给FILE取的NAME名字
必须和它相同Q固定格?br />
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]
原因Q上传文件大超q预定大,可以在struts.properties配置文g中设|struts.multipart.maxSize=XXXQXXX为文件大)
8---配置了文件类型限制后Q当传错误类型可以拦截不让用户上传该文gQ可是蟩转的面却没有蟩转到input配置的错误页面,而是q回
Csuccess正确面?/p>
严重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain
《我的打印输出DEBUG语句内容:File:null FlieName:null type:null》即拦截cd成功?br />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)。。?/p>
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
原因及解军_法:在该文g上传Action中只配置了FileUploadInterceptor后缺配|了defaultStack拦截?
在ACTION中配|玩defaultStack拦截器后攚w误消失?br />
9---struts.properties中全局配置文g大小Q再使用默认FileUploadInterceptor拦截器时候能实现拦截的功能但是后台出现异常?/p>
严重: 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)
原因Q未知。将全局配置中的限制大小LQ再重新在ACTION中覆盖配|FileUploadInterceptor拦截器设|大和文gcd限制Q可消除异常?br />
10---多文件上传中Q其中一个传被限制的文g如限制aplication/msword(?doc)文gQ允怼文本文g。然而当Ҏ在一起传的时候,后台能截L型错误不可传信息Q但?/p>
实际却还是上传成功?/p>
严重: 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
原因Q忘Cl承ActionSupportcR承后异常消失?br />
11--文g上传异常Q不能创建File文g
Cannot create type class java.io.File from value C:\Documents and Settings\admin\桌面\OrderReporterServiceImp.java - [unknown location]
原因Q忘C在form表单里将enctype讄成文件上传格式:enctype="multipart/form-data"
12--当用限制文件类型和大小的时候抛出空指针异常
java.lang.NullPointerExceptiondemo.struts2.action.ValidatFileUploadAction.execute(ValidatFileUploadAction.java:71)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)原因Q在ACTION中配|了fileUpload拦截器后忘记了配|默认拦截器QdefautlStack。注意当ACTION中配|自q拦截器后需要显C配|默?/p>
拦截器defaultStack
13--在国际化时候抛I指针异常:
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)
原因Q忘C在struts.xml中配|国际化帔RQ或者在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)
原因Q忘Cl承包struts-default
15-- struts action 配置文g注意事项Q?/p>
1. 别忘Cl承struts-default默认配置?/p>
2.如果配置命名I间Q一定要?/"开始,例如Qnamespace="/test"
3.每个模块struts action配置文g中都可以配置全局resultQglobal-result l测试不会冲H,STRTUS会智能寻找该Actionh?/p>
模块STRUTS ACTION配置?/p>
关键? 警告: 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.
解决ҎQ?/p>
l过试发现Q是没有正确使用tag的原因,q种情况下,正确的写法应该是Q?lt;s:form name="login" method="post" action="login" >
您是否添加了actionq个呢?
打开Tomcat主页http://tomcat.apache.org/Q下载Tomcat免安装版Q我q里下蝲的是apache-tomcat-7.0.2.tar.gz?/p>
二、配|Java环境变量
Java的环境变量已l在前几文章里有了概述Q详l见Q?a >http://www.fengwenxuan.com/index.php/red-hat-enterprise-linux/238.html
三、解压Tomcat
Tomcat解压~到/usr/local目录?/p>
# tar zxvf apache-tomcat-7.0.2.tar.gz
四、启动Tomcat
# cd /usr/local/apache-tomcat-7.0.2/bin
# ./startup.sh
如果启动成功Qshelll端会出现如下提C:
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
如果l端报错Q基本上可以肯定是Jdk环境变量没有配置好,仔细在检查一下Jdk环境变量的配|?/p>
五、测试Tomcat
打开火狐览器,地址栏输入http://localhost:8080Q回车后看到Tomcat的LOGOQ表CZ切正常。也可以更改Tomcat目录下的conf文g夹,里面有一个server.xml文gQ修Ҏ使用80端口Q这h览器只要输入http://localhost/可以直接进入你的主了?/p>
六、停止Tomcat
# cd /usr/local/apache-tomcat-7.0.2/bin
# ./shutdown.sh
七、设|开动启动Tomcat
Ҏ一Q?/p>
?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文gQƈ让它成ؓ可执行文?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文g拯?etc/init.d/下,q运行:chkconfig --add tomcat
3、在apache-tomcat-7.0.2/bin/catalina.sh文g中加入以下语句:
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
启动tomcatQ?service tomcat start
停止tomcat: service tomcat stop
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
来实现的。这里的参量只对q个servlet可用?/font>
如果通过在web.xml中的ServletContext上下文中定义参量Q那么整个web应用E序中的servlet都可调用Qweb.xml中的格式为:
<context-param>
<param-name>test</param-name>
<param-value>Is it me</param-value>
< context -param>
调用<init-param>中的参量Q?/font>
一般我们写servlet都是用HttpServletcL写,它是实现了GenericServlet接口Q所以它有getInitParameterQ)Ҏ。调用格式ؓQ?/font>
String name = getInitParameter(“name”); ?/font>
String name = getServletConfig().getInitParameter(“name”);
调用<context-param>中的参量Q?/font>
调用格式为:
String name =getServletContext(). getInitParameter(“name”); ?/font>
String name = getServletConfig().getServletConfig().getInitParameter(“name”);
注意Q?lt;context-param>中定义的参数在Jsp中也能调?/font>