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

  }

自定义struts实现的更多相关文章

  1. 基于Struts自定义MVC-1

    自定义MVC        数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 1 import javax.servlet.http.*; ...

  2. 基于Struts自定义MVC-2

    自定义MVC        数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 import javax.servlet.http.*; pu ...

  3. Struts2开山篇【引入Struts、自定义MyStruts框架】

    前言 这是Strtus的开山篇,主要是引入struts框架-为什么要引入struts,引入struts的好处是什么-. 为什么要引入struts? 首先,在讲解struts之前,我们来看看我们以前写的 ...

  4. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  5. struts struts拦截器(过滤器)

    在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...

  6. [Java面试四]Strust2总结及在面试中的一些问题.

    1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前端控制器模式] MV ...

  7. SSH-Struts第三弹:传智播客视频教程第一天上午的笔记

    一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...

  8. Struts2基本配置详解

    Struts2配置文件加载顺序 struts2 配置文件由核心控制器加载 StrutsPrepareAndExecuteFilter (预处理,执行过滤) init_DefaultProperties ...

  9. struts2笔记4

    1.自定义struts拦截器 应用场景:如果用户登陆后可以访问action中的所有方法,如果用户没有登陆不允许访问action中的方法,并且提示“你没有操作权限” 1)两个页面,一个用户登陆user. ...

随机推荐

  1. html只给自己

    //另外一个 height:400px; weight:400px; border-top-left-radius: 10px; border-top-right-radius: 10px; bord ...

  2. JS浮点数的加减乘除运算

    文章来源地址:http://blog.csdn.net/lyd518/article/details/7236464 转载请注明出处,尊重作者劳动成果,谢谢!问题这样的: 37.5*5.5=206.0 ...

  3. 安卓代码覆盖率:android studio+ gradle+jacoco

    在工程的oncreate()方法添加如下代码,目的是创建ec文件. String DEFAULT_COVERAGE_FILE_PATH = "/mnt/sdcard/coverage.ec& ...

  4. instruments usage error specified target process is invalid

    遇到这个问题的很多,但都没说具体的解决办法. 如果你的包名 路径之类的都正确,还是报这个错误的话,请重启手机.

  5. setValue和setObject的区别

    在NSMutableDictionary的方法中有setValue forKey与setObject forKey,它们都可以用来设置某一个key值对应的value 1,setValue: forKe ...

  6. .net类库里ListView的一个BUG

    今天在CSDN论坛里看一个帖子,说是在ListView中添加了条目后第一行内容不显示,为了还原他的问题我写了以下代码. private void LoadFiles(DirectoryInfo dir ...

  7. Java实现中文数字转换为阿拉伯数字

    /** * 中文數字转阿拉伯数组[十万九千零六十 --> 109060] * @author 雪见烟寒 * @param chineseNumber * @return */ @Suppress ...

  8. NC JDK报tools.jar错误(61版本)

    添加jdk/lib目录下的tools.jar 然后设置环境变量

  9. [Linux] 结构化命令 if

    语法结构如下: 1. if-then语句 # if-then语句 if command #根据conmmand的退出状态码,选择执行语句 then commands fi e.g. #!usr/bin ...

  10. Web页面报错: Eval()、XPath() 和 Bind() 这类数据绑定方法只能在上下文中使用

    可以使用string.formt来避免出错. 如: <%# Convert.ToInt32(DataBinder.Eval(Container.DataItem, "Status&qu ...