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

当我们实现登录功能的时候,首先会创建一个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. python学习之路web框架

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

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

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

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

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

  8. python之路 目录

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

  9. C#对象克隆介绍

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

随机推荐

  1. webform开发基础

    ASP.NET WebForm C/S(Client/Server):客户端服务器 B/S(Browser/Server):浏览器服务器 C/S和B/S的区别: 首先必须强调的是C/S和B/S并没有本 ...

  2. 总结一下Android中主题(Theme)的正确玩法

    在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme">,其中的@style/AppT ...

  3. Bootstrap CSS 表单

    表单布局 Bootstrap 提供了下列类型的表单布局: 垂直表单(默认) 内联表单 水平表单 垂直或基本表单 基本的表单结构是 Bootstrap 自带的,个别的表单控件自动接收一些全局样式.下面列 ...

  4. android隐藏底部虚拟键Navigation Bar实现全屏

    隐藏底部虚拟键Navigation Bar实现全屏有两种情况 第一种:始终隐藏,触摸屏幕时也不出现 解决办法:同时设置以下两个参数 View.SYSTEM_UI_FLAG_HIDE_NAVIGATIO ...

  5. nios II--实验3——led 100M硬件部分

    led_100M 硬件开发 新建原理图 参照实验二(led) QSys调用模块 参照实验二(led) 原理图添加IP模块 参照实验二(led),在调用PLL的时候需要修改系统和SDRAM的时钟频率为1 ...

  6. 禁止浏览器直接访问php文件

    框架中很多php文件并不是用来如果熟悉框架的路径就能直接访问这个文件,虽然访问到了也不能看到什么(他看到的是编译过后的html文件),但还是觉的很不安全. 可以通过下面这种方法拒绝他人的从浏览器中的访 ...

  7. IL查看委托

    查看委托的IL 通过IL来查看委托的原理, 委托示例代码 写一个委托的类如下 using System;   namespace MyCollection { //定义一个类,该类包含两个静态方法 c ...

  8. iOS开发之格式化日期时间(转)

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateForma ...

  9. JEECMS插件开发

    在jeecms框架中,有一个简单的插件,它并没有写具体的功能实现,但可以从这个简单的插件中找到如何在jeecms框架中开发框架的方法.      首先创建一个jeecms的框架demo,登录jeecm ...

  10. sqlserver linkserver

    --创建链接服务器exec sp_addlinkedserver    'srv_lnk','','SQLOLEDB','远程服务器名或ip地址'exec sp_addlinkedsrvlogin ' ...