1.具体项目结构如下:
aaarticlea/png;base64,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" alt="" />
2.配置web.xml
<filter>
<filter-name>ActionFilter</filter-name>
<!-- 过滤器具体实现类 -->
<filter-class>com.gxxy.action.web.filter.ActionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ActionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.actions.xml
<actions>
<action name="list" class="com.gxxy.action.oa.web.ListAction" method="list">
<target name="listing" type="forword" >/WEB-INF/index.jsp</target>
</action>
</actions>
4.Filter具体实现类
--->加载actions.xml配置文件
/**
* 加载配置文件 actions.xml
*
* @return
*/
private Document getDoucment() {
//注意:Document 为org.w3c.dom.Document包中的;
Document doucment = null;
InputStream resourceAsStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("actions.xml");
try {
doucment = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(resourceAsStream);
} catch (Exception e) {
e.printStackTrace();
}
return doucment;
}
-->当过滤器初始化的时候,加载出actions.xml里的内容
/**
* 初始化
*/
private Map<String, ActionConfig> map = new HashMap<>();
public void init(FilterConfig arg0) throws ServletException {
Document document = getDoucment();
NodeList elementsByTagName = document.getElementsByTagName("action");
//循环取出action标签中的内容
for (int i = 0; i < elementsByTagName.getLength(); i++) {
// 解析action元素
Element action = (Element) elementsByTagName.item(i);
String name = action.getAttribute("name");
String cls = action.getAttribute("class");
String method = action.getAttribute("method");
//将action中加载出的name,class,method 放到ActionConfig对象中
ActionConfig acticonfig = new ActionConfig(name, method, cls);
//将Action对象添加到map中,key为action中的name
map.put(name, acticonfig);
// 解析target元素
NodeList target = document.getElementsByTagName("target");
Map<String, TargetConfig> tarmap = new HashMap<>();
//循环取出target标签中的内容
for (int j = 0; j < target.getLength(); j++) {
Element tar = (Element) target.item(j);
String tarname = tar.getAttribute("name");
String type = tar.getAttribute("type");
String textContent = tar.getTextContent();
//将action中target加载出的name,type及文本内容放到TargetConfig对象中
TargetConfig tarconfig = new TargetConfig(tarname, type, textContent);
//将tarconfig对象添加到tarmap中,key为target中的tarname;
tarmap.put(tarname, tarconfig);
}
acticonfig.setTar(tarmap);
}
}
-->具体的doFilter的实现
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
ActionContext.request = req;
ActionContext.response = resp;
//获取到请求的URI
String url = req.getRequestURI();
//将取到的URI用"/"分隔开
String[] urls = url.split("/");
//得到请求路径里"/"最后的元素
String cmd = urls[urls.length - 1];
/*
* if ("list".equals(cmd)) { ListAction listAction = new ListAction();
* listAction.list(); }
*/
//public boolean containsKey(Object key)如果此映射包含对于指定键的映射关系,则返回 true。
//如果请求的内容在map中
if(map.containsKey(cmd)){
ActionConfig actionConfig = map.get(cmd);
try {
//通过反射根据类的全限定名称找到这个类
Class class1 = Class.forName(actionConfig.getCls());
//实例化这个类
Object interfaces = class1.newInstance();
//根据配置里的方法名通过反射找到类中的那个方法
Method method = class1.getMethod(actionConfig.getMethod());
//String invoke为具体实现方法里面的返回值
String invoke = (String) method.invoke(interfaces);
//调用Action中的Target map属性
Map<String, TargetConfig> tarmap = actionConfig.getTar();
//如果方法的返回值在target标签中有
if(tarmap.containsKey(invoke)){
TargetConfig targetConfig = tarmap.get(invoke);
//取出type
String type = targetConfig.getType();
//取出标签的文本内容
String target = targetConfig.getTarget();
//如果type是"forward",那么请求转发,否则重定向
if("forword".equals(type)){
req.getRequestDispatcher(target).forward(req, resp);
}else{
resp.sendRedirect(target);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.config包为Action对象和target对象包
--->ActinConfig对象的字段:
public class ActionConfig {
//action中的name
private String name;
//action中的方法
private String method;
//action中的class
private String cls;
//action中的target标签
private Map<String,TargetConfig> tar;
--->TargetConfig对象的字段
public class TargetConfig {
//target标签中的name
private String name;
//target标签中的type
private String type;
//target标签中的文本内容
private String target;
6.context包中ActionContext的具体实现
public class ActionContext {
public static HttpServletRequest request;
public static HttpServletResponse response; }