Passing parameters in URL query string to Action through interceptor - struts2

I have an interceptor that is working fine except the query string is not being passed on to the action from the interceptor.
<action name="EditIroCase" class="iro.action.IroCaseAction">
<interceptor-ref name="authIro"/>
<result name="success">iro/IroCaseFORM.jsp</result>
</action>
URL: /EditIroCase.action?id=123
Action is an existing one that I am adding the interceptor to. Implementing ParametersAware in Action to get ID from URL and that works fine.
Tried a couple different things, but can't seem to make it work. Used lots of interceptors, just never needed to maintain a param across its execution.

Interceptors work slightly different rather than actions. Because they belong to the action. So you can't add an action to the interceptor, but interceptor to the action.
You should know if you are using xml configuration or annotations, or another configuration provider, interceptors are stored in the collection such as List or Set, doesn't matter, but all of them in one place. Using <interceptor-ref> tag inside the <action> overrides the interceptor's config. By default actions are configured using <default-interceptor-ref> tag, which is defined in the struts-default.xml from the core package, and it points to defaultStack. This stack is designed to serve all your needs, but if you use a custom interceptor then you should explicitly add reference to defaultStack or create a custom stack which you would reference.
<action name="EditIroCase" class="iro.action.IroCaseAction">
<interceptor-ref name="authIro"/>
<interceptor-ref name="defaultStack"/>
<result name="success">iro/IroCaseFORM.jsp</result>
</action>
Now parameters should be populated.

Related

struts 2 : how to pass a global parameter from one action to another

I have a case like this:
JSP -> ACTION 1 -> Redirect-> Action 2 -> JSP
While redirecting we loose all the parameters. But there is one parameter that I'd like to pass from one action to another. The parameter is always the same for all actions.
I know that it is possible to write the following code and it works :
<action name="myAction" class="myActionClass" method="doThis">
<result name="success" type="redirect">doThat.action?myParam=${myParam}</result>
</action>
The only thing is that I'd like to pass the parameter automatically from one action to another when I have a redirect without writing anything in my action tag, but I don't know how to code it.
Is it possible with struts 2 to do that?
Someone suggested to put it in global-results, I tried, but still haven't succeeded.
You can set the property in to the session as an attribute and the same attribute can be taken back from the session irrespective of the action class you are using.
session.setAttribute(name,value);
session.getAttribute(name)

Pass attribute into struts2 action via struts.xml

How can I pass an attribute into my struts2 java action that tells me whether the action was called from one URL path / action mapping vs another?
I figured I could put something in the struts.xml for two action mappings but use the same java action and just pass in a flag into the action.
You'll want to use the <param/> tag. I do this frequently for actions that handle both adding and editing an entity, as the fields, validations, and whatnot are virtually identical. Here's an example of that.
struts.xml
<action name="users/add" class="AddEditUserAction">
<param name="edit">false</param>
<result name="input">/WEB-INF/jsp/addEditUser.jsp</result>
</action>
<action name="users/{username}/edit" class="AddEditUserAction">
<param name="edit">true</param>
<result name="input">/WEB-INF/jsp/addEditUser.jsp</result>
</action>
The Action
public class AddEditUserAction {
private boolean isEdit;
// this is called by the struts.xml to set the value
public void setEdit(final boolean edit) {
isEdit = edit;
}
}
In order for this to work, you need the static parameters interceptor in your stack (it's included by default).
I question the design.
I'd handle it by specifying a method in the action configuration for one or both mappings.
The method(s) would set a flag in the action and call the "guts" of the action, which would query the flag value, and proceed accordingly.

How to exclude action methods frm validation in struts2

How to exclude action methods from validation in struts2 ... for example i wann do validation for one action login with two fileds and other action method in same action class say test methode with filed message..... how can i do it?? using one xml file?
You have to add the following to your xml config file in order to change your validation interceptor.
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse,YOUR_METHOD_NAME</param>
</interceptor-ref>
Alternatively you can annotate the method with
#org.apache.struts2.interceptor.validation.SkipValidation

Can you do a struts2 action redirect using POST instead of GET?

<action name="actionA" class="com.company.Someaction">
<result name="success" type="redirect-action">
<param name="actionName">OtherActionparam>
<param name="paramA">${someParams}</param>
<param name="paramB">${someParams}</param>
<param name="aBoatLoadOfOtherParams">${aBoatLoadOfOtherParams}</param>
</result>
</action>
In the above action map, I am redirecting from SomeAction to OtherAction. I am having issues, because unfortunately I need to pass a large amount of data between the two actions. IE7 will only allow GET requests to be like 2k, so its blowing up when I'm just over that limit when the response calls a get request to the other action.
Is it possible for me to set this redirect, to end up with a POST being called to the other action?
As the docs states:
The only way to pass data [after a redirection] is through
the session or with web parameters (url?name=value) [i.e., query string for a GET request]
Perhaps a case for action chaining? I'm not sure, and it's not usually recommended, but it seems that you scenario is rather unusual, so it might pay to take a look.
In this case, we are not really making a redirection, i.e., we are not going back to the client, but keeping everything inside the server. Supposedly, then, the full interceptor stack is executed again - and the posted data should impact on the new action, one would hope...

Referencing actionerror from httpheader result in struts.xml

In my TestClass action I am setting an action error using addActionError method. I have an action defined in the struts.xml as following
<action name="TestAction" class="TestClass">
<result name="input">/jsp/test.jsp</result>
<result name="error" type="httpheader">
<param name="error">409</param>
<param name="errorMessage">${SOME-EXPRESSION}</param>
</result>
</action>
The intent is to have the error message display whatever was added using addActionError. According to the org.apache.struts2.dispatcher.HttpHeaderResult documentation, I should be able to use Ognl expressions within errorMessage parameter.
So, is it possible to put something in place of ${SOME-EXPRESSION} that will reference actionerror in this scenario.(I tried ${actionerror} but it didn't work)
I know that I can have a workaround by declaring my own field (for example "errorText") in the action class and using that insteda of addActionError referencing it using ${errorText} inside the param tags. But before I go that route, want to make sure that's the only way.
Action errors are stored in a list, so you'll have to show something like ${actionErrors[0]}. But keep in mind this way it will only show your first added error, not all those you have included using addActionError.

Resources