一:struts2运行机制:
Tomcat一启动,一些信息就已经加载完成,例如StrutsPrepareAndExecuteFilter加载的那些strut.xml以及Action的class类文件
1)客户端在浏览器中输入一个url地址
2)这个url请求通过http协议发送给tomcat。
3)tomcat根据url找到对应项目里面的web.xml文件。
4)在web.xml里面会发现有struts2的配置。
5)然后会找到struts2对应的struts.xml配置文件。
6)根据url解析struts.xml配置文件就会找到对应的class。
7)调用完class返回一个字String,根据struts.xml返回到对应的jsp。
二:struts2运行原理
上图来源于Struts2官方站点,是Struts 2 的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1) 客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2) 这个请求经过一系列的过滤器(Filter)。
3) 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。
4) 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
5) ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
6) ActionProxy创建一个ActionInvocation的实例。
7) ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8) 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
Struts2的核心就是拦截器。Struts.xml中所有的package都要extends="struts-default"。同理与所有的Java类都要extends自Object一样。struts-default.xml里面就是要做以上事情。
三:下面带大家自定义简单的实现一下struts2
1、创建存放解析struts后的文件,保存里面的name和class以及result结果的Map集合
package .s.bean;
import java.util.HashMap;
import java.util.Map;
public class ActionXml {
//对应存放的name
private String name;
//对应存放的class
private String clazz;
//对应存放的那些result,保存ResultXml bean结果
private Map results = new HashMap();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public Map getResults() {
return results;
}
public void setResults(Map results) {
this.results = results;
}
}
package .s.bean;
import java.util.HashMap;
import java.util.Map;
public class ActionXml {
//对应存放的name
private String name;
//对应存放的class
private String clazz;
//对应存放的那些result,保存ResultXml bean结果
private Map results = new HashMap();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public Map getResults() {
return results;
}
public void setResults(Map results) {
this.results = results;
}
}
2、创建存放解析struts后的文件,保存里面的result文件信息
[java]
package .s.bean;
public class ResultXml {
//名称
private String name;
//值
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package .s.bean;
public class ResultXml {
//名称
private String name;
//值
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
3、创建解析XML的类文件
[java]
package .s.parse;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import .s.bean.ActionXml;
import .s.bean.ResultXml;
public class ParseXml {
private static Map<String,ActionXml> map = new HashMap<String,ActionXml>();
public ParseXml(){
}
public static Map<String,ActionXml> getXML(){
SAXReader sax = new SAXReader();
Document doc = null;
try {
doc = sax.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("struts.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//得到根目录
Element root = doc.getRootElement();
//得到所有action配置
List list = root.elements();
for(Object obj : list){
ActionXml ax = new ActionXml();
Element a = (Element)obj;
ax.setName(a.attributeValue("name"));
ax.setClazz(a.attributeValue("class"));
//得到所有result
List results = a.elements();
for(Object obj1 : results){
ResultXml rx = new ResultXml();
Element r = (Element)obj1;
rx.setName(r.attributeValue("name"));
rx.setValue(r.getText());
ax.getResults().put(rx.getName(), rx.getValue());
}
//将所有的action的配置读取出来,放入到一个MAP中
map.put(ax.getName(), ax);
}