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

当我们实现登录功能的时候,首先会创建一个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\t"+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+"\t");
            }
        }
        //使用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>

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

自定义框架(MyMvc)的更多相关文章

  1. 编写自定义的JDBC框架与策略模式

    本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...

  2. 写自己的ASP.NET MVC框架(上)

    http://www.cnblogs.com/fish-li/archive/2012/02/12/2348395.html 阅读目录 开始 ASP.NET程序的几种开发方式 介绍我的MVC框架 我的 ...

  3. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(四)

    SpringSecurity(1) 其实啊,这部分我是最不想写的,因为最麻烦的也是这部分,真的是非常非常的麻烦.关于SpringSecurity的配置,让我折腾了好半天,网上的配置方式一大把,但总有一 ...

  4. Python之路【第十五篇】WEB框架

    WEB框架本质 Python的WEB框架分为两类: 1.自己写socket,自己处理请求 2.基于wsgi(Web Server Gateway Interface WEB服务网关接口),自己处理请求 ...

  5. Android 热修复技术(1)---原理

    热修复技术分为几部分: 原理介绍 Android HotFix源码分析 自定义框架 1.Android分包MultiDex原理 首先Dex是什么东西? Dex就是Window里面的exe文件 也就是可 ...

  6. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

  7. python之路 目录

    目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...

  8. C#对象克隆介绍

    浅拷贝和深拷贝 有两种对象克隆的方法:浅拷贝和深拷贝.浅拷贝只是复制引用,而不会复制引用的对象.深拷贝会复制引用的对象. 因此,原始对象中的引用和浅拷贝对象中的同一个引用都指向同一个对象.而深拷贝的对 ...

  9. GhostDoc Pro v4.9.14093.Cracked.By.SubMain 一款好用的代码注释生成工具——VS插件

    一款比较好用的 VS 插件,能够快速生成注释. 这是 Pro 版本,与标准版本相比,支持对类.文件批量生成注释并且可以生成 CHM 帮助文件. 具体差异请转到: http://submain.com/ ...

随机推荐

  1. WP8解析XML格式文件

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...

  2. A Beginner&#39;s Guide to Paxos

    Google Drive: A Beginner's Guide to Paxos The code ideas of Paxos protocol: 1) Optimistic concurrenc ...

  3. 下拉列表 select-option ; select-optgroup-option

    HTML中的下拉列表: <select> <option value ="1">Volvo</option> <option value  ...

  4. Java中长度为0的数组与null的区别

    有如下两个变量定义,这两种定义有什么区别呢? 1. int[] zero = new int[0]; 2. int[] nil = null; zero是一个长度为0的数组,我们称之为“空数组”,空数 ...

  5. 为何jquery动态添加的input value无法提交到数据库?【坑】

    有两个输入框,我想让第一个输入框失去焦点以后,第二个输入框自动获取第一个输入框的value为默认值,jquery代码如下,可以正常显示,但是用PHP提交数据,并插入数据库的时候确实空值,尚未查找到原因 ...

  6. polymorphic-associations 多态关联实例 ruby on rails

    这次做新项目的时候,把图片都放在了一个表里,其他表中不再存图片信息,通过多态关联建立表之间的关系. (1)新建picture表, component表不需要处理 class CreatePicture ...

  7. 【poj2546】 Circular Area

    http://poj.org/problem?id=2546 (题目链接) 题意 求两圆的面积交 Solution 一道水题Wa死我了,肯定是昨晚搞太晚的缘故= =. 两圆的位置关系有5种,而这里要求 ...

  8. RadioGroup和ViewPager实现Tab

    Activity的布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  9. iOS学习之UITableView编辑

    一.UITableView编辑 UITableView编辑(删除.添加)步骤: 让TableView处于编辑状态. 协议设定:1)确定Cell是否处于编辑状态:2)设定cell的编辑样式(删除.添加) ...

  10. linux笔记_20150417_ubuntu 常见问题_文件_音乐播放器

    最近在学习ubuntu的过程中,遇到了一些问题,就记下来了它的解决办法.以希望对你也有用. ),至少保证周围局域网内用户可以访问.至于配置文件,内容比较少,反正对我来讲能用就ok了~不知道会不会很弱 ...