且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

资源不可用错误使用Eclipse Kepler与Struts 2 + Tomcat 7

更新时间:2022-10-19 15:58:01

当struts2应用程序引导它从 struts加载配置.XML 。它解析该文档并创建配置相关对象并将其放入内部容器中。然后使用这个配置对象来实例化动作,结果,拦截器等真实的对象。在应用程序中存在的配置中指定类很重要。 Eclipse只能编译Java文件,甚至验证 struts.xml 的DTD,但不能解决配置错误。 Struts2在引导时执行。因此,您得到的动作类不能解析的错误。要修复错误,您应该提供类路径中存在的类引用。

 < action name =getTutorialclass =org.koushik.javabrains.action.TutorialAction> 
< result> /success.jsp< / result>
< result name =failure> /error.jsp< / result>
< / action>

注意,结果名称success是结果的默认名称,可以省略。


Ok, so this is my first app written in Java and my first time using Eclipse Kepler, Tomcat 7, and Struts2 so I am surprised that I even got this far since all I know is JS and Rails. Anyway, this basic web app literally is just supposed to output the string "Success Page!" when you enter that URL in the IDE while running Tomcat 7.

I viewed the Tomcat success page so I know the runtime server is working. Also, I am getting no red x marks in my IDE. The tutorial told me to add to the URL getTutorial.action of my completed web app in order to render the success.jsp view.

However, I get this error at the url localhost:8080/Struts2Starter/getTutorial.action:

message /Struts2Starter/getTutorial.action

description The requested resource is not available.

The error log tells me this :

    SEVERE: Dispatcher initialization failed
    Unable to load configuration. - action - file:/Users/jasonrodriguez/Java/apache-tomcat-7.0.47/wtpwebapps/Struts2Starter/WEB-INF/classes/struts.xml:10:76

SEVERE: Dispatcher initialization failed
Unable to load configuration. - action - file:/Users/jasonrodriguez/Java/apache-tomcat-7.0.47/wtpwebapps/Struts2Starter/WEB-INF/classes/struts.xml:10:76
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:70)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:446)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:490)
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: Action class [org.koushik.javabrains.TutorialAction] not found - action - file:/Users/jasonrodriguez/Java/apache-tomcat-7.0.47/wtpwebapps/Struts2Starter/WEB-INF/classes/struts.xml:10:76
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:482)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:426)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:552)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:292)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:250)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
    ... 16 more

SEVERE: Error filterStart

My 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" 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">
  <display-name>Struts2Starter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.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>

My 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="struts-default">

        <action name="getTutorial" class="org.koushik.javabrains.TutorialAction">
            <result name="success">/success.jsp</result>
            <result name="failure">/error.jsp</result>
        </action>

    </package>

</struts>

My TutorialAction.java :

package org.koushik.javabrains.action;

public class TutorialAction {

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

My success.jsp view :

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!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=US-ASCII">
<title>Insert title here</title>
</head>
<body>
    Success Page!
</body>
</html>

I am struggling to troubleshoot this. In Rails I'd throw in a binding.pry but here I am not the slightest clue how to troubleshoot. Best I can tell, perhaps the routing got messed up somewhere. Any insight would be really helpful thanks!!

When struts2 app bootstraps it load the configuration from struts.xml. It parses that document and create config related objects and put them into the internal container. Then used this config objects to instantiate real objects like actions, results, interceptors, etc. It's important to specify classes in the configuration that exist in the application. Eclipse can only compile a Java files and even validate DTD of struts.xml but it will not resolve configuration errors. Struts2 is doing it on bootstrap. As a result you got the error that action class is not resolvable. To fix the error you should provide the class reference that exist on the classpath.

<action name="getTutorial" class="org.koushik.javabrains.action.TutorialAction">
    <result>/success.jsp</result>
    <result name="failure">/error.jsp</result>
</action>

Note, the result name "success" is the default name of the result and could be omitted.