You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Lukasz Lenart (JIRA)" <ji...@apache.org> on 2014/09/16 08:43:33 UTC

[jira] [Updated] (WW-4151) add getter methods for org.apache.struts2.components.Form

     [ https://issues.apache.org/jira/browse/WW-4151?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Lukasz Lenart updated WW-4151:
------------------------------
    Fix Version/s:     (was: 2.3.18)
                   2.5

> add getter methods for org.apache.struts2.components.Form
> ---------------------------------------------------------
>
>                 Key: WW-4151
>                 URL: https://issues.apache.org/jira/browse/WW-4151
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Core Actions
>            Reporter: zhouyanming
>            Priority: Minor
>             Fix For: 2.5
>
>         Attachments: WW-4151.patch
>
>
> I'm trying implement my own org.apache.struts2.components.UrlRenderer to replace default org.apache.struts2.components.ServletUrlRenderer
> {code:java}
> 	public void renderFormUrl(Form formComponent) {
> 		String namespace = formComponent.determineNamespace(
> 				formComponent.namespace, formComponent.getStack(),
> 				formComponent.request);
> 		String action;
> 		if (formComponent.action != null) {
> 			action = formComponent.findString(formComponent.action);
> 		} else {
> 			// no action supplied? ok, then default to the current request
> 			// (action or general URL)
> 			ActionInvocation ai = (ActionInvocation) formComponent.getStack()
> 					.getContext().get(ActionContext.ACTION_INVOCATION);
> 			if (ai != null) {
> 				action = ai.getProxy().getActionName();
> 				namespace = ai.getProxy().getNamespace();
> 			} else {
> 				// hmm, ok, we need to just assume the current URL cut down
> 				String uri = formComponent.request.getRequestURI();
> 				action = uri.substring(uri.lastIndexOf('/'));
> 			}
> 		}
> 		Map actionParams = null;
> 		if (action != null && action.indexOf("?") > 0) {
> 			String queryString = action.substring(action.indexOf("?") + 1);
> 			actionParams = urlHelper.parseQueryString(queryString, false);
> 			action = action.substring(0, action.indexOf("?"));
> 		}
> 		ActionMapping nameMapping = actionMapper
> 				.getMappingFromActionName(action);
> 		String actionName = nameMapping.getName();
> 		String actionMethod = nameMapping.getMethod();
> 		final ActionConfig actionConfig = formComponent.configuration
> 				.getRuntimeConfiguration().getActionConfig(namespace,
> 						actionName);
> 		if (actionConfig != null) {
> 			ActionMapping mapping = new ActionMapping(actionName, namespace,
> 					actionMethod, formComponent.parameters);
> 			String result = urlHelper
> 					.buildUrl(formComponent.actionMapper
> 							.getUriFromActionMapping(mapping),
> 							formComponent.request, formComponent.response,
> 							actionParams, null, formComponent.includeContext,
> 							true);
> 			formComponent.addParameter("action", result);
> 			// let's try to get the actual action class and name
> 			// this can be used for getting the list of validators
> 			formComponent.addParameter("actionName", actionName);
> 			try {
> 				Class clazz = formComponent.objectFactory
> 						.getClassInstance(actionConfig.getClassName());
> 				formComponent.addParameter("actionClass", clazz);
> 			} catch (ClassNotFoundException e) {
> 				// this is OK, we'll just move on
> 			}
> 			formComponent.addParameter("namespace", namespace);
> 			// if the name isn't specified, use the action name
> 			if (formComponent.name == null) {
> 				formComponent.addParameter("name", actionName);
> 			}
> 			// if the id isn't specified, use the action name
> 			if (formComponent.getId() == null && actionName != null) {
> 				formComponent.addParameter("id",
> 						formComponent.escape(actionName));
> 			}
> 		} else if (action != null) {
> 			// Since we can't find an action alias in the configuration, we just
> 			// assume the action attribute supplied is the path to be used as
> 			// the URI this form is submitting to.
> 			// Warn user that the specified namespace/action combo
> 			// was not found in the configuration.
> 			if (namespace != null && LOG.isWarnEnabled()) {
> 				LOG.warn("No configuration found for the specified action: '"
> 						+ actionName
> 						+ "' in namespace: '"
> 						+ namespace
> 						+ "'. Form action defaulting to 'action' attribute's literal value.");
> 			}
> 			String result = urlHelper.buildUrl(action, formComponent.request,
> 					formComponent.response, null, null,
> 					formComponent.includeContext, true);
> 			formComponent.addParameter("action", result);
> 			// namespace: cut out anything between the start and the last /
> 			int slash = result.lastIndexOf('/');
> 			if (slash != -1) {
> 				formComponent.addParameter("namespace",
> 						result.substring(0, slash));
> 			} else {
> 				formComponent.addParameter("namespace", "");
> 			}
> 			// name/id: cut out anything between / and . should be the id and
> 			// name
> 			String id = formComponent.getId();
> 			if (id == null) {
> 				slash = result.lastIndexOf('/');
> 				int dot = result.indexOf('.', slash);
> 				if (dot != -1) {
> 					id = result.substring(slash + 1, dot);
> 				} else {
> 					id = result.substring(slash + 1);
> 				}
> 				formComponent.addParameter("id", formComponent.escape(id));
> 			}
> 		}
> 		// WW-1284
> 		// evaluate if client-side js is to be enabled. (if validation
> 		// interceptor does allow validation eg. method is not filtered out)
> 		formComponent.evaluateClientSideJsEnablement(actionName, namespace,
> 				actionMethod);
> 	}
> {code}
> all fields are protected and only have setter method,can not access those fields or methods to build form action.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)