zoukankan      html  css  js  c++  java
  • 自定义框架(MyMvc)

    //初次接触自定义框架,简单的登录功能的实现流程::

    当我们实现登录功能的时候,首先会创建一个login.jsp

    会写这些登录表单

      <form action="loginAction.action" method="post">
        姓名:<input type="text" name="name"/><br/>
        密码:<input type="text" name="pwd"/><br/>
        <input type="submit" value="登录">
        </form>

    //当然我们现在需要做的就是 吧我们自己写的框架在项目启动的时候成功部署

    首先我们要在程序启动的时候让程序自行启动一个servlet,并在servlet中写自己框架的流程部署

    需要在web.xml 中配置   

    <!-- 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; -->
    <load-on-startup>0</load-on-startup>


    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 定义约束文件 -->
    <!-- ELEMENT 表示元素 -->
    <!-- ATTLIST 表示属性 -->
    <!-- CDATA 表示字符串类型 -->
    <!-- REQUIRED 表示此属性必须的写 -->
    <!-- *代表多个 -->
    <!-- IMPLIED 表示此属性可写 -->
    <!DOCTYPE Framework[
        <!ELEMENT Framework (actions)>
        <!ELEMENT actions (action*)>
        <!ELEMENT action (result*)>
        
        <!ATTLIST action name CDATA #REQUIRED
                         class CDATA #REQUIRED
        >
        <!ATTLIST RESULT name CDATA #IMPLIED
                         redirect (true|false) "false"
        >
    ]>
    <Framework>
    <actions>
       <action name="loginAction" class="Action.LoginAction">
       <result name="success">success.jsp</result>
       <result name="login">index.jsp</result>
       </action>
    </actions>
    </Framework>
    public void init(ServletConfig config) throws ServletException {
            //config对象是javax.servlet.ServletConfig的对象,功能是获得初始化配置信息
            //config.getInitParameter是取得指定名称的初始化参数内容
            String filename = config.getInitParameter("config");
            System.out.println("GG	"+filename);
            String [] filenames=null;
            if(filename==null)
            {
                //如果没有别的参数信息,就将已经配好的放入数组中
                filenames=new String[]{"Framework.xml"};
                for (String string : filenames) {
                    System.out.println(string);
                }
            }
            else
            {
                //若果有其他的配置参数信息,那么以,分隔存入数组中
                filenames=filename.split(",");
                for (String string : filenames) {
                    System.out.println(string+"	");
                }
            }
            //使用init方法初始化
            man=new ActionMappingManager(filenames);
        }

    因为标红的代码,所以他就会执行如下代码:

    package Action;
    /**
     * 步骤三:
     * 由于action节点不止一个,所以需要配置一个ActionMappingManage类来管理ActionMapping类
     */
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    /**
     * 由于这个类是actions
     * 所以包含了一个成员变量   定制成key value的形式是因为  
     * actions 中每一个action 都有他对应的 name值,每一个name代表一个key
     * 每个action 代表一个 value
     * @author SLEEP
     * 解析资源文件中的节点对象
     *
     */
    public class ActionMappingManager {
        //actionMapping类的集合
      private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();
      public ActionMapping getActionMapping(String name)
      {
          return maps.get(name);
      }
      //通过init 装配的xml文件获取actions
      public ActionMappingManager(String[] files)
      {
          for (String filename : files) {
             
              Init(filename);
          }
      }
      //创建初始化方法,使用dom4j解析配置文件
      public void Init(String path)
      {
         System.out.println("呵呵-----------------------------------------");
         try {
             //getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据
             //把Framework.xml这个资源对象转换成  流
              InputStream is=this.getClass().getResourceAsStream("/"+path);
              //解析xml 用saxreader 对象去读取流
              Document doc= new SAXReader().read(is);
              //获取根节点
              Element root = doc.getRootElement();
              //获取自定义框架中的第一个 acitons节点
              Element actions=(Element)root.elementIterator().next();
              System.out.println("根节点"+actions.getName());
              //使用for循环来遍历actions节点下的所有action节点
              for(Iterator<Element> action=actions.elementIterator();action.hasNext();)
              {
                  //获取到<action>节点 action 是一个action的集合 ,我们要取出来第一项
                  Element actionnext = action.next();
                  System.out.println("根节点下的子节点"+actionnext.getName());
                  //分别获取到action节点中的name属性和class属性
                  String name = actionnext.attributeValue("name");
                  String classname = actionnext.attributeValue("class");
                  //将以上两个属性保存到ActionMapping类中
                  ActionMapping mapp=new ActionMapping();
                  mapp.setClassname(classname);
                  mapp.setName(name);
                  //由于一个action节点下有多个result节点 遍历action下所有的result节点
                  for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();)
                  {
                      //获取到result节点
                      Element resultnext = result.next();
                      //提取result节点的name属性值和result节点中的值
                      String resultname = resultnext.attributeValue("name");
                      String resultvalue=resultnext.getText();
                      //将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!)
                      mapp.addResult(resultname, resultvalue);
                      System.out.println(mapp.getName());
                  }
                  //得到所有action节点的集合
                  maps.put(mapp.getName(), mapp);
              }
              
        } catch (Exception e) {
            e.printStackTrace();
        }
          
      }
    }

    //servlet方法中的init 执行完毕之后,我们的tomcat成功开启

    当我们点击登录的时候因为是post 请求,所以会自动调用servlet 中的doPost方法如下:

    ActionMappingManager man=null;
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            //由于index.jsp为默认请求界面,所以getname方法会获取到index.jsp正好与ActionMappingManager中map的key对应
            //获取到ActionMapping对象
            ActionMapping actionMapping = man.getActionMapping(getname(request));
            //获取action接口利用反射机制
            Action action = ActionManager.getActionClass(actionMapping.getClassname());
            try {
                //返回一个逻辑视图名
                String message = action.execute(request, response);
                String results = actionMapping.getResults(message);
                response.sendRedirect(results);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //获取请求的路径名 例:day01_0100/index.jsp   获取的是index.jsp   
        public String getname(HttpServletRequest request)
        {
            //项目+请求地址
            String requestURI = request.getRequestURI();
            System.out.println(requestURI);
            //项目名称
            String contextPath = request.getContextPath();
            System.out.println(contextPath);
            //具体的请求
            String path=requestURI.substring(contextPath.length());
            System.out.println(path);
            String filename=path.substring(1,path.lastIndexOf(".")).trim();
            System.out.println(filename);
            return filename;
        }ActionMappingManager man=null;
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            //由于index.jsp为默认请求界面,所以getname方法会获取到index.jsp正好与ActionMappingManager中map的key对应
            //获取到ActionMapping对象
            ActionMapping actionMapping = man.getActionMapping(getname(request));
            //获取action接口利用反射机制
            Action action = ActionManager.getActionClass(actionMapping.getClassname());
            try {
                //返回一个逻辑视图名
                String message = action.execute(request, response);
                String results = actionMapping.getResults(message);
                response.sendRedirect(results);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //获取请求的路径名 例:day01_0100/index.jsp   获取的是index.jsp   
        public String getname(HttpServletRequest request)
        {
            //项目+请求地址
            String requestURI = request.getRequestURI();
            System.out.println(requestURI);
            //项目名称
            String contextPath = request.getContextPath();
            System.out.println(contextPath);
            //具体的请求
            String path=requestURI.substring(contextPath.length());
            System.out.println(path);
            String filename=path.substring(1,path.lastIndexOf(".")).trim();
            System.out.println(filename);
            return filename;
        }

    //因为自定义Mvc没有拦截器,所以<url-pattern>*.action</url-pattern>

    <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <!-- 没有像struts2那样的过滤器,手动限制过滤所有的action -->
    <url-pattern>*.action</url-pattern>
    </servlet-mapping>

    这样一个自定义框架就完成了!

  • 相关阅读:
    wifi 天线
    Ubuntu下通过SSH远程登录服务器的方法
    wifi 天线
    免费20G全能空间正在火爆开放中。。。。。要的抓紧时间申请了.
    php设计模式 Mediator (中介者模式)
    DEDE图片集上传图片时出错显示(FILEID)的解决办法
    SPL spl_autoload_register与__autoload方法使用示例浅谈
    mysql_fetch_array()和mysql_fetch_assoc()两个函数的区别
    nginx多站设置
    php中echo(),print(),print_r()的区别
  • 原文地址:https://www.cnblogs.com/myhome-1/p/5977429.html
Copyright © 2011-2022 走看看