[ 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)