ignore

Back to Examples

Actions

Strecks increases the power of actions by creating a separation between controller actions and action beans. Common request workflow logic can be placed in controller actions. This frees the inheritance hiearchy of action beans, and allows these be be placed in POJOs implementing an action controller defined interface. We see this clearly in the example of a form submission. The plain Struts example is shown below:

/**
* Plain Struts action handling a form submission
*/
public class SubmitEditBookingAction extends ActionSupport
{

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception
	{

		HolidayBookingForm holidayBookingForm = (HolidayBookingForm) form;

		if (request.getAttribute(Globals.CANCEL_KEY) == null)
		{
			HolidayBookingService holidayBookingService = (HolidayBookingService) getWebApplicationContext().getBean(
					"holidayBookingService");

			HolidayBooking holidayBooking = new HolidayBooking();
			holidayBookingForm.writeTo(holidayBooking);

			holidayBookingService.updateHolidayBooking(holidayBooking);

			request.setAttribute("displayMessage", "Successfully updated entry: " + holidayBooking.getTitle());
		}
		else
		{
			request.setAttribute("displayMessage", "Cancelled operation");
		}

		request.getSession().removeAttribute("holidayBookingForm");
		return mapping.findForward("success");

	}

}

The logic to identify a form as cancelled is part of the request handling workflow. This logic is absent from the Strecks action bean.

/**
* Strecks action handling a form submission
*/
@Controller(name = BasicSubmitController.class)
public class SubmitEditBookingAction implements BasicSubmitAction
{

	private HolidayBookingForm form;

	private HolidayBookingService holidayBookingService;

	private WebHelper webHelper;

	public void preBind()
	{
	}

	public String cancel()
	{
		webHelper.setRequestAttribute("displayMessage", "Cancelled operation");
		webHelper.removeSessionAttribute("holidayBookingForm");
		return "success";
	}

	public String execute()
	{
		HolidayBooking holidayBooking = form.getBooking();
		holidayBookingService.updateHolidayBooking(holidayBooking);

		webHelper.setRequestAttribute("displayMessage", "Successfully updated entry: " + holidayBooking.getTitle());
		webHelper.removeSessionAttribute("holidayBookingForm");

		return "success";
	}

	//dependency injection omitted

}

Notice how the @Controller annotation is used to identify the controller. The controller in this case mandates the use of the interface BasicSubmitAction. The controller implementation is shown below:

@ActionInterface(name = BasicSubmitAction.class)
public class BasicSubmitController extends BaseBasicController
{

	@Override
	protected ViewAdapter executeAction(Object actionBean, ActionContext context)
	{
	
		BasicSubmitAction action = (BasicSubmitAction) actionBean;
		ActionForm form = context.getForm();
	
		HttpServletRequest request = context.getRequest();
	
		boolean cancelled = false;
		if (request.getAttribute(Globals.CANCEL_KEY) != null)
		{
			cancelled = true;
		}
	
		if (form instanceof BindingForm && !cancelled)
		{
			action.preBind();
			BindingForm bindingForm = (BindingForm) form;
			bindingForm.bindInwards();
		}
	
		String result = cancelled ? action.cancel() : action.execute();
		return getActionForward(context, result);
	
	}

}

You are free to define your own controller implementations at any time, although a typical application will only use a few different controllers.

SourceForge.net logo java.net Member logo Copyright © 2005-2007 Realsolve Solutions