自定义struts实现

一: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);

  }

上一篇:【bzoj3674】 可持久化并查集加强版


下一篇:jQuery事件委托之Safari失效的解决办法--摘抄