【问题标题】:There is no Action mapped for namespace /controller and action name没有为命名空间 /controller 和操作名称映射操作
【发布时间】:2014-12-10 07:01:56
【问题描述】:

我正在尝试学习 Struts2,我使用了一个点击 action 的视图页面,action 类使用了一个编写 getter setter 方法的 bean,并且该 action 也使用了一个编写连接的 dao。我想提到我使用的是jboss v5.0和eclipse,我已经添加了所有的jar文件。

现在,当我尝试运行此应用程序时,欢迎 jsp 页面正常点击,然后单击提交按钮显示以下错误:

没有为命名空间/控制器和动作名称映射动作

我正在放置我的代码和目录结构。我试过使用namespace="/" <result name="SUCCESS">/success.jsp</result>,还是不行


passing
+JAX-WS Web Services
+Deployment Descriptor:Passing
-Java Resources
 -src
  -controller
   -TestAction.java
    -TestAction
     -execute(HttpServletRequest request , HttpServletResponse response) : String

   -model
    -TestBean.java
     -TestBean
      -age
      -ocation
      -name
      -getAge() :String
      -getName() :String
      -getLocation() :String
      -setAge(String) : void
      -setName(String) : void
      -getlocation(String) : void
    -UserDao.java
     - UserDao
      -Logincheck() :Connection

registration.jsp


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Passing</display-name>

  <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>

  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>registration.jsp</welcome-file>
  </welcome-file-list>
</web-app>


struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

  <struts>
        <package name="default" extends="sturts-default">
            <action name="TestAction" class="controller.TestAction">
                <result name="SUCCESS">/success.jsp</result>
            </action>
        </package>




  </struts>


成功.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<center> Welcome, Data successfully inserted</center>
</body>
</html>


registration.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%@ taglib uri="/struts-tags" prefix="s"/%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:form action="TestAction" method="post" >
<s:textfield name="Name" label="Name"/>
<s:textfield name="Age" label="Age"/>
<s:textfield name="Location" label="Location"/>
<s:submit label="Submit"></s:submit>

</s:form>

</body>
</html>
      


TestAction.java

package controller;

import java.sql.Connection;
import java.sql.PreparedStatement;

import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.TestBean;
import model.UserDao;

import org.apache.struts2.ServletActionContext;


public class TestAction extends ActionSupport{



    public String execute(HttpServletRequest request , HttpServletResponse response)   throws Exception
    {
        String Name = request.getParameter("Name");
        String Age = request.getParameter("Age");
        String Location = request.getParameter("Location");

        TestBean bean = new TestBean();

        bean.setName(Name);
        bean.setAge(Age);
        bean.setLocation(Location);

        UserDao obj = new UserDao();
        Connection x= obj.Logincheck();

        if(x!=null)
        {
        PreparedStatement ps= x.prepareStatement("insert into Registration values(?,?,?)");
        ps.setString(1, bean.getName());
        ps.setString(2, bean.getAge());
        ps.setString(3, bean.getLocation());
        int i = ps.executeUpdate();
        System.out.println("The value of i =" +i);
        if(i>0)
        {
        return SUCCESS;
        }
        }
        return null;

    }
}


TestBean.java

package model;

public class TestBean {
    String name;
    String age;
    String location;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }

}


UserDao.java

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class UserDao {
	
	public Connection Logincheck()
	{
		
		Connection con=null;
		
		try
		{
			try
			{
				Class.forName("oracle.jdbc.driver.OracleDriver");
			}
			catch(ClassNotFoundException e)
			{
				e.printStackTrace();
			}
			
			con= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "username", "password");
			if(con!=null)
			{
				return con;
			}
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;
		
	}

}

就是这样。

【问题讨论】:

  • 不相关,但是execute方法做的太多了,在不同的抽象层次上操作。这不是什么大不了的事,但 IMO 这是一个坏习惯。
  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。

标签: struts2 dao


