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

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

会写这些登录表单

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

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

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

需要在web.xml 中配置

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


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

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

  1. package Action;
  2. /**
  3. * 步骤三:
  4. * 由于action节点不止一个,所以需要配置一个ActionMappingManage类来管理ActionMapping类
  5. */
  6. import java.io.InputStream;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.Map;
  10.  
  11. import org.dom4j.Document;
  12. import org.dom4j.Element;
  13. import org.dom4j.io.SAXReader;
  14. /**
  15. * 由于这个类是actions
  16. * 所以包含了一个成员变量 定制成key value的形式是因为
  17. * actions 中每一个action 都有他对应的 name值,每一个name代表一个key
  18. * 每个action 代表一个 value
  19. * @author SLEEP
  20. * 解析资源文件中的节点对象
  21. *
  22. */
  23. public class ActionMappingManager {
  24. //actionMapping类的集合
  25. private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();
  26. public ActionMapping getActionMapping(String name)
  27. {
  28. return maps.get(name);
  29. }
  30. //通过init 装配的xml文件获取actions
  31. public ActionMappingManager(String[] files)
  32. {
  33. for (String filename : files) {
  34.  
  35. Init(filename);
  36. }
  37. }
  38. //创建初始化方法,使用dom4j解析配置文件
  39. public void Init(String path)
  40. {
  41. System.out.println("呵呵-----------------------------------------");
  42. try {
  43. //getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据
  44. //把Framework.xml这个资源对象转换成 流
  45. InputStream is=this.getClass().getResourceAsStream("/"+path);
  46. //解析xml 用saxreader 对象去读取流
  47. Document doc= new SAXReader().read(is);
  48. //获取根节点
  49. Element root = doc.getRootElement();
  50. //获取自定义框架中的第一个 acitons节点
  51. Element actions=(Element)root.elementIterator().next();
  52. System.out.println("根节点"+actions.getName());
  53. //使用for循环来遍历actions节点下的所有action节点
  54. for(Iterator<Element> action=actions.elementIterator();action.hasNext();)
  55. {
  56. //获取到<action>节点 action 是一个action的集合 ,我们要取出来第一项
  57. Element actionnext = action.next();
  58. System.out.println("根节点下的子节点"+actionnext.getName());
  59. //分别获取到action节点中的name属性和class属性
  60. String name = actionnext.attributeValue("name");
  61. String classname = actionnext.attributeValue("class");
  62. //将以上两个属性保存到ActionMapping类中
  63. ActionMapping mapp=new ActionMapping();
  64. mapp.setClassname(classname);
  65. mapp.setName(name);
  66. //由于一个action节点下有多个result节点 遍历action下所有的result节点
  67. for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();)
  68. {
  69. //获取到result节点
  70. Element resultnext = result.next();
  71. //提取result节点的name属性值和result节点中的值
  72. String resultname = resultnext.attributeValue("name");
  73. String resultvalue=resultnext.getText();
  74. //将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!)
  75. mapp.addResult(resultname, resultvalue);
  76. System.out.println(mapp.getName());
  77. }
  78. //得到所有action节点的集合
  79. maps.put(mapp.getName(), mapp);
  80. }
  81.  
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85.  
  86. }
  87. }

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

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

  1. ActionMappingManager man=null;
  2. public void doPost(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4.  
  5. //由于index.jsp为默认请求界面,所以getname方法会获取到index.jsp正好与ActionMappingManager中map的key对应
  6. //获取到ActionMapping对象
  7. ActionMapping actionMapping = man.getActionMapping(getname(request));
  8. //获取action接口利用反射机制
  9. Action action = ActionManager.getActionClass(actionMapping.getClassname());
  10. try {
  11. //返回一个逻辑视图名
  12. String message = action.execute(request, response);
  13. String results = actionMapping.getResults(message);
  14. response.sendRedirect(results);
  15. } catch (Exception e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }
  20. //获取请求的路径名 例:day01_0100/index.jsp 获取的是index.jsp
  21. public String getname(HttpServletRequest request)
  22. {
  23. //项目+请求地址
  24. String requestURI = request.getRequestURI();
  25. System.out.println(requestURI);
  26. //项目名称
  27. String contextPath = request.getContextPath();
  28. System.out.println(contextPath);
  29. //具体的请求
  30. String path=requestURI.substring(contextPath.length());
  31. System.out.println(path);
  32. String filename=path.substring(1,path.lastIndexOf(".")).trim();
  33. System.out.println(filename);
  34. return filename;
  35. }ActionMappingManager man=null;
  36. public void doPost(HttpServletRequest request, HttpServletResponse response)
  37. throws ServletException, IOException {
  38.  
  39. //由于index.jsp为默认请求界面,所以getname方法会获取到index.jsp正好与ActionMappingManager中map的key对应
  40. //获取到ActionMapping对象
  41. ActionMapping actionMapping = man.getActionMapping(getname(request));
  42. //获取action接口利用反射机制
  43. Action action = ActionManager.getActionClass(actionMapping.getClassname());
  44. try {
  45. //返回一个逻辑视图名
  46. String message = action.execute(request, response);
  47. String results = actionMapping.getResults(message);
  48. response.sendRedirect(results);
  49. } catch (Exception e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. }
  54. //获取请求的路径名 例:day01_0100/index.jsp 获取的是index.jsp
  55. public String getname(HttpServletRequest request)
  56. {
  57. //项目+请求地址
  58. String requestURI = request.getRequestURI();
  59. System.out.println(requestURI);
  60. //项目名称
  61. String contextPath = request.getContextPath();
  62. System.out.println(contextPath);
  63. //具体的请求
  64. String path=requestURI.substring(contextPath.length());
  65. System.out.println(path);
  66. String filename=path.substring(1,path.lastIndexOf(".")).trim();
  67. System.out.println(filename);
  68. return filename;
  69. }

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

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

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

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

  1. JSTL+EL表达式+JSP自定义框架案例

    不会框架不要紧,我带你自定义框架 前言:这标题说的有点大了,当一回标题党,之前在学JSP的时候提到了JSTL和EL表达式,由于一直钟情于Servlet,迟迟没有更新别的,这回算是跳出来了.这回放个大招 ...

  2. 我的自定义框架 || 基于Spring Boot || 第一步

    今天在园子里面看到一位大神写的springboot做的框架,感觉挺不错,遂想起来自己还没有一个属于自己的框架,决定先将大神做好的拿过来,然后加入自己觉得需要的模块,不断完善 目前直接复制粘贴过来的,后 ...

  3. day50 django第一天 自定义框架

    主要内容: 1.http协议 2.web框架 3.Django 1.http协议 1.1 http协议的简介 超文本传输协议(英文:Hyper Text Transfer Protocol,HTTP) ...

  4. 巨蟒python全栈开发django1:自定义框架

    今日大纲: 1.val和text方法的补充 2.信息收集卡用bootstrap实现 3.自定义web框架 4.http协议 5.自定义web框架2 今日内容详解: 1.val和text方法的补充 ht ...

  5. day050 django第一天 自定义框架

    1.简单的web框架 1. 创建一个简单的python文件: import socket sever=socket.socket() sever.bind(('127.0.0.1',8001)) se ...

  6. React+Webpack+ES6环境搭建(自定义框架)

    引言 目前React前端框架是今年最火的.而基于React的React Native也迅速发展.React有其独特的组件化功能与JSX的新语法,帮助前端设计有了更好的设计与便捷,而React Nati ...

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

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

  8. 03: 自定义异步非阻塞tornado框架

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...

  9. Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架

    目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPersistence_Test编写 1.3.1 XXXMapper.xml详解 1.3.2 ...

随机推荐

  1. EC笔记:第三部分:13、以对象管理资源

    C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...

  2. oracle 序列、视图、索引

    序列 创建 在sequences里 作用 生成自动增长(或减少)的整数值 经常添加数据时使用,可控性好 写法:序列名.nextval  获取下一个序列值 序列名.currval  获取当前序列值,不常 ...

  3. gif jpg bmp png的区别

    PNG格式图片因其高保真性.透明性及文件大小较小等特性,被广泛应用于网页设计.平面设计中.网络通讯中因受带宽制约,在保证图片清晰.逼真的前提下,网页中不可能大范围的使用文件较大的bmp.jpg格式文件 ...

  4. Quartz2D简介

    Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作:

  5. C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能

    先不说如何实现,先来看看效果图: 读取远程的需要提供下远程的计算用户名和密码即可. 如何实现这个代码功能,请看如下代码部分: 实体类: using System; using System.Colle ...

  6. Oracle报错,ORA-28001: 口令已经失效[转]

    Oracle11G创建用户时缺省密码过期限制是180天(即6个月), 如果超过180天用户密码未做修改则该用户无法登录. Oracle公司是为了数据库的安全性默认在11G中引入了这个默认功能,但是这个 ...

  7. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q144-Q146)

    Question  144 You are planning a feature upgrade for a SharePoint 2010 farm. The original feature wi ...

  8. Android自定义控件4--优酷菜单的菜单键及细节补充

    在上篇文章中实现了优酷菜单执行动画,本文接着完善已经实现的动画功能 本文地址:http://www.cnblogs.com/wuyudong/p/5915958.html ,转载请注明源地址. 已经实 ...

  9. Android 监听ScrollView的滑动

    我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 protected void onScrollChanged ...

  10. AFN3.0封装

    总结了一下AFN3.0封装,也借鉴了其他人总结的,整理如下,希望多交流,互相进步 // // XJYSessionManager.h// // Created by XJY on 16/10/17. ...