您的位置:首页 > 编程语言 > Java开发

仿struts2实现action跳转

2015-09-19 10:14 260 查看
先定义自己的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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息