I wonder whether i can use 1 action to load data and update it?
It mean i have a page call about.jsp, manager will click a link to access this page. after redirect into this page, this page load content of about and update content if user edited data but two tasks can be use 1 action.
my i dea is, user use a action call AboutAction to load data to about.jsp page, after end user edited data on about.jsp and click submit, it will send data to AboutAction and update it?
Can i do that? and how?
First thing What you asked is one of the beauty of Struts2
xml :
<action name="AboutAction" class="AboutAction" method="load">
<result>showMe.jsp</result>
<result name="input">about.jsp</result>
</action>
<action name="AboutAction" class="AboutAction" method="update">
<result>showMe.jsp</result>
<result name="input">editsuccess.jsp</result>
</action>
Action :
public String load(){
//logic to load
return SUCCESS;
}
public String update(){
//logic to update
return SUCCESS;
}
Related
I have a program in which business logic return some data. that data needs to show on the jsp. i am able to forward to the jsp based on the result but how can i send the return value.
e.g.
public String createuser(String strUser,String strPassword)
{
String strReturnValue="S0000";
try
{
// My code;
}
catch(Exception ex)
{
}
return strReturnValue+"Token";
}
Struts.xml
<action name="RegUser" class="....">
<result name="success">/UIShow.jsp</result>
<result name="error>/UIError.jsp</result>
</action>
in jsp i want to show this token value on success; How can I do this?
You may want to check out the Hello World Struts 2 application because it provides a good example of how to do this.
In your Action class, you can create a String field and appropriate getter method for the token value so that your JSP can retrieve it. In your RegUser action method you will want to assign the field to the result from the business logic, like tokenValue = createUser(user, password);
In your UIShow.jsp you can use a struts 2 tag s:property to display the token value, like <s:property value="tokenValue"/>
Or, since this is just a String, it may be simpler for you to use the addActionMessage method from ActionSupport in your Action class (pass in the String result of the business logic into addActionMessage) and then use the s:actionmessage tag in your JSP to display the token value.
I'm trying to find a way to configure in struts.xml an error message for each type of exception that can be thrown by an Action class. In an action class I could accomplish something similar by catching an exception, calling addActionError(String), and rethrowing the exception (provided an <exception-mapping> exists). Is there a way to do this through configuration?
As a reference point, this functionality exists in Struts1 with the key attribute on an exception handler - I'm hoping to be able to do something similar.
<exception key="some.key"
type="java.io.IOException"
handler="com.yourcorp.ExceptionHandler"/>
In strut2 also you can define exception mappings. Refer http://struts.apache.org/release/2.1.x/docs/exception-configuration.html. You can have a common error.jsp which displays a message that is looked up based on the class name of the exception.
In Struts2 you can use the following mapping to pass on the key/message to result (result can be a jsp or another action class).
<global-exception-mappings>
<exception-mapping exception="com.test.exception.MyCustomException" result="error">
<param name="param">display.custom.error</param>
</exception-mapping>
</global-exception-mappings>
<global-results>
<result name="error" type="chain">handleAction</result>
</global-results>
<action name="handleAction" class="HandleExceptionAction">
<result name="result">/WEB-INF/jsp/error.jsp</result>
</action>
If it an action class, in case of chaining (if the user wants to process the exception) then you need to have a corresponding attribute in Action class with getters and setters.
public class HandleExceptionAction extends ActionSupport implements
ServletRequestAware, SessionAware {
private **String param**;
private HttpServletRequest httpRequest;
private static final Log LOG = LogFactory.getLog(InputAction.class);
public String execute(){
LOG.debug("inside excute().....");
LOG.debug("Parameter passed:" + param);
System.out.println("Parameter passed:" + param);
return "result";
}
I am using spring injection, hope it will hep you.
This worked a month ago and now i reload the code and it doesn't work. here is my struts snip
<action name="checkManager" class="CheckAction">
<result>/pages/check_manager.jsp</result>
</action>
<action name="submitFile" class="SubmitFileAction">
<result name="success">/pages/submit_file.jsp</result>
<result name="error">/pages/check_manager.jsp</result>
</action>
So, the first page is checkManager. it has a button that calls the submitFile action. When that fires, it checks a password, if it fails the action class sends an error result. Now a month ago the result error above would redirect the user back to the original check_manager.jsp page complete with data that was loaded originally and the error message. Today, it redirects the user to the raw check_manager.jsp page. no data, its like the servlet never fired and its just rendering a blank jsp page. I checked the source history and nothing has changed in this application.
I don't understand why this would stop working, can anyone give me an idea? i have to present this to the client in about an hour and a half so i'm really stuck here.
note, i tried changing the error to this
<result name="error" type="redirectAction">checkManager</result>
and I get my data back, but i loose my error message which isn't a good thing. ugh, any ideas?
if (enteredHash.equals(storedHash)) {
_log.debug("The password matched");
UserSession<User> userSession = (UserSession<User>) session
.get("user");
#do logic#
} else {
_log.debug("The password didn't match");
addActionError("The password you entered was incorrect, nothing was sent to the bank.");
return ActionSupport.ERROR;
}
return ActionSupport.SUCCESS;
my jsp
<s:if test="hasActionErrors()">
<div class="errors">
<s:actionerror/>
</div><br>
</s:if>
again, this worked perfectly a month ago. All i did was check out that branch which has been untouched and deploy it. Now it doesn't work.
A quick fix could be to add this to getCheckList in the CheckAction:
public Collection<Check> getCheckList() {
ActionContext.getContext().getSession().put("checkList", checkList);
return checkList;
}
and add this to the SubmitFileAction:
public Collection<Check> getCheckList() {
return (Collection<Check>) ActionContext.getContext().getSession().get("checkList");
}
This is not a good permanent solution but should get you where you need to get in a crunch!
I have a question with respect to interceptors in Struts2
Struts2 provides very powerful mechanism of controlling a request using Interceptors. Interceptors are responsible for most of the request processing. They are invoked by the controller before and after invoking action, thus they sits between the controller and action. Interceptors performs tasks such as Logging, Validation, File Upload, Double-submit guard etc.
I have taken this above lines from:
http://viralpatel.net/blogs/2009/12/struts2-interceptors-tutorial-with-example.html
In this example you will see how the interceptors are invoked both before and after the execution of the action and how the results are rendered back to the user.
I have taken this above lines from
http://www.vaannila.com/struts-2/struts-2-example/struts-2-interceptors-example-1.html
I have written a basic interceptor and plugged it to my Action class:
public class InterceptorAction implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Action class has been called : ");
return success;
}
}
struts.xml
<action name="login" class="com.DBAction">
<interceptor-ref name="mine"></interceptor-ref>
<result name="success">Welcome.jsp</result>
<result name="error">Login.jsp</result>
</action>
As per the above statements from their sites , i assumed that this line Action class has been called would be two times on the console (That is before the Action and after the Action class ) , but it has been printed only once?
PLease let me know , if my understanding is wrong , or the authors were wrong in that site ??
Not taking the time to read the page lets clear a few things up...
You are missing an important step in your interceptor.
Struts2, uses an object called ActionInvocation to manage calling the interceptors.
Lets give ActionInvocation a name (invocation) and show how the framework starts the ball rolling:
ActionInvocation invocation;
invocation.invoke(); //this is what the framework does... this method then calls the first interceptor in the chain.
Now we know interceptors can do pre-processing and post-processing... but the interface only defines one method to do the work of the interceptor (init and delete are just life cycle)! If the interface defined a doBefore and doAfter it would be easy so there must be some magic, happening...
As it turns out you are responsible for giving control back to action invocation at some point in your interceptor. This is a requirement. If you don't give control back to the ActionInvocation you will break the chain.
So when creating an interceptor you do the following steps
Create a class which implements com.opensymphony.xwork2.interceptor.Interceptor
[optional] do pre-processing work
call ActionInvocations invoke method to carry on processing down the stack and capture the return value.
[optional] do post processing as the above call unwinds.
return the string from step 3 (the result string) unless you have reason to do otherwise.
And here is a complete but pretty useless example:
package com.quaternion.interceptors;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor{
#Override
public void destroy() {
//nothing to do
}
#Override
public void init() {
//nothing to do
}
#Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Something to do before the action!");
String resultString = invocation.invoke();
System.out.println("Something to do after the action!");
return resultString;
//if you are not doing post processing it is easiest to write
//return invocation.invoke();
}
}
We are working on SmartGWT 2.2, and Struts2.
I have created a sample form(DynamicForm) which asks to upload file and mapped action class for processing file upload.
I have setup form.setCanSubmit(true);
My call is succefully gets transferred to struts action class and file is getting uploaded also.
struts.xml
<action name="FileUploadAction" class="FileUploadAction" >
<result name="success" type="redirect">success</result>
</action>
But the problem is that control is not getting back to...
form.submit(new DSCallback(){
#Override
public void execute(DSResponse response, Object rawData,
DSRequest request) {
System.out.println("Response: " + response.getHttpResponseCode());
SC.say("back");
System.out.println("BACK...........");
}
});
I read in Smartgwt, Dynamic Form API that,
if this.canSubmit is true, callback is ignored..
As, we are not using DataSource, I have to use this.canSubmit to true.
Response from ActionClass gets struck at 'http://127.0.0.1:8888/success'
So, what is an alternate solution?
you can use hidden iframe and JSNI call that hidden iframe from your server action class....
Thank you.