struts2常见的result类型的用法
2013-05-26 10:53
288 查看
这个是官方文档的上面对result类型的描述
我自己又找了一个中文的:
本文重点分享一下几个常用的result类型之后的原理:
一:dispatcher
从源码分析:
结果又三个方向:
而forward和include是差不多的。
二:chain
主要用于把相关的几个action连接起来,共同完成一个功能
原理是根据action所在的namespace,action,method创建一个proxy代理,并且执行代理的过程。由于是在多个Action之间在同一个http请求中传递,所以可以共享其中的资源,这就是上面history的意思。根据以前context中的内容,共享给下面action.
三:redirect和redirection
由于都是一个类ServletRedirectResult中的方法,所以可以当做一个来考虑。
方法的结果都是使用这个方法作为跳转:sendRedirect(response, finalLocation);重定向。
其他的velocity,freemarker,是整合了模板引擎,这个以前我竟然不知道,google了一下,发现还是很简单的。大家可以试着加到struts里面。
我自己又找了一个中文的:
本文重点分享一下几个常用的result类型之后的原理:
一:dispatcher
从源码分析:
public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { if (LOG.isDebugEnabled()) { LOG.debug("Forwarding to location " + finalLocation); } PageContext pageContext = ServletActionContext.getPageContext(); if (pageContext != null) { pageContext.include(finalLocation); } else { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation); //add parameters passed on the location to #parameters // see WW-2120 if (StringUtils.isNotEmpty(finalLocation) && finalLocation.indexOf("?") > 0) { String queryString = finalLocation.substring(finalLocation.indexOf("?") + 1); Map<String, Object> parameters = getParameters(invocation); Map<String, Object> queryParams = urlHelper.parseQueryString(queryString, true); if (queryParams != null && !queryParams.isEmpty()) parameters.putAll(queryParams); } // if the view doesn't exist, let's do a 404 if (dispatcher == null) { response.sendError(404, "result '" + finalLocation + "' not found"); return; } //if we are inside an action tag, we always need to do an include Boolean insideActionTag = (Boolean) ObjectUtils.defaultIfNull(request.getAttribute(StrutsStatics.STRUTS_ACTION_TAG_INVOCATION), Boolean.FALSE); // If we're included, then include the view // Otherwise do forward // This allow the page to, for example, set content type if (!insideActionTag && !response.isCommitted() && (request.getAttribute("javax.servlet.include.servlet_path") == null)) { request.setAttribute("struts.view_uri", finalLocation); request.setAttribute("struts.request_uri", request.getRequestURI()); dispatcher.forward(request, response); } else { dispatcher.include(request, response); } } }
结果又三个方向:
pageContext.include(finalLocation); dispatcher.forward(request, response); dispatcher.include(request, response);
而forward和include是差不多的。
二:chain
主要用于把相关的几个action连接起来,共同完成一个功能
public void execute(ActionInvocation invocation) throws Exception { // if the finalNamespace wasn't explicitly defined, assume the current one if (this.namespace == null) { this.namespace = invocation.getProxy().getNamespace(); } ValueStack stack = ActionContext.getContext().getValueStack(); String finalNamespace = TextParseUtil.translateVariables(namespace, stack); String finalActionName = TextParseUtil.translateVariables(actionName, stack); String finalMethodName = this.methodName != null ? TextParseUtil.translateVariables(this.methodName, stack) : null; if (isInChainHistory(finalNamespace, finalActionName, finalMethodName)) { addToHistory(finalNamespace, finalActionName, finalMethodName); throw new XWorkException("Infinite recursion detected: " + ActionChainResult.getChainHistory().toString()); } if (ActionChainResult.getChainHistory().isEmpty() && invocation != null && invocation.getProxy() != null) { addToHistory(finalNamespace, invocation.getProxy().getActionName(), invocation.getProxy().getMethod()); } addToHistory(finalNamespace, finalActionName, finalMethodName); HashMap<String, Object> extraContext = new HashMap<String, Object>(); extraContext.put(ActionContext.VALUE_STACK, ActionContext.getContext().getValueStack()); extraContext.put(ActionContext.PARAMETERS, ActionContext.getContext().getParameters()); extraContext.put(CHAIN_HISTORY, ActionChainResult.getChainHistory()); if (LOG.isDebugEnabled()) { LOG.debug("Chaining to action " + finalActionName); } proxy = actionProxyFactory.createActionProxy(finalNamespace, finalActionName, finalMethodName, extraContext); proxy.execute(); }
原理是根据action所在的namespace,action,method创建一个proxy代理,并且执行代理的过程。由于是在多个Action之间在同一个http请求中传递,所以可以共享其中的资源,这就是上面history的意思。根据以前context中的内容,共享给下面action.
三:redirect和redirection
由于都是一个类ServletRedirectResult中的方法,所以可以当做一个来考虑。
protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { ActionContext ctx = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); if (isPathUrl(finalLocation)) { if (!finalLocation.startsWith("/")) { ActionMapping mapping = actionMapper.getMapping(request, Dispatcher.getInstance().getConfigurationManager()); String namespace = null; if (mapping != null) { namespace = mapping.getNamespace(); } if ((namespace != null) && (namespace.length() > 0) && (!"/".equals(namespace))) { finalLocation = namespace + "/" + finalLocation; } else { finalLocation = "/" + finalLocation; } } // if the URL's are relative to the servlet context, append the servlet context path if (prependServletContext && (request.getContextPath() != null) && (request.getContextPath().length() > 0)) { finalLocation = request.getContextPath() + finalLocation; } ResultConfig resultConfig = invocation.getProxy().getConfig().getResults().get(invocation.getResultCode()); if (resultConfig != null) { Map<String, String> resultConfigParams = resultConfig.getParams(); for (Map.Entry<String, String> e : resultConfigParams.entrySet()) { if (!getProhibitedResultParams().contains(e.getKey())) { String potentialValue = e.getValue() == null ? "" : conditionalParse(e.getValue(), invocation); if (!suppressEmptyParameters || ((potentialValue != null) && (potentialValue.length() > 0))) { requestParameters.put(e.getKey(), potentialValue); } } } } StringBuilder tmpLocation = new StringBuilder(finalLocation); urlHelper.buildParametersString(requestParameters, tmpLocation, "&"); // add the anchor if (anchor != null) { tmpLocation.append('#').append(anchor); } finalLocation = response.encodeRedirectURL(tmpLocation.toString()); } if (LOG.isDebugEnabled()) { LOG.debug("Redirecting to finalLocation " + finalLocation); } sendRedirect(response, finalLocation); }
方法的结果都是使用这个方法作为跳转:sendRedirect(response, finalLocation);重定向。
其他的velocity,freemarker,是整合了模板引擎,这个以前我竟然不知道,google了一下,发现还是很简单的。大家可以试着加到struts里面。
相关文章推荐
- struts2中常用Result类型的用法
- struts2中常用Result类型type的用法
- struts2中常用Result类型(type)的用法
- struts2中常用Result类型的用法
- struts2中常用Result类型(type)的用法
- struts2中常用Result类型type的用法
- Struts2中result配置中常见的几种视图转发类型
- struts2中常用Result类型的用法
- struts2中常用Result类型的用法
- struts2由浅入深专题分享——result-types 第一回 result-type类型及常见的几个类型 by:丹恋耗
- struts2 Result类型和对应的用法
- struts2 Result类型和对应的用法
- Struts2 result type(结果类型)
- S5.2_Struts2_ResultTypes Result类型
- struts2 result type(结果类型)
- struts2 result类型
- Struts2 的stream result用法 文件下载
- Struts2:Result结果类型
- struts2:lesson three:Annotation配置,实现request,session.application的四种方式,Result类型
- Struts2 result type(结果类型)