自定义struts实现

时间:2022-10-11 22:41:30

一: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. &lbrack;Java面试四&rsqb;Strust2总结及在面试中的一些问题&period;

    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. 使用BitArray判断素数

    首先显示1024范围内的所有素数,然后显示输入的数是否是素数.1024 是代码中计算的素数的范围,可以修改.计算平方根,是为了确定一个基数的范围.1024的平方根是32,两个超过32 的数相乘,肯定大 ...

  2. cocoapods安装

    什么是cocoapods CocoaPods是一个用来帮助我们管理第三方依赖库的工具.它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我 ...

  3. SQL Server出现错误&colon; 4014

    SQL Server出现错误: 4014 线下的测试机器老是报错,从errorlog里看到大量的4014错误 A fatal error occurred , output error: ). 错误: ...

  4. mysq安装以及修改密码

    安装版MySQL是不能一键安装的,下载下来是压缩包,解压后只要进行相关配置就可以正常使用: 文章主要是记录一下,以防自己忘记: 1.首先在mysql官网--http://dev.mysql.com/d ...

  5. 【转载】shell编程——if语句 if -z -n -f -eq -ne -lt

    shell编程中条件表达式的使用 if  条件then Commandelse Commandfi                              别忘了这个结尾 If语句忘了结尾fites ...

  6. bzoj 3270 博物馆(高斯消元)

    [题意] 两人起始在s,t点,一人pi概率选择留在i点或等概率移动,问两人在每个房间相遇的概率. [思路] 把两个合并为一个状态,(a,b)表示两人所处的状态,设f[i]为两人处于i状态的概率.则有转 ...

  7. javascript获取url中对应参数的方法

    利用正则表达式和location.search方法,可以简便的获取到对应的参数:   function getQueryString(name) {var reg = new RegExp(&quot ...

  8. AJax的异步请求

    AJax的处理过程 1、传统的Web请求过程: 一般的 Web 应用程序中,用户填写表单字段并单击 Submit 按钮.然后整个表单发送到服务器,服务器将它转发给处理表单的脚本(通常是 PHP 或 J ...

  9. 在Windows的Dos命令中切换盘符

    在Windows的Dos命令中切换盘符... ---------------------------- --------------------------------------- -------- ...

  10. Qt 的一些浅知识点

    1 Qt 官网下载地址 http://download.qt.io/ 2 必须得有pro文件么 不是必须的. pro 文件是个中间文件,通过 qmake 程序能将 pro 文件转换成其它平台的项目文件 ...