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

Reply via email to