Struts 2没有调用action类的execute()方法

时间:2012-10-17 05:58:47

标签: java struts2

我是Struts2的新手,并在struts中创建了一个简单的HelloWorld应用程序,但问题是当我点击提交按钮时没有调用我的动作类,控制台上也没有任何异常。 这是我的代码,

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_3_0.xsd" 
id="WebApp_ID" version="3.0">

  <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

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

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<struts>
    <constant name="struts.enable.DynamicMethodInvocation"
        value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" extends="struts-default" namespace="/">
        <action name="helloAction"
            class="com.tutorial.struts2.HelloWorldAction">
            <result name="success">helloworld.jsp</result>
        </action>
    </package>
</struts>

index.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>Welcome to Struts</h1>
     <form action="/helloAction">
      <label for="name">Please enter your name</label><br/>
      <input type="text" name="userName"/>
      <input type="submit" value="Say Hello"/>
   </form>
   </body>
</html>

HelloWorldAction

package com.tutorial.struts2;


public class HelloWorldAction {

    public String userName;

    public String execute() throws Exception{
        System.out.println(userName);
        return "success";
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

helloworld.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">
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
     Hello World, <s:property value="userName"/>

</body>
</html>

5 个答案:

答案 0 :(得分:2)

<强>的helloWorld.jsp

<s:property value="name"/>

name属性在哪里?你在哪个动作类中声明了name属性?

应为<s:property value="userName"/>

记住struts会尝试通过放置get+YourProperty()

来找出属性文件的getter方法

在你的情况下,它会尝试在你的动作类中找出不可用的getName()方法。

<强>编辑:

helloAction的您的网址未正确映射 尝试在浏览器中运行它,

http://yourIp:port/yourApplicationName/yourNameSpace/yourAction

将成为您项目的

http://yourIp:8080/HelloWorldStruts/testNameSp/helloAction

答案 1 :(得分:2)

我认为您需要在代码中进行两项更改

public class HelloWorldAction extends Action 

是第一个和第二个,用户struts属性表单以发布操作

<s:form action="helloAction">
希望能帮到你。

答案 2 :(得分:0)

您应该在动作类中扩展Action

public class HelloWorldAction extends Action {

答案 3 :(得分:0)

尝试扩展com.opensymphony.xwork2.ActionSupport类并覆盖像这样的执行方法

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{

    public String execute() {
        System.out.println(userName);
        return "success";
    }


}

答案 4 :(得分:0)

注意:适用于Struts 1

我遇到了同样的问题,但我已经通过移除forward中的action-mappings属性解决了我的问题

这是正确的:

<action-mappings>
    <action input="/user_list.jsp" name="UserAddFormBean" path="/userAdd" 
            scope="request" 
            type="com.minetronics.struts.UserAdd" validate="true" forward="/user_add.jsp">
            <forward name="success" path="/user_add.jsp"/>
    </action>
</action-mappings>

但是这将跳过调用execute并直接转到forward

<action-mappings>
    <action input="/user_list.jsp" name="UserAddFormBean" path="/userAdd" 
            scope="request" 
            type="com.minetronics.struts.UserAdd" validate="true">
            <forward name="success" path="/user_add.jsp"/>
    </action>
</action-mappings>