`
40020072
  • 浏览: 72733 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2零配置的方法

阅读更多

为Struts2增加了一种返回类型,直接通过action方法的返回值确定要返回的页面.

<result-types>
     <result-type name="direct" class="javacommon.struts2.dispatcher.DirectResult"/>
</result-types>
 

配合struts2通符符,实现零配置,以下为配置文件action配置的全部

<package name="default" namespace="/demo" extends="custom-default">  
    <action name="*/*" method="{2}" class="com.kingsoft.demo.action.{1}Action">  
       <result name="*" type="direct">通过Action直接返回</result>  
    </action>        
</package>
 

实现forward请求的java代码

/**进入更新页面*/  
public String edit() {   
    blog = (Blog)blogManager.getById(id);   
    return "/demo/Blog/edit.jsp";   
}
 

实现redirect的做法是,前面增加了一个"!"号

/**保存更新*/  
public String update() {   
    blogManager.update(this.blog);   
    return "!/demo/Blog/list.action";   
}
 
PS.forward redirect区别:
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。还有,转发是在web应用程序之内进行的,可以访问web应用程序所设定的内部目录,像是WEB-INF目录,只能在Web应用程序中进行,不能指定至其它的Web应用程序的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。web应用程序会要求客户端浏览器重新发出请求地址,客户端会重新连接至所指定的地址,因此浏览器的地址会出现重新导向的信息,重新导向后的请求由浏览器发出,所以不能访问Web应用程序中的隐藏目录,像是WEB-INF,重新是由浏览器重新要求一个网页,可以指定至其他的Web应用程序地址。

1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.

分享到:
评论
2 楼 40020072 2008-09-11  
/*
 * $Id: PlainTextResult.java 471756 2006-11-06 15:01:43Z husted $
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */


package javacommon.struts2.dispatcher;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.util.TextParseUtil;

/**
 * <pre>
 *	直接使用Action执行方法的返回字符串作为Http请求的forward/redirect的转向,
 *  以感叹号开头(!)的为redirect转向,反之为forward转向.
 * </pre>
 *
 */
public class DirectResult extends StrutsResultSupport {

    private static final Log _log = LogFactory.getLog(DirectResult.class);

    private static final long serialVersionUID = 3633371605905583950L;

	private boolean prependServletContext = true;

    public DirectResult() {
        super();
    }

    public DirectResult(String location) {
        super(location);
    }

    /**
     * Sets whether or not to prepend the servlet context path to the redirected URL.
     *
     * @param prependServletContext <tt>true</tt> to prepend the location with the servlet context path,
     *                              <tt>false</tt> otherwise.
     */
    public void setPrependServletContext(boolean prependServletContext) {
        this.prependServletContext = prependServletContext;
    }
    
    /* (non-Javadoc)
     * @see org.apache.struts2.dispatcher.StrutsResultSupport#doExecute(java.lang.String, com.opensymphony.xwork2.ActionInvocation)
     */
    protected void doExecute(String finalLocation,ActionInvocation invocation) throws Exception {
        HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(HTTP_RESPONSE);
        HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(HTTP_REQUEST);
       
        String resultCodeAsLocation = invocation.getResultCode();
        if(resultCodeAsLocation == null) {
        	response.sendError(404, "result '" + resultCodeAsLocation + "' not found");
 		    return;
        }
        
        //proecss with ONGL expression
		resultCodeAsLocation = TextParseUtil.translateVariables(resultCodeAsLocation,invocation.getStack());
        
        if(resultCodeAsLocation.startsWith("!")) {
        	doRedirect(invocation,request, response, resultCodeAsLocation.substring(1));
        }else {
        	doDispatcher(response, request, resultCodeAsLocation);
        }
    }

	private void doDispatcher(HttpServletResponse response, HttpServletRequest request, String resultCodeAsLocation) throws IOException, ServletException {
		if (_log.isInfoEnabled()) {
		    _log.info("Forwarding to location:" + resultCodeAsLocation);
		}
		
		PageContext pageContext = ServletActionContext.getPageContext();
		if (pageContext != null) {
            pageContext.include(resultCodeAsLocation);
            return;
		}
		
		RequestDispatcher dispatcher = request.getRequestDispatcher(resultCodeAsLocation);
		if (dispatcher == null) {
		    response.sendError(404, "result '" + resultCodeAsLocation + "' not found");
		    return;
		}
		
		if (!response.isCommitted() && (request.getAttribute("javax.servlet.include.servlet_path") == null)) {
		    request.setAttribute("struts.view_uri", resultCodeAsLocation);
		    request.setAttribute("struts.request_uri", request.getRequestURI());

		    dispatcher.forward(request, response);
		} else {
		    dispatcher.include(request, response);
		}
	}

	private void doRedirect(ActionInvocation invocation,HttpServletRequest request, HttpServletResponse response, String redirectLocation) throws IOException {
		if(isPathUrl(redirectLocation)) {
			if(!redirectLocation.startsWith("/")) {
				String namespace = invocation.getProxy().getNamespace();
                if ((namespace != null) && (namespace.length() > 0) && (!"/".equals(namespace))) {
                	redirectLocation = namespace + "/" + redirectLocation;
                } else {
                	redirectLocation = "/" + redirectLocation;
                }
			}
			if (prependServletContext  && (request.getContextPath() != null) && (request.getContextPath().length() > 0)) {
				redirectLocation = request.getContextPath() + redirectLocation;
            }
		}
		
		if(_log.isInfoEnabled())
			_log.info("Redirect to location:"+redirectLocation);
		response.sendRedirect(response.encodeRedirectURL(redirectLocation));
	}
    
    private static boolean isPathUrl(String url) {
        // filter out "http:", "https:", "mailto:", "file:", "ftp:"
        // since the only valid places for : in URL's is before the path specification
        // either before the port, or after the protocol
        return (url.indexOf(':') == -1);
    }
}
1 楼 michael152630 2008-09-09  
老兄,今天看了你的这个方法,很精彩啊,能不能把“javacommon.struts2.dispatcher.DirectResult”这个jar包发我啊
我在网上找了好久都没找到,
e-mail:michael152630@gmail.com
先谢谢了!
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Struts2零配置

    Struts2零配置是Struts2框架的一种简化配置方式,旨在减少XML配置文件的使用,提高开发效率。在传统的Struts2应用中,开发者需要在多个XML文件中配置Action、结果页面、拦截器等,而“零配置”则是对这种繁琐配置的...

    struts2 零配置

    "Struts2 零配置"是Struts2的一种特性,允许开发者在不编写大量XML配置文件的情况下,快速搭建和运行应用程序。这主要得益于Struts2的插件机制和注解支持。 首先,Struts2的零配置主要依赖于以下两个核心概念: 1....

    struts2零配置个人整理文档

    ### Struts2零配置个人整理文档 #### 一、Convention插件详解 ##### 1. 设置结果页面路径 - **背景介绍**:Struts2框架提供了便捷的方式来处理Web请求,并返回响应视图。为了简化配置过程,Struts2提供了一个名为...

    Struts2零配置+FreeMarker用户管理系统(UMS)

    这个名为"Struts2零配置+FreeMarker用户管理系统(UMS)"的项目,旨在通过注解的方式展示如何在不编写XML配置文件的情况下,利用Struts2和FreeMarker创建一个用户管理系统。 首先,我们来了解一下Struts2框架。Struts...

    struts2零配置

    4. **动态方法调用**:在零配置模式下,Struts2支持动态方法调用,即根据URL动态决定执行哪个方法。例如,如果一个Action类中有多个方法,URL可以直接指向这些方法,而无需在XML中为每个方法定义单独的Action配置。 ...

    简述STRUTS2_Convention零配置

    STRUTS2 Convention 零配置是Struts2框架中的一种高级特性,旨在简化应用程序的配置,让开发者能够更快地构建MVC应用。从Struts2.1版本开始,推荐使用Convention插件替代Codebehind插件,因为它更加自动化,几乎无需...

    struts2零配置入门代码

    在“struts2零配置入门代码”这个主题中,我们将深入探讨如何在不编写大量XML配置文件的情况下,启动并运行一个基本的Struts2应用程序。 Struts2的核心在于它的Action类,它是业务逻辑处理的主要组件。在“零配置”...

    STRUTS2:零配置插件CodeBehind

    ### STRUTS2:零配置插件CodeBehind详解 #### 一、概述 Struts2框架作为Java Web开发中的一款重要工具,在简化Web应用程序开发方面提供了丰富的功能与灵活性。随着框架的发展,Struts2社区不断推出新的插件和技术...

    struts2231零配置

    在Struts2的版本2.3.1中,引入了一种称为“零配置”的特性,它极大地简化了应用程序的配置过程,使得开发者可以更快地进行开发而无需编写大量的XML配置文件。 "Struts2231零配置"意味着开发者可以不再需要像以前...

    struts2采用convention-plugin实现零配置

    然而,随着版本的更新,Struts2引入了一个名为Convention Plugin的新特性,旨在简化配置过程,实现所谓的“零配置”开发。 **什么是Struts2 Convention Plugin?** Convention Plugin是Struts2的一个插件,它基于...

    struts2.1.6零配置DEMO

    在这个"struts2.1.6零配置DEMO"中,我们将深入探讨如何在不使用XML配置文件的情况下搭建一个简单的Struts2应用。 首先,Struts2的核心是Action类,它是处理用户请求的中心。在传统的Struts2应用中,我们通常会在...

    struts2零配置convention-plugin

    从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行...

    struts2.3零配置

    该项目主要是struts2.3的零配置,里面包含两个action,下载后导入myeclipse后,部署后。可以直接访问http://localhost:8080/struts2/abc.action、login.action\login1.action。这里的返回值是以json方式返回。

    struts2 零配置所需的包及示例

    在实际项目中,Struts2的零配置可以通过调整类命名规则、方法命名规则以及使用`@ParentPackage`注解来扩展其功能。例如,可以定义一个全局的父包,然后所有的Action都可以继承这个父包,从而共享相同的拦截器链、...

    struts2零配置[总结].pdf

    LightURL插件是Struts2社区提供的一种实现零配置的方法,它吸收了其他优秀插件的优点,比如CodeBehind和SmartUrls,旨在创建更简洁、更易维护的URL映射。以下是LightURL插件的使用步骤: 1. **添加依赖**:将`...

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件,可以直接跑

    在Struts2中,注解的引入使得开发者可以摆脱繁琐的`struts.xml`配置文件,实现“零配置”运行。 首先,让我们了解什么是注解(Annotation)。注解是Java提供的一种元数据机制,允许在源代码中嵌入信息,这些信息...

Global site tag (gtag.js) - Google Analytics