Codebehind plugin fails to locate SayHelloAction class
------------------------------------------------------

                 Key: WW-3063
                 URL: https://issues.apache.org/struts/browse/WW-3063
             Project: Struts 2
          Issue Type: Bug
          Components: Plugin - CodeBehind
    Affects Versions: 2.1.6
         Environment: J2SE 1.6.0.14
TC 1.6.014
Struts 2.1.6
            Reporter: Martin Gainty
            Priority: Minor


//WEB-INF/classes/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>
    <!-- Some or all of these can be flipped to true for debugging -->
    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.configuration.xml.reload" value="false" />
    <constant name="struts.custom.i18n.resources" value="globalMessages" />
    <constant name="struts.action.extension" value="action,," />

    <constant name="struts.codebehind.defaultPackage" value="person" />
    <!-- constant name="struts.freemarker.manager.classname" 
value="customFreemarkerManager" / -->
    <constant name="struts.serve.static" value="true" />
    <constant name="struts.serve.static.browserCache" value="false" />

    <package name="sayHello" extends="struts-default" namespace="say-hello">
                <default-action-ref name="say-hello"/>  
                <action name="say-hello" class="actions.all.SayHelloAction" 
method="default">
                        <result>/say-hello-success.jsp</result>
                </action>

    </package>
</struts>

//here is the java code which extended ActionSupport but reworked to extend 
Servlet to make operational
package actions.all;

import com.opensymphony.xwork2.ActionSupport;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SayHelloAction extends HttpServlet
{
  private static final long serialVersionUID = 1L;
  private java.lang.String userName;
  public void doPost(HttpServletRequest req,HttpServletResponse resp) throws 
ServletException, IOException
  {
          userName=req.getParameter("userName");
          if(userName==null) userName=(String)req.getAttribute("userName");

          System.out.println("Inside SayHelloAction::doPost..");
          doGet(req,resp);
  }
  public void doGet(HttpServletRequest req, HttpServletResponse res)
                               throws ServletException, IOException
  {
    System.out.println("Inside SayHelloAction::doGet..");
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    String name = req.getParameter("UserName");
    out.println("<HTML>");
    out.println("<HEAD><TITLE>Hello, " + name + "</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("Hello, " + userName);
    out.println("</BODY></HTML>");
  }
  public String getServletInfo()
  {
    return "A servlet that knows the name of the person to whom it's" +  
"saying hello";
  }
  public java.lang.String getUserName()
  {
         return userName;
  }
  public void setUserName(java.lang.String userName)
  {
         this.userName = userName;
  }
}

//By default, the Convention plugin will find all action classes that implement 
com.opensymphony.xwork2.Action or //whose name ends with the word Action in 
specific packages. 
//BUT THIS Action Class is never found...
//public class SayHelloAction extends ActionSupport {
//     public String execute() throws Exception {
//         return "success";
//     }
//}

//default.properties attached
#
# $Id: default.properties 722328 2008-12-02 01:56:24Z davenewton $
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
### START SNIPPET: complete_file

### Struts default properties
###(can be overridden by a struts.properties file in the root of the classpath)
###

### Specifies the Configuration used to configure Struts
### one could extend org.apache.struts2.config.Configuration
### to build one's customize way of getting the configurations parameters into 
Struts
# struts.configuration=org.apache.struts2.config.DefaultConfiguration

### This can be used to set your default locale and encoding scheme
# struts.locale=en_US
struts.i18n.encoding=UTF-8

### if specified, the default object factory can be overridden here
### Note: short-hand notation is supported in some cases, such as "spring"
###       Alternatively, you can provide a 
com.opensymphony.xwork2.ObjectFactory subclass name here
# struts.objectFactory = spring

### specifies the autoWiring logic when using the SpringObjectFactory.
### valid values are: name, type, auto, and constructor (name is the default)
struts.objectFactory.spring.autoWire = name

### indicates to the struts-spring integration if Class instances should be 
cached
### this should, until a future Spring release makes it possible, be left as 
true
### unless you know exactly what you are doing!
### valid values are: true, false (true is the default)
struts.objectFactory.spring.useClassCache = true

### ensures the autowire strategy is always respected.
### valid values are: true, false (false is the default)
struts.objectFactory.spring.autoWire.alwaysRespect = false

### if specified, the default object type determiner can be overridden here
### Note: short-hand notation is supported in some cases, such as "tiger" or 
"notiger"
###       Alternatively, you can provide a 
com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation name here
### Note: By default, com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer 
is used which handles type detection
###       using generics. 
com.opensymphony.xwork2.util.GenericsObjectTypeDeterminer was deprecated since 
XWork 2, it's
###       functions are integrated in DefaultObjectTypeDeterminer now.
###       To disable tiger support use the "notiger" property value here.
#struts.objectTypeDeterminer = tiger
#struts.objectTypeDeterminer = notiger

### Parser to handle HTTP POST requests, encoded using the MIME-type 
multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

### Load custom property files (does not override struts.properties!)
# struts.custom.properties=application,org/apache/struts2/extension/custom

### How request URLs are mapped to and from actions
#struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper

### Used by the DefaultActionMapper
### You may provide a comma separated list, e.g. 
struts.action.extension=action,jnlp,do
### The blank extension allows you to match directory listings as well as pure 
action names
### without interfering with static resources.
struts.action.extension=action,,

### Used by FilterDispatcher
### If true then Struts serves static content from inside its jar.
### If false then the static content must be available at <context_path>/struts
struts.serve.static=true

### Used by FilterDispatcher
### This is good for development where one wants changes to the static content 
be
### fetch on each request.
### NOTE: This will only have effect if struts.serve.static=true
### If true -> Struts will write out header for static contents such that they 
will
###             be cached by web browsers (using Date, Cache-Content, Pragma, 
Expires)
###             headers).
### If false -> Struts will write out header for static contents such that they 
are
###            NOT to be cached by web browser (using Cache-Content, Pragma, 
Expires
###            headers)
struts.serve.static.browserCache=true

