请教struts1x的dispatchAction问题

kaoa000 2014-02-19 10:39:15
用struts1做开发,配置如下:
web。xml:

<!-- 配置struts -->
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>struts</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

</web-app>


struts-config.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="employeeForm" type="com.cdtax.web.forms.EmployeeForm" />
</form-beans>
<action-mappings>
<action path="/login" parameter="method" name="employeeForm" type="com.cdtax.web.action.LoginAction">
<forward name="ok" path="/WEB-INF/mainFrame.jsp" />
<forward name="err" path="/WEB-INF/login.jsp" />
</action>
</action-mappings>
</struts-config>
login。jsp:
<body>
<h1>管理员登陆</h1>
<form action="/myssh/login.do?method=login" method="POST">
id:<input type="text" name="id" /><br>
pw:<input type="password" name="pwd" /><br>
<input type="hidden" name="method" value="login" />
<input type="submit" value="登陆" />
<input type="reset" value="重置" />
</form>
</body>


form:
package com.cdtax.web.forms;

import org.apache.struts.action.ActionForm;

public class EmployeeForm extends ActionForm
{
private String id;
private String pwd;

public String getId()
{
return id;
}
public void setId(String id)
{
System.out.println("form id" + id);
this.id = id;
}
public String getPwd()
{
return pwd;
}
public void setPwd(String pwd)
{
this.pwd = pwd;
}

}


action:
package com.cdtax.web.action;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.cdtax.web.forms.EmployeeForm;

public class LoginAction extends DispatchAction
{

//响应登录请求
public ActionForward login(ActionMapping arg0, ActionForm arg1,
ServletRequest arg2, ServletResponse arg3) throws Exception
{
System.out.println("--------------");
//取出表单,我们先打通练习,我们简单验证
EmployeeForm employeeForm = (EmployeeForm)arg1;

System.out.println("id=" + employeeForm.getId() + " pwd=" + employeeForm.getPwd());

if("123".equals(employeeForm.getPwd()))
{
return arg0.findForward("ok");
}
else
{
return arg0.findForward("err");
}
}

//响应注销请求
public ActionForward logout(ActionMapping arg0, ActionForm arg1,
ServletRequest arg2, ServletResponse arg3) throws Exception
{
// TODO Auto-generated method stub
return super.execute(arg0, arg1, arg2, arg3);
}

}

为什么部署后一执行就报错,总是

Servlet.service() for servlet struts threw exception
java.lang.NoSuchMethodException: Action[/login] does not contain specified method (check logs)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:261)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:617)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1774)
at java.lang.Thread.run(Thread.java:619)

哪位高手帮忙指点下
...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
慢慢地转变 2014-02-19
  • 打赏
  • 举报
回复
哈哈哈。LZ,完全看不懂啊,
kaoa000 2014-02-19
  • 打赏
  • 举报
回复
原来用的是struts1.3.8版本,重新下载了struts.3.10,将原来1.3.8的JAR包替换掉,不好用,然后将源代码关联上,然后重新生成LoginAction的execute方法,改为login方法,如下: public ActionForward login(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("--------------"); //取出表单,我们先打通练习,我们简单验证 EmployeeForm employeeForm = (EmployeeForm)form; System.out.println("id=" + employeeForm.getId() + " pwd=" + employeeForm.getPwd()); if("123".equals(employeeForm.getPwd())) { return mapping.findForward("ok"); } else { return mapping.findForward("err"); } } 然后程序就通过了,其他什么也没改,真不明白怎么回事
  • 打赏
  • 举报
回复
kaoa000 2014-02-19
  • 打赏
  • 举报
回复
我看了一下,在生成execute()方法时,因为使用的myeclipse,有自动提示功能,敲一个e然后自动带出以e打头的方法,我看了一下有两个,在没有引入源文件时,两个都是execute(ActionMapping arg0, ActionForm arg1,ServletRequest arg2, ServletResponse arg3),我自动用了第一个,如果引入源文件,变成一个是execute(ActionMapping arg0, ActionForm arg1,ServletRequest arg2, ServletResponse arg3),一个是execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response),这时我尝试在用第一个,就是参数是arg格式的,出现同样的错误。 写到这我突然明白过来了,我靠啊,是方法错了,显示的两个execute()确实是不同的方法,参数不一样的,第一个是ServletRequest,等等,第二个是HttpServletRequest 必须要仔细啊,这么个问题我弄了四五天,郁闷死了,谢谢大家
gsghfg 2014-02-19
  • 打赏
  • 举报
回复
jar包冲突
_Dust_小德 2014-02-19
  • 打赏
  • 举报
回复
说的是没有这种方法
ay转身遇 2014-02-19
  • 打赏
  • 举报
回复
jar包冲突
Defonds 2014-02-19
  • 打赏
  • 举报
回复
jar 包冲突的问题。 比如 a 包调用了 b 包的 c 方法,但是先前版本的 b 包是没 c 方法的。

81,092

社区成员

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

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