【解决方案1】:
  1. 这个错误

    没有为命名空间/控制器和动作名称映射动作

    通常意味着 Struts 无法在指定的命名空间中找到指定的操作(在这种情况下为/controller)。顺便说一句,在您的情况下,您没有在任何地方指定 /controller 并且错误消息中缺少操作名称,因此此错误可能是由您的操作/JSP/配置中的一堆其他错误产生的。

  2. 你还有两个错别字,阻止了任何工作:

    • sturts-default 而不是struts-default

      <package name="default" extends="struts-default">
      
    • "SUCCESS" 而不是"success",这是映射到您从 Action 方法返回的常量 SUCCESS 的结果。

          <result name="success">/success.jsp</result>
      
  3. 如果使用 Struts 版本高于或等于 2.1.3,you need the new filter, StrutsPrepareAndExecuteFilter instead of the deprecated FilterDispatcher;

  4. 操作方法必须是不带参数的public String something()。这个:

    public String execute(HttpServletRequest request , HttpServletResponse response)   throws Exception
    

    完全是错误的,应该是:

    public String execute(){}
    
  5. 这里

    String Name = request.getParameter("Name");
    String Age = request.getParameter("Age");
    String Location = request.getParameter("Location");
    
    TestBean bean = new TestBean();
    
    bean.setName(Name);
    bean.setAge(Age);
    bean.setLocation(Location);
    

    你正在重新发明轮子真的很糟糕。属性必须是私有的,在类级别,带有 getter 和 setter,它们将被自动填充,无需访问请求。在你的情况下:

    private TestBean bean;
    /* GETTER AND SETTER */
    
    public String execute(){
        System.out.println(bean.getName());
        // ...
    }
    

不相关,但 Java 命名约定为局部变量和实例属性使用小写名称。

  1. 在JSP页面中,你需要以小写字母开头的getter来访问:

    <s:textfield name="Name" label="Name"/>
    

    必须是

    <s:textfield name="name" label="Name"/>
    

    其他领域也是如此。另外,如果你指向一个像 TestBean 这样的对象,你需要这样做:

    <s:textfield name="bean.name" label="Name"/>
    

这是主要问题...顺便说一句,考虑在读完一本书或一些好的教程后开始编码。像这样在黑暗中开始不是正确的方式,恕我直言。

【讨论】:

  • 正常原因上升:/
  • 好的,但即使你发布了对她确切问题的规范、完美的答案(基本上只在标题中,因为问题中有一个完整的软件),它也不会起作用,因为她至少还有其他 6 个问题:|这对 SO 来说不是一个好问题,我通常会像这样使用 RTFM 跳过 Q。在这种情况下,我试图帮助 OP(虽然当我开始写答案时我没有注意到有这么多错误:) 获得了反对票。问题呢?或者其他答案说必须使用 ModelDriven?有人投反对票,而不是回答
  • 无,除了额外的复杂性使其成为建议使用它的绝对坏主意,尤其是对于似乎不熟悉框架的基本概念的 OP
  • 我的问题是如何消除“没有为命名空间/控制器和动作名称映射的动作”问题。如果我在代码中的任何地方出错,请纠正我
  • 感谢 Andrea Ligios 的所有观点。现在我的应用程序运行正常。感谢所有提到的观点并纠正我的错误。
【解决方案2】:

以下是你应该注意的点,

  1. 如果您使用 TestBean 类作为数据载体,则必须实现 ModelDriven 接口。
  2. TestAction.java 应该出现在“Controller”包中。
  3. 如果您希望在 execute() 方法中使用 HttpServletRequest 和 HttpServletResponse,那么您可以获得的最简单方法是实现 ServletRequestAwareServletResponseAware 接口并实现各自的方法。
  4. 最重要的是,如果您的 success.jsp 位于 Web Content 文件夹中,则无需指定

     <result name="SUCCESS">/success.jsp</result>
    

就这样吧

 <result name="SUCCESS">success.jsp</result>

如果您有任何文件夹,假设 Web 内容中的“Folder1”,然后指定类似

 <result name="SUCCESS">Folder1/success.jsp</result>

【讨论】:

  • 不需要使用ModelDriven,不需要使用HttpServletRequest和HttpServletResponse,而且ServletResponseAware和ServletRequestAware没有提供以上两个,而是封装了
  • 感谢 Aditya EKbote,您的最后一点对我的申请有效。我还想提一下,您所说的其他几点对我的申请不是必需的。
  • 是的。我知道。您通过 HttpServletRequest 和 HttpServletResponse 来执行方法。这也可以工作。我提到我的最后一点很重要。如果这对您有用,您可以投票并接受答案吗?
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多