1

私はstruts2の初心者です。struts 2を使用するために、Eclipseで動的Webプロジェクトを作成しました。何か問題があり、理由がわかりません。コンソール出力は次のとおりです。

There is no Action mapped for namespace [/modeldriven] and action name [datosUsuario] associated with context path [/FormularioMD]. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:554)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:306)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:323)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1719)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

次のディレクトリ構造があります。

Resources
--src
  --action and model.
WebContent
--modeldriven
  --nuevo-usuario.jsp
  --datos-usuario.jsp
--WEB-INF
  --lib
  --web.xml

データを入力するための私のJSPファイル:

<%@taglib uri="/struts-tags" prefix="s" %>
<!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>
<s:form action="datosUsuario">
    <s:textfield name="nombre" label="Nombre" />
    <s:textfield name="username" label="Username" />
    <s:password name="password" label="Password" />
    <s:textfield name="edad" label="Edad" />
    <s:textfield name="fechaNacimiento" label="Fecha de Nacimiento" />
    <s:submit value="Enviar" />
</s:form>
</body>
</html>

私のアクションクラス、注:私は注釈を使用しています:

package com.java.rmo.controladores;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;

import com.java.rmo.modelos.Usuario;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@Namespace(value = "/modeldriven")
@Action(value = "datosUsuario", results={
        @Result(name="success", location="/modeldriven/datos-usuario.jsp")
})
public class UsuarioAction extends ActionSupport implements ModelDriven<Usuario> {

    private Usuario usuario = new Usuario();

     public Usuario getModel(){
            return usuario;
     }

     @Override
     public String execute() throws Exception {
         return SUCCESS;
     }
}

結果を表示する JSP ファイル:

<%@taglib uri="/struts-tags" prefix="s" %>
<!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>
Nombre: <strong><s:property value="nombre" /></strong> <br />
Username: <strong><s:property value="username" /></strong> <br />
Password: <strong><s:property value="password" /></strong> <br />
Edad: <strong><s:property value="edad" /></strong> <br />
Fecha de Nacimiento: <strong><s:property value="fechaNacimiento" /></strong>
</body>
</html>

私の 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>struts2HelloWord</display-name>

<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>

それで、誰か私を助けることができますか?、ありがとう。

4

1 に答える 1

1

名前が示すように、コンベンション プラグインは、命名規則を使用して動作します。

特定のパッケージを検索し、その中で特定の名前のアクション、または特定のインターフェースを実装するアクションを探します。

ドキュメントから:

デフォルトでは、Convention プラグインは、特定のパッケージでcom.opensymphony.xwork2.ActionAction を実装するか、名前が Action で終わるすべてのアクション クラスを検索します。

これらのパッケージは、検索方法を使用してコンベンション プラグインによって検索されます。まず、Convention プラグインは、、、またはという名前パッケージを見つけます。これらの名前に一致するパッケージはすべて、コンベンション プラグインのルート パッケージと見なされます。次に、プラグインはそれらのパッケージstrutsstruts2actionactionsとサブパッケージのすべてのクラスを調べて、クラスが実装されている かどうか、またはそれらの名前が(つまり )com.opensymphony.xwork2.Actionで終わっているかどうかを判断します。ActionFooAction

あなたのパッケージは次のとおりです。

package com.java.rmo.controladores;

コンベンション プラグインはその中のものを検索しません。

次の 2 つのオプションがあります。

  • パッケージをリファクタリングして、プラグインによって要求された名前の 1 つを含めます。次に例を示します。

    package com.java.rmo.actions;

  • こちら で説明されているように、プラグインがアクションをスキャンするパッケージのリストにパッケージを追加します。

私は個人的に最初の解決策を採用します...デフォルトに固執し、起こりうる問題や望ましくない副作用を回避します。

于 2015-04-21T07:50:36.630 に答える