网站运营
位置:首页>> 网站运营>> Godaddy共享主机JSP/Java支持的体验经历 Godaddy 超市

Godaddy共享主机JSP/Java支持的体验经历 Godaddy 超市

 来源:asp之家 发布时间:2010-04-07 13:17:00 

标签:Godaddy,主机,JSP,Java

最近体验了一下Godaddy共享主机上的Jsp/Java支持,感觉相当糟糕。竟然不支持struts的应用,至今尚未完全搞明白Godaddy是如何设置,达到不支持某一个框架的。现在说说我的体验经历,希望有志同道合者一起讨论,共同寻找解决办法。

最初的想法是,测试一下Godaddy对Jsp/Java的支持如何,希望能把自己写的一些小的应用放在上面。 鉴于自己对struts比较熟悉,于是用struts写了个Hello World,简简单单的一个action,为了能和Godaddy的环境尽可能的一致,特地下了个5.0.28的tomcat(godaddy是5.0.27,没找到这个版本的)测试了一下,一切ok。

于是把这个helloworld打成war包,上传到主机,等待……(godaddy的共享主机的tomcat每天夜里1点左右重启,是北京时间的下午4点左右)终于蛋孵化出来了,于是输入url测试,出现报错,说是servlet action not found之类的(具体记不清了)。第一次就出现报错我并不惊讶,因为是第一次,可能哪里忽略了(真正令我惊讶的是后来经过不断测试,发现问题依然存在,网上搜索也只见问题,并没有哪里解决了的), 于是我多写了几个页面,有带action的,有不带action的,测试测试,结果发现不带action的jsp是可以显示的,而带action的jsp就报错。难道是web.xml哪里写错了,导致配置没有读入?不对啊,本地测试都可以的,没道理godaddy就不行啊。其间,又把web.xml的相关配置init parameter,load on startup修改了一下,测试还是老样子。(每次修改核心文件都要等下次tomcat重启,佩服自己真有耐心)

我曾经看到有人说godaddy的共享主机不支持struts,但是我想只要是同样的tomcat(虽然我的版本与他有细微差异),哪有不支持struts的。我于是我发邮件给godaddy的support,答复大概说共享的linux主机不支持struts,如果要支持请都买独立主机(我晕)。

godaddy到底是通过什么来限制struts的呢?我们有什么办法可以绕过这个限制呢?

首先,我想到的是tomcat启动时,会从WEB-INF/lib里的jar文件加载class,是不是godaddy在tomat的设置里屏蔽了struts有关的jar包,经过检测(起初是在jsp里通过Class.forName()来检测,后来发现可以通过从application中获取相应attribute可以得知加载了哪些jar),发现并没有屏蔽,jar文件都加载了。既然没有屏蔽jar(后来想想其实jar文件的屏蔽检测是没必要的,如果jar文件没有加载,那应该会有class not found的错误),那么会不会是屏蔽了struts-config.xml呢,于是把struts-config改了个名字,测试还是不行。

现在记不清在哪一步改动之后,servlet action not found之类的错误没了,换成了module “null”之类的错误。 既然也不是struts-config引起的,那就剩下servlet-class org.apache.struts.action.ActionServlet了,是不是屏蔽了这个类呢?于是我写了一个类,继承自ActionServlet,并且覆盖了init(),doGet()方法,加了一些代码来debug。代码如下:
@Override
?
public void init() throws ServletException {
?
initConfig();
?
Trace.add("Servlet init==after init config:" + config);
?
try {
?
super.init();
?
} catch (Exception e) {
?
Trace.add("servlet init exception:" + e.toString()
?
+ "
===cause:" + e.getCause().toString());
?
throw new ServletException(e);
?
}
?
}
?
@Override
?
public void doGet(HttpServletRequest request, HttpServletResponse response)?
throws IOException, ServletException {
?
Trace.add("do get:" + request.getRequestURL());
?
try {
?
super.doGet(request, response);
?
} catch (ServletException e) {
?
Trace.add("do get Exception:" + e.toString());
?
throw e;
?
} catch (IOException ioe) {
?
Trace.add("do get Exception:" + ioe.toString());
?
throw ioe;
?
}
?
}
?
protected void initConfig() {
?
config = "/WEB-INF/struts-config.xml";
?
}

其中Trace是一个单例类,为了记录一些debug信息,以便得知执行到哪一步了。initConfig()是为了测试一下在这里指定struts-config。

搞好之后上传,等待,测试,这次发现module “null”之类的错误不见了,出现一个空白页面,action的执行还是不成功,也就是说struts-config的配置还是没有成功读取。 我又在一个jsp中输出Trace中记录的内容,发现只有一行:Servlet init==after init config:/WEB-INF/struts-config.xml,也就是说在进入struts的ActionServlet的init()方法之后,就如同飞越大西洋的法国飞机一样,销声匿迹了。为什么会这样呢?即使报错了,trace里应该有记录啊,但是现在没有,那就是坠入init()这个大西洋了。我可是catch了Exception的,难道被内部catch了没有抛出来?不应该啊, 通过分析application的attribute,也就是servlet context的attribute,发现里面有org.apache.struts.action.SERVLET_MAPPING=*.do,这个attribute是在init()方法里调用initServlet()方法的最后一段代码执行时set进去的。那就是说initServlet之后的执行出问题了,那是在哪儿呢?还是说,上面的attribute在容器加载web.xml时就设置了,这里的设置是冗余的,那么struts的ActionServlet里的init()方法根本没执行?

目前,我就测试到了上面那一步,那么,可以看出是servlet没有初始化,导致struts-config中定义的配置没有加载。

这就是我到目前为止的经历,不可谓不艰辛。可是问题依然还在,接下来我还会继续研究,欢迎讨论。

0
投稿

猜你喜欢

手机版 网站运营 asp之家 www.aspxhome.com