myStruts

1.Action类

package com.xiaoxiong.myStruts.action;

public class UserAction {
    public String create(){
        System.out.println("create");
        return "success";
    }

    public String update(){
        System.out.println("update");
        return "s1";
    }

    public String delete(){
        System.out.println("delte");
        return "s2";
    }
}

UserAction

2.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<struts>
    <package name="xxx1" extends="struts-default" namespace="/user">

        <!-- http://localhost:8080/xxx/user/create -->

        <action name="create" class="com.xiaoxiong.myStruts.action.UserAction" method="create">
            <result name="success">/index.jsp</result>
        </action>

        <action name="update" class="com.xiaoxiong.myStruts.action.UserAction" method="update">
            <result name="s1"  type="redirect">/index.jsp</result>
        </action>

        <action name="delete" class="com.xiaoxiong.myStruts.action.UserAction" method="delete">
            <result name="s2">/index.jsp</result>
        </action>
    </package>

    <package name="xxx2" extends="struts-default" namespace="/user2">

        <!-- http://localhost:8080/xxx/user/create -->

        <action name="c" class="com.xiaoxiong.myStruts.action.UserAction" method="create">
            <result name="success" type="redirect">/index.jsp</result>
        </action>

        <action name="u" class="com.xiaoxiong.myStruts.action.UserAction" method="update">
            <result name="s1"  type="redirect">/index.jsp</result>
        </action>

        <action name="d" class="com.xiaoxiong.myStruts.action.UserAction" method="delete">
            <result name="s2">/index.jsp</result>
        </action>
    </package>
</struts>

struts.xml

3.entity类

package com.xiaoxiong.myStruts.entity;

import java.util.ArrayList;
import java.util.List;

public class Package {
    private String name;    //包名
    private String extes;  //继承的包名
    private String namespace; //根节点
    private List<Action> actionList = new ArrayList<Action>();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getExtes() {
        return extes;
    }
    public void setExtes(String extes) {
        this.extes = extes;
    }
    public String getNamespace() {
        return namespace;
    }
    public void setNamespace(String namespace) {
        this.namespace = namespace;
    }
    public List<Action> getActionList() {
        return actionList;
    }
    public void setActionList(List<Action> actionList) {
        this.actionList = actionList;
    }

}

Package

package com.xiaoxiong.myStruts.entity;

import java.util.ArrayList;
import java.util.List;

public class Action {
    private String name;    //action名
    private String clz;        //引用类
    private String method;    //方法集合
    private List<Result> resultList = new ArrayList<Result>();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getClz() {
        return clz;
    }
    public void setClz(String clz) {
        this.clz = clz;
    }
    public String getMethod() {
        return method;
    }
    public void setMethod(String method) {
        this.method = method;
    }
    public List<Result> getResultList() {
        return resultList;
    }
    public void setResultList(List<Result> resultList) {
        this.resultList = resultList;
    }

}

Action

package com.xiaoxiong.myStruts.entity;

public class Result {
    private String name;     //返回的结果名
    private String type;     //跳转的方式
    private String localtion;    //跳转的对象

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getLocaltion() {
        return localtion;
    }
    public void setLocaltion(String localtion) {
        this.localtion = localtion;
    }

}

4.编写Configuration对struts.xml文件进行解析

package com.xiaoxiong.myStruts.core;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.xiaoxiong.myStruts.entity.Action;
import com.xiaoxiong.myStruts.entity.Package;
import com.xiaoxiong.myStruts.entity.Result;

/**
 * 读取struts.xml配置文件的信息
 * @author user
 *
 */
@SuppressWarnings("all")
public class Configuration {
    private List<Package> packageList = new ArrayList<Package>();

    //构建URI与Action配置信息之间的对照关系
    private Map uriAction = new HashMap();

