Details
-
Improvement
-
Status: Closed
-
Minor
-
Resolution: Won't Fix
-
None
-
None
-
None
-
Patch
Description
I'm trying implement my own org.apache.struts2.components.UrlRenderer to replace default org.apache.struts2.components.ServletUrlRenderer
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); }
all fields are protected and only have setter method,can not access those fields or methods to build form action.