How to allow slashes in Struts 2 Action Names? - java

I'm trying to enable slashes in Struts 2 action names. I've put this in my config file:
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.action.extension" value=","/>
<constant name="struts.multipart.maxSize" value="2147483648" />
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<package name="myApp" extends="struts-default">
<action name="home" class="net.myapp.actions.HomeAction" method="execute">
<result name="landing">/landing.jsp</result>
</action>
<action name="/ajax/foo" class="net.myApp.actions.ajax.FooAction" method="execute">
<result name="success">/foo.jsp</result>
</action>
</package>
</struts>
When I go to just the homepage of this app, e.g http://localhost:8034/myApp, I see the homepage correctly. But if I visit http://localhost:8034/myApp/ajax/foo, I get the error: There is no Action mapped for action name ajax/foo. even though I have described it above as the 2nd action.
What am I doing wrong?

I'd say you need a namespace as well, so ajax would be the namespace in your case:
<package name="myApp" extends="struts-default" namespace="/ajax">
<action name="foo" class="net.myApp.actions.ajax.FooAction" method="execute">
<result name="success">/foo.jsp</result>
</action>
</package>
Note that you could use slashes in your action names, e.g. foo/bar, but it's not advisable, since some plugins (e.g. the conversation plugin) might have difficulties to determine the namespace and action from a string like /ajax/foo/bar.
Btw, the error message says There is no Action mapped for action name ajax/foo., i.e. struts looks for an action named ajax/foo but you only have an action /ajax/foo.

Related

Migrating Struts from 1 to 2: action failing with "page not found" exception

I am migrating the Struts from 1.1 to 2.3.35 version, I have written struts.xml looks like below:
==============================
<!-- <package name="default" extends="struts-default"> -->
<constant name="struts.devMode" value="true" />
<package name="struts-migration" extends="struts-default" namespace="/">
<global-results>
<result name="welcome" type="redirect">/pages/Login</result>
<result name="failure" type="redirect">add_new_test_exercise_status.jsp</result>
</global-results>
<action name="/pages/Login" class="org.apache.struts2.s1.Struts1Action">
<param name="className">struts.actions.LoginAction</param>
<result name="success">/struts/login.jsp</result>
</action>
</package>
==============================
When i am trying the access the page using the RUL, getting page not found exception.
http://localhost:8080/Struts/pages/Login
Could anyone please share any document or steps to migrate from struts 1.1 to 2.3.35 version .

Struts 2 action method and struts.convention.result.path not working

I have problem with Struts2 action method and struts.convention.result.path
Here is my struts.xml
<struts>
<constant name="struts.action.extension" value="" />
<constant name="struts.action.excludePattern" value="/.*\.(html|jsp),/static/.*"/>
<constant name="struts.convention.result.path" value="/WEB-INF/pages/" />
<package name="user" namespace="/user" extends="struts-default">
<action name="login" class="loginAction" method="login">
<result name="success">login.jsp</result>
</action>
</package>
<struts>
When I run url "localhost:8080/venus/user/login". It display error "HTTP Status 404 - /venus/user/login.jsp"
If I change login() method to execute() method, it works.
Or if I change to <result name="success">/WEB-INF/pages/login.jsp</result>, it works.
Can anyone explain and teach me how use action method with result path config in xml?
Thank you very much!
You should specify the absolute path name.
<result name="success">/login.jsp</result>
When using Convention plugin, xml configuration isn't needed:
com.mycompany.actions.user -> namespaces "user"
LoginAction -> login.action
LoginAction#execute -> success -> user/login.jsp
LoginAction#login -> success -> user/login(-login|-success).jsp

What's the difference between url "login" and "login.action"?

I'm using Struts2. I run a action named hello1.
I input the url: http://localhost:8081/MyStruts2/hello1, it works.
And I tried another url:http://localhost:8081/MyStruts2/hello1.action, it also works?
I don't think we need the ".action".
So why do some people add the suffix ".action"? Is it necessary?
And can we config the ".action" as another suffix such as ".go"?
.action is the default suffix added by Struts. To change it from '.action' to '.go'. Use the below in XML to change the suffix.
<struts>
<constant name="struts.action.extension" value="go"/>
<package name="default" namespace="/" extends="struts-default">
<action name="SayStruts2">
<result>pages/printStruts2.jsp</result>
</action>
</package>
</struts>

Struts 2 ajax validation unable to find interceptor class jsonValidationWorkflowStack

I'm trying to implement ajax validation in my Struts 2 application. I have included struts2-json-plugin in the build path. Whenever I start the server in Eclipse, I get the following error:
Unable to find interceptor class referenced by ref-name
jsonValidationWorkflowStack - interceptor-ref -
file:/C:/path/struts.xml:15:60
This is what my struts.xml looks like:
<struts>
<constant name="struts.url.includeParams" value="all" />
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="submitForm" class="action.FormAction" >
<interceptor-ref name="jsonValidationWorkflowStack"/>
<result>results.jsp</result>
<result name="input">index.jsp</result>
<result name="error">index.jsp</result>
</action>
</package>
</struts>
Why is this happening? I'm following the official struts2 ajax validation tutorial at.
You need to extend the "json-default" package.
The "struts-default" package doesn't know about the "jsonValidationWorkflowStack".

struts2.xml - can't include other .xml file

I am using struts2, for that my struts.xml file contains code like :
<?xml version="1.0" encoding="UTF-8" ?>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<include file="strutsAuthentication.xml"/>
<package name="default" extends="struts-default">
<interceptors>
<interceptor-stack name="crudStack">
<interceptor-ref name="checkbox" />
<interceptor-ref name="params" />
<interceptor-ref name="static-params" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
</package>
And i have specified all the required actions inside the strutsAuthentication.xml. That code is :
<struts>
<package name="authentication" extends="default" namespace="/authentication">
<action name="saveCountry" class="saveCountryAction">
<interceptor-ref name="defaultStack" />
<result name="success">/savecountry.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
When i am deploying my application into tomcat, it gives me warning that :
WARN (org.apache.struts2.components.Form:308) - No configuration found for the specified action: 'saveCountry' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
It means struts.xml can't include strutsAuthentication.xml. Anyone have a solution ?? Thanx in advance....
Got d solution.... For above problem i was done a mistake in calling the action from jsp page. So namespace name "authentication" should be included at the time of calling the action class. Final solution is : "authentication/saveCountry.action".
I don't know what version of struts2 you're using but if you're using the 2.1.x branch you should look at the convention plugin http://cwiki.apache.org/S2PLUGINS/convention-plugin.html. You can get rid of 99% XML configuration.
As an add note. We should never use "xyz.action" in JSP pages. If we later need or decide to change the url-pattern from .action to .do or .html etc. We have to change all JSP pages. A better approach to compose links is:
Link Text

Categories