### Set this to false if you wish to disable implicit dynamic method invocation
### via the URL request. This includes URLs like foo!bar.action, as well as 
params
### like method:bar (but not action:foo).
### An alternative to implicit dynamic method invocation is to use wildcard
### mappings, such as <action name="*/*" method="{2}" class="actions.{1}">
struts.enable.DynamicMethodInvocation = true

### Set this to true if you wish to allow slashes in your action names.  If 
false,
### Actions names cannot have slashes, and will be accessible via any directory
### prefix.  This is the traditional behavior expected of WebWork applications.
### Setting to true is useful when you want to use wildcards and store values
### in the URL, to be extracted by wildcard patterns, such as
### <action name="*/*" method="{2}" class="actions.{1}"> to match "/foo/edit" or
### "/foo/save".
struts.enable.SlashesInActionNames = false

### use alternative syntax that requires %{} in most places
### to evaluate expressions for String attributes for tags
struts.tag.altSyntax=true

### when set to true, Struts will act much more friendly for developers. This
### includes:
### - struts.i18n.reload = true
### - struts.configuration.xml.reload = true
### - raising various debug or ignorable problems to errors
###   For example: normally a request to foo.action?someUnknownField=true should
###                be ignored (given that any value can come from the web and it
###                should not be trusted). However, during development, it may 
be
###                useful to know when these errors are happening and be told of
###                them right away.
struts.devMode = false

### when set to true, resource bundles will be reloaded on _every_ request.
### this is good during development, but should never be used in production
struts.i18n.reload=false

### Standard UI theme
### Change this to reflect which path should be used for JSP control tag 
templates by default
struts.ui.theme=xhtml
struts.ui.templateDir=template
#sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix=ftl

### Configuration reloading
### This will cause the configuration to reload struts.xml when it is changed
struts.configuration.xml.reload=false

### Location of velocity.properties file.  defaults to velocity.properties
struts.velocity.configfile = velocity.properties

### Comma separated list of VelocityContext classnames to chain to the 
StrutsVelocityContext
struts.velocity.contexts =

### Location of the velocity toolbox
struts.velocity.toolboxlocation=

### used to build URLs, such as the UrlTag
struts.url.http.port = 80
struts.url.https.port = 443
### possible values are: none, get or all
struts.url.includeParams = none

### Load custom default resource bundles
# struts.custom.i18n.resources=testmessages,testmessages2

### workaround for some app servers that don't handle 
HttpServletRequest.getParameterMap()
### often used for WebLogic, Orion, and OC4J
struts.dispatcher.parametersWorkaround = false

### configure the Freemarker Manager class to be used
### Allows user to plug-in customised Freemarker Manager if necessary
### MUST extends off org.apache.struts2.views.freemarker.FreemarkerManager
#struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager

### Enables caching of FreeMarker templates
### Has the same effect as copying the templates under WEB_APP/templates
struts.freemarker.templatesCache=false

### Enables caching of models on the BeanWrapper
struts.freemarker.beanwrapperCache=false

### See the StrutsBeanWrapper javadocs for more information
struts.freemarker.wrapper.altMap=true

### maxStrongSize for MruCacheStorage for freemarker
struts.freemarker.mru.max.strong.size=100

### configure the XSLTResult class to use stylesheet caching.
### Set to true for developers and false for production.
struts.xslt.nocache=false

### Whether to always select the namespace to be everything before the last 
slash or not
struts.mapper.alwaysSelectFullNamespace=false

### Whether to allow static method access in OGNL expressions or not
struts.ognl.allowStaticMethodAccess=false

### END SNIPPET: complete_file

//****************say-hello/index.jsp******************
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
     <head>
         <title>I <em>(State Your Name)</em></title>
     </head>
     <body>
          <h3>Thats <em>Hedley!</em></h3>
         <div>
             <s:form action="say-hello">
                 <s:textfield label="Name:" name="userName" size="30" 
maxlength="30" />
                 <s:submit value="Submit" />
             </s:form>
         </div>
     </body>
</html>

/***********say-hello-success.jsp***************
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
     <head>
         <title>Hello Success</title>
     </head>
     <body>
     Hello <s:property value="userName" />
     </body>
</html>



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to