自定义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);
}
自定义struts实现的更多相关文章
- 基于Struts自定义MVC-1
		
自定义MVC 数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 1 import javax.servlet.http.*; ...
 - 基于Struts自定义MVC-2
		
自定义MVC 数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 import javax.servlet.http.*; pu ...
 - Struts2开山篇【引入Struts、自定义MyStruts框架】
		
前言 这是Strtus的开山篇,主要是引入struts框架-为什么要引入struts,引入struts的好处是什么-. 为什么要引入struts? 首先,在讲解struts之前,我们来看看我们以前写的 ...
 - 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
		
一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...
 - struts struts拦截器(过滤器)
		
在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...
 - [Java面试四]Strust2总结及在面试中的一些问题.
		
1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前端控制器模式] MV ...
 - SSH-Struts第三弹:传智播客视频教程第一天上午的笔记
		
一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...
 - Struts2基本配置详解
		
Struts2配置文件加载顺序 struts2 配置文件由核心控制器加载 StrutsPrepareAndExecuteFilter (预处理,执行过滤) init_DefaultProperties ...
 - struts2笔记4
		
1.自定义struts拦截器 应用场景:如果用户登陆后可以访问action中的所有方法,如果用户没有登陆不允许访问action中的方法,并且提示“你没有操作权限” 1)两个页面,一个用户登陆user. ...
 
随机推荐
- linux 登录档配置分析
			
登录档的重要性 解决系统方面的错误: 解决网络服务的问题: 过往事件记录簿: Linux 常见的登录档档名 /var/log/cron: 你的 crontab 排程有没有实际被进行? 进行过程有没有发 ...
 - MVC 微信扫码支付
			
微信扫码支付有两种模式, 模式一和模式二, 两者具体的区别可参考官网文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 微 ...
 - Android发送短信核心代码
			
核心代码:(1)SmsManager manager = SmsManager.getDefault(); //获得默认的消息管理器(2)ArrayList<String> list = ...
 - solaris安装oracle遇INS 30131 错误
			
安装11.2.0.4,报错: [FATAL] [INS-30131] Initial setup required for the execution of installer validations ...
 - [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 ...
 - 学习Java,还需要学好哪些知识
			
很多人认为学好一门程序语言就需要学好逻辑,其实这对于很多人而言是对的,但是真的对于需要写程序的学员来说,只有逻辑好其实是不够的,如果你能具备以下几项能够为你在程序编译中大大提高工作效率.现在昆明jav ...
 - javascript设计模式(单体模式)
			
主要内容: js中最基本.应用最广的模式就是单体模式,实现原理是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变更进行访问,确保对象只存在一份实例. 单体模式的特点: 在网页中使用全局变 ...
 - java 多态2
			
http://www.cnblogs.com/wqq0402/p/6180685.html package test05; public class DuoTai_Test02 { /**多个对象,一 ...
 - Crystal Reports拉报表报错:Error detected by database DLL
			
问题描述: 最近在使用Crystal Reports打印报表时,提示错误信息:"Error detected by database DLL." 如下图: 经查找,是因为数据库名称 ...
 - C# 小工具开发--DeBugHttp
			
随着RESTful的流行,前后端分离,我们后端开发人员在开发过程中多http相关方法进行测试.这就是这个小工具的初衷. 代码地址:https://github.com/gdoujkzz/DebugHt ...