[
https://issues.apache.org/jira/browse/WW-4151?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Lukasz Lenart updated WW-4151:
------------------------------
Priority: Minor (was: Major)
> 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
> Reporter: zhouyanming
> Priority: Minor
> Fix For: 2.3.17
>
> 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 is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira