仿struts2实现action跳转

  1. 先定义自己的struts2.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<struts>
	<dg></dg> 
	<action name="login" class="com.ming.action.LoginAction">
		<result name="success" type="chain">/success.jsp</result>
		<result name="login">/login.jsp</result>
	</action>
</struts>

2.定义ResultBean对象

package com.ming.bean;

public class ResultBean {

	private String resultName;
	private String resultType;
	private String resultText;
	public String getResultName() {
		return resultName;
	}
	public void setResultName(String resultName) {
		this.resultName = resultName;
	}
	public String getResultType() {
		return resultType;
	}
	public void setResultType(String resultType) {
		this.resultType = resultType;
	}
	public String getResultText() {
		return resultText;
	}
	public void setResultText(String resultText) {
		this.resultText = resultText;
	}

}

3.定义ActionBean对象


package com.ming.bean;

import java.util.HashMap;
import java.util.Map;

public class ActionBean {

private String actionName;
private String actionClz;
private Map<String,ResultBean> map=new HashMap<String,ResultBean>();
public String getActionName() {
return actionName;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
public String getActionClz() {
return actionClz;
}
public void setActionClz(String actionClz) {
this.actionClz = actionClz;
}
public Map<String, ResultBean> getMap() {
return map;
}
public void setMap(Map<String, ResultBean> map) {
this.map = map;
}

}

4.定义一个类读取XML文件

package com.ming.filter;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.ming.bean.ActionBean;
import com.ming.bean.ResultBean;

public class ReadXML {

	public static Map readXML(String path){
		SAXReader reader=new SAXReader();
		Map<String,ActionBean> actionMap=new HashMap<String, ActionBean>();
		try {
			Document document=reader.read(new File(path));
			Element strutsElement=document.getRootElement();
			Iterator actions=strutsElement.elementIterator();
			while(actions.hasNext()){
				ActionBean actionBean=new ActionBean();
				Element actionElement=(Element) actions.next();
				String actionName=actionElement.attributeValue("name");
				String actionClz=actionElement.attributeValue("class");
				actionBean.setActionName(actionName);
				actionBean.setActionClz(actionClz);
			    Map<String,ResultBean> resultMap=actionBean.getResultMap();
			    Iterator results=actionElement.elementIterator();
			    while(results.hasNext()){
			    	ResultBean resultBean=new ResultBean();
			    	Element resultElement=(Element) results.next();
			    	String resultName=resultElement.attributeValue("name");
			    	resultBean.setResultName(resultName);
			    	String resultType=resultElement.attributeValue("type");
			    	resultBean.setResultType(resultType);
			    	String resultText=resultElement.getText();
			    	resultBean.setResultText(resultText);
			    	resultMap.put(resultName, resultBean);
			    }
			    actionMap.put(actionName, actionBean);
			}
		} catch (DocumentException e) {
			System.out.println("读取XML文件失败!!");
			e.printStackTrace();
		}
		return actionMap;
	}

}

5.实现struts2的核心类来实现action跳转功能

package com.ming.filter.core;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.ming.bean.ActionBean;
import com.ming.bean.ResultBean;
import com.ming.filter.ReadXML;

public class Struts2Filter implements Filter {

	@Override
	public void destroy() {

	}

	Map actionMap;

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		// 1 获取请求路径
		String path = request.getRequestURI();
		System.out.println(path);
		int beginIndex = path.lastIndexOf("/") + 1;
		int endIndex = path.lastIndexOf(".");
		path = path.substring(beginIndex, endIndex);
        System.out.println(path);
		// 2 根据路径在struts.xml 中找到对应的类
		Object object = actionMap.get(path);
		// 3 给对应的属性赋值
		if (object != null) {
			ActionBean actionBean = (ActionBean) object;
			String actionClz = actionBean.getActionClz();
			try {
				Class clz = Class.forName(actionClz);
				Object actionObject = clz.newInstance();
				// 从jsp 获取提交到filter的所有的值(存储形式 k-v 例如:userName,"zhangsan")
				Map requestMap = request.getParameterMap();
				// 自动完成 map到对象的对应的属性值的赋值
				BeanUtils.populate(actionObject, requestMap);
				// 4 调用execute方法
				Action action = (Action) actionObject;
				// 调用的实现类 execute方法
				String returnResult = action.execute();
				// 5 找返回值
				Object resultObject = actionBean.getResultMap().get(
						returnResult);
				if (resultObject != null) {
					ResultBean resultBean = (ResultBean) resultObject;
					// 6 在 struts.xml 对应的jsp
					String result = resultBean.getResultText();
					// 7 跳转
					request.getRequestDispatcher(result).forward(request,
							response);
					return;
				} else {
					System.out.println("找不到result的值:" + returnResult);
					chain.doFilter(request, response);
				}
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("该路径不存在:" + path);
			chain.doFilter(request, response);

		}
		chain.doFilter(request, response);
	}

	// 在tomcat 启动的时候执行,完成struts配置信息初始化
	@Override
	public void init(FilterConfig config) throws ServletException {
		String path = config.getServletContext().getRealPath(
				"WEB-INF/classes/struts.xml");
		actionMap=ReadXML.readXML(path);

	}

}
时间: 2024-08-02 00:21:23

仿struts2实现action跳转的相关文章

SSH框架整合遇到的错误——Struts2.5 action跳转出现错误

错误信息如图: 刚开始以为是struts2的配置问题,就换了一下action的值,改成了login1之后才发现错误. 表单提交的跳转信息: Struts2.xml中的配置 UserAction.java中的配置 action的跳转方法不能有参数,手误写了参数,导致action找不到login1方法. 原文地址:https://www.cnblogs.com/aishanyishi/p/9251298.html

struts2 从一个action跳转到另一个action的struts.xml文件的配置

解释: 想要用<result>跳转到另一个action,原来的配置代码是: <action name="insertDept" class="struts.org.db.DeptAction" method="insertDept"> <result name="success" type="redirect-action">selectDept</result&g

struts2中action向action之间传数据和action向jsp传数据理解

1,在 Action中我们经常会从这个Action跳转到另一个Action中,这时我们就要用到redirect.redirect-action.chain, 其中redirect和redirect-action是重定向,相当于浏览器二次请求,之前的数据都会丢失,所有的参数.值栈和请求属性都会丢失.chain是服务器转发action,源Action的用户请求参数.值栈.session的数据赋值给目的Action,即在目的action中可以获得源action得到的请求参数值栈,session等数据.

Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中

struts2的关于method="{1}"意思详解 <action   name= "Login_* "   method= "{1} "   class= "mailreader2.Login ">中Login_*带*是什么意思?method= "{1} "带{}这个是什么意思?====================================================name=

Struts2中action调用的一个问题发现

引子 我们都知道Struts2页面的跳转,先是从jsp页面上提交一个action请求,然后根据在Struts中配置情况,对应到一个执行类上,然后再根据执行类的返回结果配置result标签,从而转发到另一个页面或者是action. 在这些传递的过程中,有一些我们在页面中设置的属性值也会随之传递,有点像是依赖注入. 要想实现页面的丰富跳转,跳转的中转站:result的标签的作用不可小视.当然了,也需要action类的强大支持. 问题 我在跳转时,遇到了这样一个问题. 就是我从我的当前页面出发,通过"

【struts2】Action的生命周期

Struts2的Action的生命周期是:Struts2为每个请求都重新初始化一个Action的实例.可以稍微改造一下代码来验证一下. 给HelloWorldAction加上一个public无参的构造方法,在里面输出一句话. 大家都知道,一个Java类如果没有写构造方法,那么会有一个默认的public无参的构造方法,这里只是把它明确的写出来了,因此这么做,并没有改变Action的任何功能,只是想看一下到底什么时候,Action会被初始化.示例代码如下: public HelloWorldActi

struts2对action中的方法进行输入校验

有时我们需要对Action中注入的字段进行校验,这时我们就需要用到invidate()方法了. 首先需要Action实现ActionSupport,然后重写invidate()方法,在其中对字段进行校验. 如果校验合法,则执行action中的相应方法(一般为execute),请求转发到相应的jsp: 如果校验失败,可以通过addFieldError()方法将错误信息添加到FieldErrors中, 此时action中的相应方法(一般为execute)不会执行,struts2框架默认返回"inpu

SSH框架-Struts2基础-Action

Struts2的目录结构: 解压apps目录下的struts2-blank.war: 仿照这个最基本的项目,拷贝相关文件: 1.拷贝apps/struts2-blank/WEB-INF/classes/struts.xml到我们的项目中的src目录(因为src编译完成后会自动放在classes目录): 2.拷贝类库apps/struts2-blank/WEB-INF/lib/*.jar到自己项目的WebRoot/WEB-INF/lib下. 3.拷贝apps/struts2-blank/WEB-I

Struts2中Action通配符的配置

1.在我的一篇文章中,介绍了Struts2中Action的动态调用方法:http://blog.csdn.net/u012561176/article/details/44347429 但是那样子还不是最简单的,最简单的是使用通配符,将配置量降到最低,但是这个也比较难已理解,在使用通配符时,一定要遵守"约定优于配置"的原则. 2.接下来介绍一下通配符,使用星号(*)表示所有,{数字}表示第几个通配符,例如: *Action,那么{1}就表示第一个星号(*),如果是 *_* 的话,那