06 Struts Advanced Actions
06 Struts Advanced Actions
DispatchAction
Grouping Related Operations
Example
(Radio button named "operation")
public ActionForward execute (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
UserFormBean formBean = (UserFormBean)form;
if (radioButtonMatches(formBean, "createAccount")) {
return(createAccount(mapping, formBean, request, response));
} else if (radioButtonMatches(formBean, "changePassword")) {
return(changePassword(mapping, formBean, request,
response));
} else if (radioButtonMatches(formBean, "deleteAccount")) {
return(deleteAccount(mapping, formBean, request, response));
} else {
return(makeErrorMessage());
}
}
Example: Outline
• Perform different operations depending on
which radio button is selected
• Use same basic Action class in all cases
return fi
na l result forward to
JSP
Use bean:write
to output bean
properties.
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;
ForwardAction
• Scenario
– You already have MVC-based servlet/JSP combo that
uses beans
• Repeated calls to request.getParameter in servlet
– You already have standalone JSP page that uses beans
• Scripting elements or jsp:setProperty
• Problems
– Tedious and repetitive reading of request parameters and
setting of bean properties
– Not yet ready to redo code in Struts
• Goal
– Use Struts form beans facility, but keep basic servlet/JSP
structure in place
30 Apache Struts: Advanced Actions www.coreservlets.com
Steps in Using ForwardAction
• Change bean
– Need to extend ActionForm
– Do not need to implement Serializable
– Do not need to check for null and empty strings
• Change servlet
– Do not need to create bean or check
Request/Session/Application for null
– Do not need to call request.getParameter
• Change form
– ACTION should refer to blah.do
import org.apache.struts.action.*;
...
}
40 Apache Struts: Advanced Actions www.coreservlets.com
ForwardAction Version: Servlet
public class ShowColors2 extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
ColorBean2 colorBean =
(ColorBean2)session.getAttribute("colorBean2");
if (colorBean.getForegroundColor().equals
(colorBean.getBackgroundColor())) {
colorBean = new ColorBean2();
session.setAttribute("colorBean2", colorBean);
}
String address = "/WEB-INF/results/show-colors2.jsp";
RequestDispatcher dispatcher =
request.getRequestDispatcher(address);
dispatcher.forward(request, response);
}
}
ForwardAction Version:
struts-config.xml
<struts-config>
<form-beans>
...
<form-bean name="colorBean2"
type="coreservlets.ColorBean2"/>
</form-beans>
<action-mappings>
...
<action path="/showColors2"
type="org.apache.struts.actions.ForwardAction"
name="colorBean2"
scope="session"
parameter="/ShowColors2"/>
</action-mappings>
</struts-config>
ForwardAction: Form
ForwardAction: Results
Summary
• DispatchAction
– Use struts-config.xml to list the parameter used to
determine which method will be called
• <action path="..." type="..." parameter="operation">
– Extend DispatchAction instead of Action
• Directly implement desired methods
– In form, supply parameter with given name
– Form bean needs no accessors for special parameter
• ForwardAction
– Use struts-config.xml to declare the bean and give
address of servlet that will use it
• <action path="/blah"
type="org.apache.struts.actions.ForwardAction"
name="bean-name"
scope="request-session-or-application"
48 parameter="/path-to-servlet"/>
Apache Struts: Advanced Actions www.coreservlets.com
Questions?