zhouyanming created WW-4151:
-------------------------------

             Summary: 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


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

Reply via email to