`
dilantaya
  • 浏览: 103423 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

代预先处理的struts action改造

阅读更多
在struts  中遇到大业务量时 一般用dispatcherAction在一个类里集成多个method,但是这样的对于一些预先处理需求的就不能实现了,于是自己动手改造下

/**
 * action的预处理和收尾处理类 每个项目必须实现自己的ControlAction,在ControlAction中作些统一的预处理和收尾处理
 * 所有Action都继承自ControlAction
 * 
 * @author rff
 */
public class ControlAction extends BaseControlAction {

	/**
	 * 预处理代码 2007-03-15 加入session判断,校验某用户是否有访问该action的权限
	 */
	protected void sessionInit(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {

		HttpSession session = request.getSession();

		try {

			List actionList = null;
			String url = request.getServletPath().substring(1,
					request.getServletPath().length());
			if (url != null && !url.equals("menuAction.do")
					&& !url.equals("loginAction.do")
					&& !"indexAction.do".equals(url)) {

				AssignRuleBo bo = new AssignRuleBo();
				AssignRule rule = new AssignRule();
				FunctionModule func = new FunctionModule();
				String strMothod = request.getParameter("method");
				if (strMothod.indexOf('&') > 0)
					strMothod = strMothod.substring(0, strMothod.indexOf('&'));
				url = url + "?method=" + strMothod;
				// func.setUrl(request.getServletPath().substring(1,request.getServletPath().length()));
				func.setUrl(url);
				func.setIsMenu(0);
				FunctionModuleDao fundao = new FunctionModuleDao();
				List funclist = fundao.list(func);
				if (funclist != null && funclist.size() > 0) {
					func = (FunctionModule) funclist.get(0);
				}
				FunctionModule tempfunc = new FunctionModule();
				tempfunc.setParentFunctionId(func.getFunctionId());
				/*rule.setFunction(tempfunc);
				User user = new User();
				user.setUserId((Integer) request.getSession().getAttribute(
						"userId"));
				rule.setUserId(user.getUserId());
				actionList = bo.queryAll(rule);
				// 本功能父功能的下功能
				tempfunc.setParentFunctionId(func.getParentFunctionId());
				rule.setFunction(tempfunc);
				actionList.addAll(bo.queryAll(rule));*/	
				//if(session.getAttribute("actionList")!=null){
				PurviewDao pDao =new PurviewDao();
				actionList =pDao.getButtonRuleList((Integer)session.getAttribute("userId"));
				session.setAttribute("actionList", actionList);
				//}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 预处理代码 2006-04-04 加入session判断,校验某用户是否有访问该action的权限
	 * 
	 * protected boolean onInit(ActionMapping mapping, ActionForm form,
	 * HttpServletRequest request, HttpServletResponse response) {
	 * 
	 * boolean ifRole=false; //boolean ifRole=true; try{ HttpSession
	 * session=request.getSession();
	 * 
	 * String url=request.getRequestURI(); String strMethodName =
	 * request.getParameter("method");
	 * 
	 * String link=url+"?method="+strMethodName;
	 * 
	 * ArrayList actionSet= (ArrayList)session.getAttribute("userActions");
	 * 
	 * if(actionSet!=null&&actionSet.contains(link)){ ifRole=true; }
	 * 
	 * 
	 * }catch(Exception e){ e.printStackTrace(); }
	 * 
	 * return ifRole; }
	 */

	/**
	 * 预处理代码 重复提交判断,校验该次提交是否为重复提交
	 */
	protected boolean onInit(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {

		boolean submitRole = true;
		/*
		 * ArrayList saveTokenList=AtomRoleCheck.getTokenList()[0]; ArrayList
		 * checkTokenList=AtomRoleCheck.getTokenList()[1];
		 * 
		 * try{
		 * 
		 * String url=request.getRequestURI(); String strMethodName =
		 * request.getParameter("method");
		 * 
		 * if (saveTokenList.contains(strMethodName)) { saveToken(request); }
		 * else if (checkTokenList.contains(strMethodName)) { if
		 * (!isTokenValid(request, true)) {//表单重复提交
		 * 
		 * resetToken(request);
		 * 
		 * System.err.println("重复提交!"); submitRole=false; }
		 *  }
		 * 
		 * 
		 * 
		 * }catch(Exception e){ e.printStackTrace(); }
		 */
		return submitRole;
	}

	/**
	 * 收尾处理代码
	 */
	protected String onFinal(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response,
			String forward) {

		return forward;
	}

}


/**
 * 控制分发类
 * 继承自org.apache.struts.action.Action,在ControlAction预处理通过之后执行
 * @author xt
 */
public abstract class BaseControlAction extends Action {

	/**
	 * 控制方法执行
	 */
	public ActionForward execute(ActionMapping mapping,
								 ActionForm form,
								 HttpServletRequest request,
								 HttpServletResponse response)
								 throws Exception {
		String forward = null;
		HttpSession session=request.getSession();	
		try
		{
		String url=request.getServletPath().substring(1,request.getServletPath().length());
		Integer userId=(Integer)session.getAttribute("userId")==null?null:(Integer)session.getAttribute("userId");
		if(url!=null && !"loginAction.do".equals(url) && (userId==null || "".equals(userId.toString())) )
		{
			forward="login";
		}
		else
		{
			sessionInit(mapping,form,request,response);
			if(onInit(mapping,form,request,response)){//预处理失败就不执行
				Class cls = getClass();
				String strMethodName = request.getParameter("method");				
				Method methods[] = cls.getDeclaredMethods();				
				for (int i=0;i<methods.length;i++) {
					if (methods[i].getName().equals(strMethodName)) {
						int intArguments=methods[i].getParameterTypes().length;						
						Object arglist[] = new Object[intArguments];
						if(intArguments==2){
							arglist[0] = request;
							arglist[1] = form;
						}else{
							arglist[0] = mapping;
							arglist[1] = form;
							arglist[2] = request;
							arglist[3] = response;
						}
						forward = (String)methods[i].invoke(cls.newInstance(),arglist);
					}
				}
			}else{
				forward="submitRepeat";
			}
			forward = onFinal(mapping,form,request,response,forward);//收尾处理
		}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		return mapping.findForward(forward);
	}

	/**
	 * 预处理,项目中可以在这里实现一些统一的处理,像权限校验、重复提交校验等
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return 预处理成功或失败
	 */
	protected abstract boolean onInit(ActionMapping mapping,
			ActionForm form,
			HttpServletRequest request,
			HttpServletResponse response);

	/**
	 * 收尾处理,根据项目要求将action的处理结果再加工一次
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @param forward action处理后的forward
	 * @return 处理后的forward
	 */
	protected abstract String onFinal(ActionMapping mapping,
			ActionForm form,
			HttpServletRequest request,
			HttpServletResponse response,
			String forward);
			
	protected abstract void sessionInit(ActionMapping mapping,
			ActionForm form,
			HttpServletRequest request,
			HttpServletResponse response);			
}
分享到:
评论

相关推荐

    struts in action

    **Struts in Action** 《Struts in Action》一书深入探讨了Struts这一经典Java Web应用框架,旨在帮助开发者理解并熟练运用Struts来构建高效、可维护的Web应用程序。Struts是由Apache软件基金会开发的一个开源项目...

    Struts2之异常处理案例struts003

    - 应该尽量避免在Action方法中使用`try-catch`块,而是依赖于Struts2的异常处理机制。 - 全局异常处理应该作为最后的防线,用于处理未被局部异常处理捕获的异常。 - 使用自定义异常可以帮助代码更具可读性和可...

    Struts2异常处理机制

    在Struts2框架中,异常处理主要依赖于两个关键组件:`ExceptionMappingInterceptor`(异常映射拦截器)和`ActionError`。当一个Action执行过程中抛出未捕获的异常时,`ExceptionMappingInterceptor`会介入并根据配置...

    Struts2教学视频

    Struts2支持Action的动态方法调用,允许Action类根据请求参数动态选择要执行的方法,而无需预先在struts.xml中硬编码。 **八、Action通配符(wildcard)的配置** 通配符配置允许为一组相似的Action定义一个通用配置,...

    struts in action中文版

    7. **异常处理**:Struts允许开发者定义全局和局部的异常处理策略,当业务逻辑中出现异常时,框架会自动跳转到预先设定的错误页面。 8. **Tiles框架**:Tiles是Struts的一个扩展,它允许开发者创建可复用的页面组件...

    Struts高级部分(2)(常用Action、验证框架、动态Form)

    传统的Struts开发中,每个表单对应一个ActionForm类,而在动态Form模式下,无需预先定义Form类,而是直接在JSP页面中声明表单元素,并通过OGNL(Object-Graph Navigation Language)表达式绑定到Action的属性。...

    Struts1和Struts2区别

    - **Struts1**:需要预先定义Action类和对应的ActionForm,请求路径与Action类方法直接关联,不易进行动态路由。 - **Struts2**:通过OGNL表达式可以实现动态方法调用,无需提前硬编码Action方法,增强了代码的可...

    struts2与前台交互时序

    2. **Action Mapping**:Filter Dispatcher会检查请求URL,尝试匹配预先定义的Action Mapping。Action Mapping定义了特定的URL如何映射到特定的后台Action类,这使得Struts2能够根据请求路由到相应的业务逻辑。 3. ...

    Struts2_0500_ActionMethod

    在Struts2框架中,Action类是核心组件,它处理用户请求并执行业务逻辑,然后将结果转发到视图层进行展示。本文将深入探讨Struts2中的Action方法及其相关知识点。 一、Action类与Action方法 1. Action类:Struts2...

    Struts in Action 中文版

    ### Struts in Action 中文版知识点总结 #### Struts简介与背景 - **书籍来源**:本书《Struts in Action》由Ted Husted撰写,Eric Liu(铁手)翻译成中文版,最新修订时间为2005年10月14日。 - **作者与译者**:...

    struts2介绍及应用

    - Struts2允许动态地调用Action的方法,只需在URL中指定方法名,无需预先在配置文件中声明。 5. **Struts2的国际化与本地化** - 支持多语言环境,通过资源文件(properties文件)管理不同语言的文本。 6. **插件...

    struts2生成中文验证码的Action

    在Struts2中,Action是核心组件,负责处理用户请求并返回相应的结果。在这个特定的场景中,我们讨论的是如何在Struts2中创建一个能够生成中文验证码的Action。 验证码的主要目的是防止自动机器人或恶意攻击,通过向...

    通过比较来学习Struts和Struts2

    而Struts1则要求在配置文件中预先定义好每个Action的执行方法。 8. **插件和扩展性** - Struts2拥有丰富的插件体系,如Tiles、Freemarker等,便于扩展和定制应用。相比之下,Struts1的扩展性较弱。 综上所述,...

    struts培训资料

    Struts2支持动态方法调用,即可以通过不同的请求参数来决定执行哪个Action方法,而无需预先在Action类中定义所有可能的方法。 八、Action通配符(wildcard)的配置: 通配符配置允许在Action路径中使用星号(*)作为...

    struts7验证框架 struts7验证框架

    DynaActionForm是基于org.apache.struts.action.DynaActionForm的,它不需要预先定义属性,而是允许在运行时动态地添加、修改和删除属性。在配置文件中,我们使用`&lt;form-bean&gt;`元素来声明一个DynaActionForm,并通过...

    Eclipse开发Struts1.2

    - 通常会创建一个或多个Action类,这些类继承自`org.apache.struts.action.Action`,并重写`execute()`方法来处理用户请求。 10. **表单Bean(FormBean)**: - FormBean是Struts中的模型组件,用于在视图和控制...

    struts登陆注册功能

    用户提交表单后,Struts会调用预先定义的Action,执行相关的业务逻辑。 在JSP页面中,我们可以使用Struts的标签库,如和,来创建表单元素。这些标签简化了HTML的编写,并与Struts框架无缝集成,使得表单数据可以...

    struts编程思想初探

    - **3.2.2 StrutsAction** - 实现具体的业务逻辑。 - 包含了execute()方法,该方法是框架调用的入口点。 - **3.2.3 StrutsActionMapping和ActionForward** - **ActionMapping**:定义了ActionServlet与Action之间...

    struts框架的基本实现

    5. **struts-config.xml**:配置文件,定义了ActionServlet如何处理请求,Action与JSP之间的映射关系等。 在"描述"中提到的从JSP到Action的数据传递,通常通过表单提交实现。用户在JSP页面填写表单后,点击提交按钮...

Global site tag (gtag.js) - Google Analytics