找不到操作方法的路径?

Path to Action method not found?

为什么我在 浏览器控制台 尝试调用 Struts 来自 jsp/html 文件的 1 个 DispatchAction?:

http://localhost:8089/topFrame.do?method=viewAction 404 ()
http://localhost:8089/topFrame.do?method=viewAction&polnum= 404 ()

我正在将一个旧的 Struts webapp 从 Weblogic 移动到 Tomcat。



Tomcat 日志中有什么:

09-Aug-2017 15:58:09.497 SEVERE [http-nio-8089-exec-2] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [action] in web application [/mywebapp] threw load() exception
 javax.servlet.UnavailableException: Parsing error processing resource path 
    at org.apache.struts.action.ActionServlet.handleConfigException(ActionServlet.java:1035)
    at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1012)
    at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)
    at org.apache.struts.action.ActionServlet.init(ActionServlet.java:470)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1194)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1110)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1000)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4902)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5212)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:473)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1617)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1483)
    at org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:285)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:206)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:632)
    at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:319)
    at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:88)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)



index.jsp中有什么:

<%@taglib uri="WEB-INF/struts-bean.tld" prefix="bean" %>
<%@taglib uri="WEB-INF/struts-html.tld" prefix="html" %>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<html>
    <head>
        <script> 
        var polparam;
        function initWindow() {
            top.moveTo(150,0);
            top.resizeTo(1000,1000);

            polparam = gup( 'POLNUM' );
            if (polparam != null )
            {
              top.topFrame.location="/topFrame.do?method=viewAction&polnum="+polparam; 
            }
        }

        function gup( name ) {
            window.alert("hello2");
            name = name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
            var regexS = "[\?&]"+name+"=([^&#]*)";
            var regex = new RegExp( regexS );
            var results = regex.exec( window.location.href );
            if( results == null ) return "";  
            else    return results[1];
        }
        </script>   
    </head>

    <frameset rows="242,*" frameborder="NO" border="0" framespacing="0" id="index" onLoad="initWindow()">    
            <noframes>
                <body bgcolor="#d341f4" text="#41f4bb">
                    Your Broswer doesn't handle frames 2.
                </body>
            </noframes>

            <frame name="topFrame" scrolling="NO" noresize src="/topFrame.do?method=viewAction" /> 
            <frame name="mainFrame" src="blank.html" />
    </frameset>
</html>



web.xml中有什么:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
         version="3.0">


    <servlet>
        <servlet-name>action</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>
        <init-param>
            <param-name>debug</param-name>
            <param-value>2</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>2</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <jsp-config>
        <taglib>
            <taglib-uri>WEB-INF/struts-bean.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>WEB-INF/struts-html.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>WEB-INF/struts-logic.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>WEB-INF/struts-nested.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>WEB-INF/struts-tiles.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>WEB-INF/struts-template.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
        </taglib>   
        <taglib>
            <taglib-uri>WEB-INF/taglibs-datetime.tld</taglib-uri>
            <taglib-location>/WEB-INF/taglibs-datetime.tld</taglib-location>
        </taglib>   
        <taglib>
            <taglib-uri>WEB-INF/pagination.tld</taglib-uri>
            <taglib-location>/WEB-INF/pagination.tld</taglib-location>
        </taglib>           
    </jsp-config>
</web-app>



struts-config.xml中有什么:

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

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


<struts-config>
    <form-beans>
        <form-bean name="topFrameForm" type="com.aif.TopFrameForm">
            <description>This is the form bean for the entire top Frame of the webapp</description>
        </form-bean>
    </form-beans>

    <!-- Global Exceptions -->
    <global-exceptions>
    </global-exceptions>

    <!-- Global Forwards -->
    <global-forwards>
        <forward name="topFrameError" path="WEB-INF/jsp/error/TopFrameError.jsp"/>
        <forward name="unknownError" path="WEB-INF/jsp/error/UnknownError.jsp"/>
        <forward name="accessDenied" path="WEB-INF/jsp/error/AccessDenied.jsp" />
    </global-forwards>

    <action-mappings>
        <action path="/topFrame" name="topFrameForm" scope="request" type="com.aif.TopFrameAction" input="WEB-INF/jsp/TopFrame.jsp" parameter="method">
            <forward name="ok" path="/WEB-INF/jsp/TopFrame.jsp" />
        </action> 
    </action-mappings>

    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor" />

    <!-- Message Resources -->
    <message-resources parameter="ApplicationResources" null="false"/>

    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    </plug-in>  

</struts-config>



com.aif.TopFrameForm中有什么:

package com.aif;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.ValidatorForm;

public class TopFrameForm extends ValidatorForm {

    private String schemeNo="";
    private String polOrClientNo="";
    private String firstName="";
    private String surname="";
    private String ddMandate="";
    private String dob="";
    private String maxResultsReached="";
    private ArrayList policies=new ArrayList();

    // Getters & setters

    public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest request) {
        log.info("validate - START");
        ActionErrors errors = new ActionErrors();

        errors = super.validate(actionMapping, request);

        // etc.     

        log.info("validate - END");     
        return errors;
    }
}



com.aif.TopFrameAction中有什么:

    package com.aif;

    import java.rmi.RemoteException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    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.aif.Constants;

    public class TopFrameAction extends DispatchAction {

        private static Log log = LogFactory.getLog("com.aif.TopFrameAction");

        public ActionForward viewAction(    ActionMapping mapping,
                                            ActionForm    actionForm,
                                            HttpServletRequest request,
                                            HttpServletResponse response) { 

            TopFrameForm form =(TopFrameForm) actionForm;
            String polno = request.getParameter("polnum");

            // etc.     
            form.setPolOrClientNo(polno);
            // etc.

            return mapping.findForward("ok");
    }
    // etc.
}

我已经接触了 12 年 struts 请耐心等待。尝试将您的操作路径附加到 struts-config.xml 中的 topFrame.do。

试试这个:

  1. index.jsp:

删除所有 "topFrame.do" 调用前面的“/”字符:

top.topFrame.location = "topFrame.do?method=viewAction&polnum=" + polparam;

<frame name="topFrame" scrolling="NO" noresize src="topFrame.do?method=viewAction" /> 
  1. struts-config.xml:

input 属性的值更改为 "topFrame" 动作映射中的 input="index.jsp" 而不是 input="WEB-INF/jsp/TopFrame.jsp".

struts-config.xml中所有路径前加一个“/”字符:

<global-forwards>
  <forward name="topFrameError" path="WEB-INF/jsp/error/TopFrameError.jsp"/>
  <forward name="unknownError" path="WEB-INF/jsp/error/UnknownError.jsp"/>
  <forward name="accessDenied" path="WEB-INF/jsp/error/AccessDenied.jsp" />
</global-forwards>

您必须为您正在使用的 struts 版本使用正确的 DOCTYPE,否则将找不到 struts 操作路径:

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
  1. 可选:预编译你的jsp文件有很大帮助,既可以提高你的网络应用程序的性能,也可以找到如果它们有任何问题,而不是来回走动,因为 Tomcat 在加载它们时发现问题。