    public Configuration() throws ParserConfigurationException, SAXException, IOException{
        //1.创建一个XML工厂类用于解析XML的工具
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //2.创建DocumentBuilder对象,这个对象用于构建XML文件
        DocumentBuilder db = dbf.newDocumentBuilder();
        //获取存放class的根路径
        String xmlPath = this.getClass().getResource("/").getPath() + "struts.xml";
        //3.利用DOM解析struts.xml文件,经过解析的文档被包装为Doucument(文档对象)
        //Doucument存储了完整的XML的DOM属性结构
        Document doc = db.parse(new File(xmlPath));
        //4.获取所有包的信息
        NodeList packages = doc.getElementsByTagName("package");
        //5.循环遍历包
        for (int i = 0; i < packages.getLength(); i++) {
            //获取所有包的对象
            Element pak = (Element) packages.item(i);
            //将读取到的信息封装为Package对象
            Package newpak = new Package();
            newpak.setName(pak.getAttribute("name"));   //获取包名
            newpak.setExtes(pak.getAttribute("extes")); //获取struts.xml中extends属性
            newpak.setNamespace(pak.getAttribute("namespace"));

            System.out.println(pak.getAttribute("name") + ":" + pak.getAttribute("extends") +
                    ":" + pak.getAttribute("namespace"));
            //获取每一个包的action对象
            NodeList actions = doc.getElementsByTagName("action");
            for (int j = 0; j < actions.getLength(); j++) {
                //获取所有action对象
                Element action = (Element)actions.item(j);
                //将读取到的信息封装为Action对象
                Action newAction = new Action();
                newAction.setName(action.getAttribute("name"));
                newAction.setClz(action.getAttribute("class"));
                newAction.setMethod(action.getAttribute("method"));

                System.out.println("\t" + action.getAttribute("name") + ":"
                + action.getAttribute("class") + ":" + action.getAttribute("method"));
                System.out.println("action.getAction():"+newAction.getClz());
                //获取results节点
                NodeList results = action.getElementsByTagName("result");

                for (int k = 0; k < results.getLength(); k++) {
                    //获取所有result对象
                    Element result = (Element)results.item(k);
                    //将读取到的信息封装到Result对象中
                    Result newResult = new Result();

                    newResult.setName(result.getAttribute("name"));
                    newResult.setType(result.getAttribute("type"));
                    newResult.setLocaltion(result.getTextContent());

                    newAction.getResultList().add(newResult);

                    //getTextContent()方法用于获取标签的内容
                    System.out.println("\t\t" + result.getAttribute("name") + result.getAttribute("type") +
                            ":" + result.getTextContent());
                }
                //将aciont封装到Package中
                newpak.getActionList().add(newAction);

                //构建URI与Action配置信息之间的对照关系
                uriAction.put(newpak.getNamespace()+"/"+newAction.getName(), newAction);

                System.out.println("URI与Action配置信息之间的对照关系--》"+newpak.getNamespace()+"/"+newAction.getName()+":"+newAction);
            }
            //将封装好的package对象放入packages集合
            packageList.add(newpak);
        }
    }

    public Map getUriAction() {
        return uriAction;
    }

    public void setUriAction(Map uriAction) {
        this.uriAction = uriAction;
    }

    public List<Package> getPackageList() {
        return packageList;
    }

    public void setPackageList(List<Package> packageList) {
        this.packageList = packageList;
    }

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        new Configuration();
    }
}

Configuration

5.编写StrutsPrepareAndExecuteFilter对struts.xml中的配置进行处理

package com.xiaoxiong.myStruts.core;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xiaoxiong.myStruts.entity.Action;
import com.xiaoxiong.myStruts.entity.Result;

public class StrutsPrepareAndExecuteFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("程序销毁");
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)
            throws IOException, ServletException {
        /**
         * 获取HttpServletRequest,HttpServletResponse对象
         */
        HttpServletRequest request = (HttpServletRequest)arg0;
        HttpServletResponse response = (HttpServletResponse)arg1;

        //URL:统一资源定位符
        //URI:统一资源接口
        //获取URI
        String uri = request.getRequestURI();
        //Web.xml中定义的过滤其中是接收所有的类型数据
        //对JSP文件不做拦截
        if(uri.endsWith(".jsp")){
            arg2.doFilter(arg0, arg1);
            return;
        }

        //获取工程名
        String contextPath = request.getContextPath();
        System.out.println("获取工程名"+contextPath);

        //获取action接口
        String actionURI = uri.substring(contextPath.length());
        System.out.println("$$$$$$$$$$$$$$actionURI"+actionURI);

        try {
            //加载struts.xml文件
            Configuration conf = new Configuration();
            System.out.println("返回加载文件结果:"+conf);
            //获取已配置的所有uri与action的对应信息
            Map<String, Action> actionHM = conf.getUriAction();
            System.out.println("actionHM.get(actionURI)"+actionHM.get(actionURI));
            if(actionHM.get(actionURI) != null){
                //获取与之匹配的Action
                Action action = actionHM.get(actionURI);
                //
                System.out.println("action结果为:"+action);
                //获取对应的Action类
                String className = action.getClz();
                System.out.println("========="+className);
                //获取执行的method对象
                String methodName = action.getMethod();

                //利用反射技术动态执行相应的方法
                //获取action类对象
                Class clz = Class.forName(className);
                //实例化Action对象
                Object act = clz.newInstance();
                //获取对应的Action中的执行方法
                Method method = clz.getMethod(methodName);
                //执行配置好的Action方法
                String ret = (String)method.invoke(act);

                System.out.println("方法执行的返回值:"+ret);

                //在配置的Result中查找对应的result是否存在
                List<Result> resultList = action.getResultList();
                for(Result r : resultList){
                    System.out.println("======22222r.getName():"+r.getName()+","+r.getLocaltion());
                    //查找匹配的结果
                    if(ret.equals(r.getName())){
                        if("redirect".equals(r.getType())){
                            //跳转的路径
                            System.out.println("跳转路径:"+contextPath+r.getLocaltion());
                            response.sendRedirect(contextPath+r.getLocaltion());
                        }else{
                            System.out.println("转发路径:"+r.getLocaltion());
                            request.getRequestDispatcher(r.getLocaltion()).forward(request, response);
                        }
                    }
                }
            }else{
                System.out.println(actionURI+"未找到匹配的Action");
            }

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

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("程序初始化");
    }

}

