首页 > 代码库 > 自定义框架(MyMvc)

自定义框架(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="http://www.mamicode.com/登录">
    </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)