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

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

VotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    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

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

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

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment