`
chusiyou
  • 浏览: 5596 次
  • 性别: Icon_minigender_1
  • 来自: 奥格瑞玛
社区版块
存档分类
最新评论

模拟Struts功能----ActionServlet

    博客分类:
  • java
阅读更多
由于这段时间学习struts,对struts原理有一些了解,为了巩固自己的学习,所以自己手写了模拟struts功能的这样一个框架,写的不好还忘大家见谅....但是我可以拍拍胸脯的给大家说...这绝对是自己原创,写的不好还忘大家纠正,希望大家能一起学习...

以下是ActionServlet源码

package com.chusiyou.struts.core;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ActionServlet extends HttpServlet {
// private HashMap<String, String> formBeans = new HashMap<String,
// String>();
// private List<ActionMappings> actions = new ArrayList<ActionMappings>();
// private String actionName;

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 得到请求的路径
// String str1 = request.getServlet().getInitParameter("XXXX");
String str1 = request.getRealPath("WEB-INF/struts.config.xml");
HashMap<String, String> formBeans = new HashMap<String, String>();
List<ActionMappings> actions = new ArrayList<ActionMappings>();
String actionName = null;
this.readConfiguration(str1, formBeans, actions);
String name = request.getServletPath();
String str = name.substring(0, name.lastIndexOf("."));
System.out.println("请求的路径为:" + str);
ActionForm actionForm = null;
ActionMappings actionMappings = null;
Iterator<ActionMappings> iter = actions.iterator();
while (iter.hasNext()) {
ActionMappings action = iter.next();
if (action.getPath().equals(str)) {
for (String beanName : formBeans.keySet()) {
//判断当前的action 是否配置了name属性
if (action.getName() != null) {
if (action.getName().equals(beanName)) {
//填充formBean并且把它放进session范围之中
FormFullUtil.full(request, formBeans.get(beanName),
beanName);
//得到FormBean
actionForm = (ActionForm) request.getSession()
.getAttribute(beanName);

}
}
}
actionName = action.getType();
actionMappings = action;
}
}
try {
//得到要调用对象的字节码
Class clazz = Class.forName(actionName);

Action action = (Action) clazz.newInstance();
//得到execute方法的字节码
Method method = action.getClass().getMethod("execute",
ActionMapping.class, ActionForm.class,
HttpServletRequest.class, HttpServletResponse.class);
//调用action 的execute方法
ActionForward actionForward = (ActionForward) method.invoke(action,
new ActionMapping(request, response, actionMappings),
actionForm, request, response);
} catch (Exception e) {
e.printStackTrace();
}
}

// 读取struts配置文件
private void readConfiguration(String configurationName,
HashMap<String, String> formBeans, List<ActionMappings> actions) {
SAXReader ready = new SAXReader();

// 获得解析的XML文档对象
try {
Document doc = ready.read(configurationName);
Element root = doc.getRootElement();
Element rootBean = root.element("form-beans");
for (Iterator i = rootBean.elementIterator("form-bean"); i
.hasNext();) {
Element beanNode = (Element) i.next();
//将循环到的formBean放进map集合
formBeans.put(beanNode.attributeValue("name"), beanNode
.attributeValue("type"));
}
Element rootAction = root.element("action-mappings");
for (Iterator i = rootAction.elementIterator("action"); i.hasNext();) {
Element actionNode = (Element) i.next();
ActionMappings action = new ActionMappings();
//得到path
action.setPath(actionNode.attributeValue("path"));
//得到name
action.setName(actionNode.attributeValue("name"));
//得到type
action.setType(actionNode.attributeValue("type"));
//判断该action是否有forward节点
if (actionNode.isTextOnly()) {

} else {
for (Iterator j = actionNode.elementIterator("forward"); j
.hasNext();) {
Element forwardNode = (Element) j.next();
action.getForwards().put(
forwardNode.attributeValue("name"),
forwardNode.attributeValue("path"));
}
}

actions.add(action);

}

} catch (Exception e) {
e.printStackTrace();
}
}

}
0
0
分享到:
评论

相关推荐

    模拟Struts功能--最后的一些实体bean以及源码下载

    在"模拟Struts功能--最后的一些实体bean以及源码下载"这个主题中,我们可以深入探讨Struts框架的核心概念、实体Bean的作用以及如何通过源码学习Struts的工作原理。 首先,让我们了解一下Struts框架的基础。Struts...

    servlet模拟struts1工作原理

    在`myStruts`这个压缩包中,可能包含模拟Struts1流程所需的代码和配置文件,如ActionServlet的实现、Action类、ActionForm类、struts-config.xml以及展示结果的JSP页面。通过对这些文件的分析和实践,你可以更深入地...

    Servlet简单模拟Struts2

    在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...

    用servlet模拟struts_mvc框架

    **Servlet模拟Struts_MVC框架详解** 在Java Web开发中,MVC(Model-View-Controller)模式是一种广泛应用的设计模式,它将业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和可扩展性。Struts是Apache组织...

    struts-2.3.15.3-lib

    Struts 2支持Mock对象和模拟请求,使得测试更加方便。在部署时,所有库文件都需要包含在应用的类路径中。 总的来说,Struts 2.3.15.3是一个成熟的版本,它提供了结构化的Web应用开发方式,但同时也需要注意安全性和...

    servelt模拟struts1框架

    在模拟Struts1的过程中,我们将创建一个Servlet类,这个类将扮演ActionServlet的角色。首先,我们需要在Servlet中读取XML配置文件,这个配置文件类似于Struts-config.xml,包含了ActionMapping的信息。这可以通过DOM...

    模拟struts1写的代码+文档分析

    这个压缩包文件包含了模拟Struts1框架编写的代码和相关的文档,这对于理解Struts1的工作原理以及如何在实际项目中应用它非常有帮助。 1. **Struts1框架概述** Struts1是一个基于Model-View-Controller (MVC)设计...

    Struts框架所需Jar包

    以及`servlet-api.jar`和`jsp-api.jar`,与Servlet和JSP相关的API。 5. **开发工具**:在开发过程中,IDE(如Eclipse或IntelliJ IDEA)通常会需要特定的Struts插件,如`struts2-eclipse-plugin`,以提供更好的代码...

    Struts-BooksSystem.rar

    - **架构**:Struts 1是Apache软件基金会下的一个开源项目,其核心是一个控制器Servlet,负责接收HTTP请求,并根据配置信息调用相应的Action来处理业务逻辑。 - **工作流程**:用户发送请求到控制器,控制器解析...

    模拟STRUTS的小项目

    - **ActionServlet**:Struts的核心控制器,负责接收HTTP请求,解析请求参数,并将请求转发给相应的Action。 - **Action**:实现了业务逻辑的Java类,每个Action对应一个用户操作或页面跳转。 - **ActionForm**:...

    struts1&struts2

    - **Struts2** 解耦了Action与Servlet容器,提供了更简单的测试支持,Action可以通过模拟对象独立测试,而不需要实际的HttpServletRequest和HttpServletResponse。 6. **测试能力** - **Struts1.x** 的测试通常...

    Struts2.2.3所有jar包

    Struts2支持单元测试和集成测试,可以通过Mocking和模拟对象来测试Action和业务逻辑。 总结,Struts2.2.3版本包含了所有必要的jar包,用于构建基于Struts2框架的Java Web应用。这些jar包涵盖了框架的核心组件、依赖...

    struts2 jar包

    6. **Servlet容器兼容**:由于Struts2是基于Servlet API的,所以还需要`servlet-api.jar`和`jsp-api.jar`,但这些通常由应用服务器提供,不需手动添加到项目中。 7. **测试支持**:在开发过程中,`struts2-test-...

    模拟Struts2拦截器代码

    本文将深入探讨如何模拟Struts2的拦截器,并通过一个实际的Filter类来阐述其工作原理。 首先,我们需要理解Struts2拦截器的基本概念。拦截器是一个实现了`Interceptor`接口的Java类,它位于动作调用之前和之后,...

    Struts2 jar包

    例如,`struts2-core.jar`提供了ActionSupport类,它是所有Action类的基础,支持国际化、验证等功能。此外,Interceptor接口定义了拦截器的规范,使得开发者可以自定义业务逻辑处理。 2. **Freemarker/Velocity模板...

    java反射之模拟struts中央控制器

    通过模拟Struts的中央控制器,我们可以理解其工作原理,并学习如何在没有完整框架支持的情况下实现类似的功能。 首先,我们需要了解HTTP请求的基本流程。当一个HTTP请求到达服务器时,中央控制器会解析请求URL,...

    利用模拟Struts做简易博客

    在这个“利用模拟Struts做简易博客”的项目中,我们可以通过Struts来构建一个简单易用的博客系统,允许用户发布、编辑和查看文章。以下是关于这个项目的一些关键知识点: 1. **Struts框架**:Struts是Apache软件...

    Struts2之Servlet API及单元测试初识案例struts005

    Struts2中的`ActionServlet`就是对Servlet API的一种扩展,它作为整个框架的调度中心,负责接收请求、调用Action并返回相应的结果。 在Struts2中,Servlet API主要体现在以下几点: 1. **过滤器(Filter)**:...

Global site tag (gtag.js) - Google Analytics