一: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. linux 登录档配置分析

    登录档的重要性 解决系统方面的错误: 解决网络服务的问题: 过往事件记录簿: Linux 常见的登录档档名 /var/log/cron: 你的 crontab 排程有没有实际被进行? 进行过程有没有发 ...

  2. MVC 微信扫码支付

    微信扫码支付有两种模式, 模式一和模式二, 两者具体的区别可参考官网文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 微 ...

  3. Android发送短信核心代码

    核心代码:(1)SmsManager manager = SmsManager.getDefault(); //获得默认的消息管理器(2)ArrayList<String> list = ...

  4. solaris安装oracle遇INS 30131 错误

    安装11.2.0.4,报错: [FATAL] [INS-30131] Initial setup required for the execution of installer validations ...

  5. [Notes] AWS Automation using script and AWS CLI

    (c) 2014 Amazon Web Services, Inc. and its afflialtes, All rights reserved. The content in this file ...

  6. 学习Java,还需要学好哪些知识

    很多人认为学好一门程序语言就需要学好逻辑,其实这对于很多人而言是对的,但是真的对于需要写程序的学员来说,只有逻辑好其实是不够的,如果你能具备以下几项能够为你在程序编译中大大提高工作效率.现在昆明jav ...

  7. javascript设计模式(单体模式)

    主要内容: js中最基本.应用最广的模式就是单体模式,实现原理是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变更进行访问,确保对象只存在一份实例. 单体模式的特点: 在网页中使用全局变 ...

  8. java 多态2

    http://www.cnblogs.com/wqq0402/p/6180685.html package test05; public class DuoTai_Test02 { /**多个对象,一 ...

  9. Crystal Reports拉报表报错:Error detected by database DLL

    问题描述: 最近在使用Crystal Reports打印报表时,提示错误信息:"Error detected by database DLL." 如下图: 经查找,是因为数据库名称 ...

  10. C# 小工具开发--DeBugHttp

    随着RESTful的流行,前后端分离,我们后端开发人员在开发过程中多http相关方法进行测试.这就是这个小工具的初衷. 代码地址:https://github.com/gdoujkzz/DebugHt ...