在部署Web工程时遇到的一个小问题,及解决方法

 在部署客户发来的Web项目的时候遇到了很闹心的问题:

先把客户工程的目录结构写下来。

-Folder
 |---.settings
 |  -build
 |    +classes
 |  -src
 |    +mycompany
 |     resources
 |  -WebContent
 |    css
 |    image
 |    js
 |    META-INF
 |   +pages
 |   -WEB-INF
 |     +lib
 |     +tags
 |      struts-bean.tld
 |      struts-config.xml
 |      struts-html.tld
 |      struts-logic.tld
 |      tiles-defs.xml
 |      validation.xml
 |      validator-rules.xml
 |      web.xml
 |    test.html

 

部署过程大概是这样的:

1.新建动态Web工程,命名为myproj 下一步,下一步,确定。

2.导入客户的工程。在刚刚新建的myproj工程-右键-导入- 按提示导入上面的Folder目录。

3.设定JDK,将TomcatLib导入到工程中。

4.myproj工程-右键-Tomcat ---设为TOMCAT项目
Context名:/myproj       (这样访问站点的时候就可以键入http://localhost:8080/myproj/XXXXX.html)
作为Web应用程序根目录的子目录(可选):/WebContent (如果src目录和WEB-INF目录是同级目录,那这里可写成'/')

5.clean,rebuild

6.启动Tomcat服务器

7.打开Webbrowser 键入http://localhost:8080/myproj/test.html 静态页面正常显示。

8.在画面中点login按钮,在正常情况下它会走loginAction,但是它没有走,而且抛异常:

javax.servlet.ServletException
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
 at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at net.skirnir.catalina.servlets.MultipartFilter.doFilter(MultipartFilter.java:69)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at mycompany.co.portal.common.server.authentication.LoginFilter.doFilter(LoginFilter.java:209)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
 at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
 at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:652)
 at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1203)
 at java.lang.Thread.run(Thread.java:595)
javax.servlet.ServletException
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
 at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at net.skirnir.catalina.servlets.MultipartFilter.doFilter(MultipartFilter.java:69)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at mycompany.co.portal.common.server.authentication.LoginFilter.doFilter(LoginFilter.java:209)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
 at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
 at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:652)
 at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1203)
 at java.lang.Thread.run(Thread.java:595)


我在loginAction中的execute方法中第一行加了断点,但是没有反应。异常照样抛。
客户说他们的代码绝对没有问题,也就是说struts-config.xml和web.xml中的配置没什么问题。
不过似乎struts框架根本就没有跑起来。什么原因?

问题解决:

直到现在我还不敢相信问题的解决会如此的简单。

1.myproj工程-右键-属性-javaBuildPath中的[默认输出路径]选为/myproj/WebContent/WEB-INF/classes
(原来这里的值为/myproj/build/classes)

2.rebuild.

3.进入页面,LOGIN,成功显示!问题解决!

问题分析:

看来问题大概是在[默认输出路径]上面。

为了搞清问题的原因,我做了如下实验:

1. /myproj/WebContent/WEB-INF/下的classes文件夹删除,并把[默认输出路径]设为[/myproj/build/classes]
  编译,运行。NG。

2. 把[默认输出路径]设为[/myproj/WebContent/WEB-INF/classes] 编译,运行OK。

3.把[默认输出路径]设回为[/myproj/build/classes],并且保留/myproj/WebContent/WEB-INF/下的classes文件夹
编译,运行。OK。

4.把[默认输出路径]设回为[/myproj/build/classes],并且删除/myproj/WebContent/WEB-INF/下的classes文件夹
编译,运行。NG。

[默认输出路径]的设定一般保存在工程下的.classpath文件中,里面有一行是:

<classpathentry kind="output" path="build/classes"/>

把里面的path设为[/myproj/WebContent/WEB-INF/classes]就行了。

问题是解决了。但是还是搞不清楚其根本原因。为什么编译好的字节码文件必须放到WEB-INF下的classes文件夹里
是不是Tomcat运行Web程序的时候只认/WEB-INF/classes呢?如果换成weblogic又会是什么结果呢?看来菜鸟还是菜鸟,还有待老鸟们赐教。

我想解决问题并不能算是高手,真正的高手不仅要能解决问题还要能分析出问题出现的根本原因。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值