StrutsPrepareAndExecuteFilter

6.访问http://localhost:8088/strutsModel/user/create

时间: 2024-08-01 15:21:39

myStruts的相关文章

深入理解struts的运行机制

在此申明本博文并非原创,原文:http://blog.csdn.net/lenotang/article/details/3336623,本文章是在此文章基础上进行优化.也谈不上优化,只是加上了点自己的想法 jar包准备 为什么会用到这两个jar包呢,因为我需要通过这个jar来解析xml配置文件. 新建项目 流程梳理 struts配置文件 <?xml version="1.0" encoding="UTF-8"?> <struts> <

基于Struts自定义MVC-1

自定义MVC        数据库:Oracle表:User(id,uname,upwd)自定义Struts框架 一.定义Action接口 1 import javax.servlet.http.*; 2 3 public interface Action { 4 /** 5 * 执行方法 6 * @return 7 */ 8 String execute(HttpServletRequest request,HttpServletResponse response); 9 } 二.根据特定功能

DTD验证XML文档

DTD验证XML文档        1.DTD简介:DTD是Document Type Definition的缩写,即文档定义            1.1:DTD的内容包含:                    元素定义规则                    元素之间的关系规则                    属性的定义规则            1.2:DTD的作用如下:                    DTD使每个XML文件可以携带一个自身格式的描述          

(28)初识struts框架

案例剖析中介绍了一个自己写的mystruts框架,这里开始简单的认识struts框架. 1.先看一个简单的struts开发的例子来熟悉一下流程 Struts就是基于mvc模式的框架! (struts其实也是servlet封装,提高开发效率!) Struts开发步骤: 1.web项目,引入struts - jar包 2. web.xml中,引入struts的核心功能 配置过滤器,通过配置一个过滤器来引入structs中的一些服务--org.apache.struts2.dispatcher.ng.

对xml文件封装思想的处理

配置文件的封装: <?xml version="1.0" encoding="UTF-8"?> <mystruts> <action name="login" class="cn.lyjs.framework.action.LoginAction" method="login"> <result name="loginFaild" >/lo

Struts2入门

一.一个简单的例子 文件结构  web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLo

[转]Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序

转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/13/251101.html 本系列教程将详细介绍Struts 1.x的基本原理和使用方法,读者可以参阅<Struts 2系列教程>来比较Struts 1.x和Struts 2.x的相同点和不同点.    在这篇文章中将以一个简单的例子(mystruts)来演示如何使用MyEclipse来开发.运行Struts程序,并给出了解决ActionForm出现乱码问题的方法.读者可以从本文中了解

Java自学手记——struts2

struts2框架 struts2是一种基于MVC模式的框架,是在struts1的基础上融合了xwork的功能. struts2框架预处理了一些功能: >请求数据自动封装, >文件上传的功能 >对国际化功能的简化 >数据校验功能 使用struts2框架开发的流程: 1.引入jar文件 >commons-fileupload-1.2.2.jar [文件上传相关包] >commons-io-2.0.1.jar >struts2-core-2.3.4.1.jar [st

readbook:自己设计mvc框架,java类似struts2的实现

如果你不能简单说清楚,就是你还没有完全明白.——爱因斯坦 need things: 1.操作xml文档 dom4j 等开源类库 2. dtd的验证 等知识储备 * n到n次     ? 0到1次        + 1到n次 3. java 反射的相关知识反射过程:导入 java.lang.reflect.*1.获得需要操作的类的 Java.lang.Class对象2.调用Class的方法获取Field, Method等对象使用 反射api 进行操作 反射的常用类Class 类 : 反射的核心类,