Uploaded image for project: 'Struts 2'
  1. Struts 2
  2. WW-4151

add getter methods for org.apache.struts2.components.Form

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Minor
    • Resolution: Won't Fix
    • None
    • None
    • Core Actions
    • 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.

      Attachments

        1. WW-4151.patch
          7 kB
          Yanming Zhou

        Activity

          People

            Unassigned Unassigned
            quaff Yanming Zhou
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: