Struts 错误处理

文艺青年2 2003-02-24 12:15:16
我写了用户处理表单logon.jsp
对应的Action和ActionForm分别是: LogonActioni.java和LogonForm.java
LogonForm.java有段代码为:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
ActionErrors errors = new ActionErrors();
if(username == null || username.length() < 1)
errors.add("username", new ActionError("error.username.required"));
return errors;
}
...
我在访问logon.jsp页面时,如果username域内不输入字串,提交后TOMCAT显示错误信息为:

java.lang.IllegalArgumentException: Path logon.jsp does not start with a "/" character
at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:590)
at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:174)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:965)
at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:947)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:245)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1109)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:470)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
at java.lang.Thread.run(Thread.java:536)

为什么啊?
...全文
75 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gary_shi 2003-02-24
  • 打赏
  • 举报
回复
struts will redirect url to "input" if u set "validate" to true and u set some error information in validate funtion.
你出错的提示是一定要用/开头,我觉得就是在INPUT那一段啊。会不会你的struts-config.xml里面有重复的部分啊?

我的配置应该肯定是对的了,程序里有很多条这样的东西,一直没有什么错啊。
另外,我不大喜欢用STRUTS里的出错处理机制。
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
Gary Shi:
是啊,是啊
那问题还可能出现在哪里呢?
我在LogonAction.java 有如下代码
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
{
ActionErrors errors = new ActionErrors();
LogonForm logonForm = (LogonForm)form;
String username = logonForm.getUsername();

if(!username.equals("root")){
errors.add("org.apache.struts.action.GLOBAL_ERROR", new ActionError("error.username.verify"));
if(!errors.empty()){
saveErrors(request, errors);
return mapping.findForward("failure");
}
}
return mapping.findForward("success");
}
当我在logon.jsp中输入字串(非root)后提交,并且去掉LogonForm.java的validate方法中的语句,可以正确返回LogonAction指定的错误error.username.verify
gary_shi 2003-02-24
  • 打赏
  • 举报
回复
<action path="/logon"
type="com.qsh.qiv.action.LogonAction"
name="logonForm"
scope="request">
<forward name="success" path="/WEB-INF/jsp/index.jsp" />
<forward name="failure" path="/logon.jsp" />
</action>

光这个样子也是可以的,不过 validate这个函数就白写了。
另外,我觉得下面这个样子也应该是对的了。除非你在别的地方还有错。
<action path="/logon"
type="com.qsh.qiv.action.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="/logon.jsp">
<forward name="success" path="/WEB-INF/jsp/index.jsp" />
<forward name="failure" path="/logon.jsp" />
</action>


文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
Gary Shi:
为解决java.lang.IllegalArgumentException: Path logon.jsp does not start with a "/" character..
问题,

我才把validate="true"加上
加上validate="true"之前是同样的错误啊
gary_shi 2003-02-24
  • 打赏
  • 举报
回复
另外,你如果想要从表面上解决问题把
validate="true"
这一行删掉就行了
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
Gary Shi:
问题没有解决,我是说我本来strut-config.xml按如上方式配置,
一直没有成功

该问题没有解决!!!!!!!!!!!!
gary_shi 2003-02-24
  • 打赏
  • 举报
回复
我不是说你的配置不对,只是建议你另别这么做。
一般WEB-INF是放配置文件和LIB的,不是给你放JSP的了。
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
terry17:问题没有解决,我是说我本来strut-config.xml按如上方式配置,
一直没有成功

该问题没有解决!!!!!!!!!!!!
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
gary_shi:
<forward name="success" path="/WEB-INF/jsp/index.jsp" />

经过测试,可以成功访问!

方法是在Action中写:mapping.findForward("success");
即可,已经测试通过!
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
terry17:问题没有解决,我是说我本来strut-config.xml按如上方式配置,
一直没有成功
gary_shi 2003-02-24
  • 打赏
  • 举报
回复
input="logon.jsp">  ==>input="/logon.jsp">
另外:
<forward name="success" path="/WEB-INF/jsp/index.jsp" />
这一句是不合适的,通常JSP的服务器禁止通过WEB对WEB-INF的访问
terry17 2003-02-24
  • 打赏
  • 举报
回复
啊,这么快解决了阿,来的太晚了
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
Gary Shi:
非常感谢你的迅速回复
strut-config.xml配置为
<action path="/logon"
type="com.qsh.qiv.action.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="logon.jsp">
<forward name="success" path="/WEB-INF/jsp/index.jsp" />
<forward name="failure" path="/logon.jsp" />
</action>

gary_shi 2003-02-24
  • 打赏
  • 举报
回复
check ur struts-config.xml
change to ur action "logon.jsp" to "/logon.jsp"
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
怎么给分啊,大虾?
文艺青年2 2003-02-24
  • 打赏
  • 举报
回复
gary_shi:
问题解决,就是你说的
input="/logon.jsp"
我写为:
input="logon.jsp"
加上/就好了
之前我一直在反复修改<forward name="failure" path="/logon.jsp" />中的"/"
万分感谢,放分

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