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

当我们实现登录功能的时候,首先会创建一个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. 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笔记,第二部分:8.别让异常逃离析构函数

    1.为何析构函数不应该抛出异常?    有两种情况:    1).假设析构函数中有众多语句,而第一条语句抛出异常(或者其他语句),那么抛出异常以后的语句就得不到执行.而通常我们在析构函数中写的是清理资 ...

  2. nodejs:连接数据库SqlServer,mssql模块

    现在的数据库越来越多,如mgdb,我比较常用的是mysql,但有一天做项目需要连接SqlServer,就去找了个方法.找了很多无非就mssql模块和node-sqlserver模块,但node-sql ...

  3. spring入门(四)【面向切面编程】

    开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...

  4. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  5. CSS3 float深入理解浮动资料整理

    CSS浮动(float,clear)通俗讲解 CSS 浮动 CSS float浮动的深入研究.详解及拓展(一) CSS float浮动的深入研究.详解及拓展(二) 1.浮动实现图文环绕(理解难点) 浮 ...

  6. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  7. GIS公交查询-flex/java

    开发语言是flex.java,开发平台是myeclise.eclise,开发接口是arcgis api for flex,提供以下的功能: 1.站名-站名查询: 2.站点查询: 3.路线查询: 备注: ...

  8. 如何正确响应ArcGIS JavaScript API中图形的鼠标事件

    在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...

  9. iOS通知中心升级 -可设置按优先级执行block

    简单介绍下,这是需求驱动中发现iOS的NotificationCenter有很多功能无法实现,于是对其进行了一层包装.相当于手动管理观察者栈和监听者期望执行的事件,因此可以为其添加了很多新增的功能,将 ...

  10. Linux0.11内核--内存管理之2.配合fork

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5598451.html ] 在上一篇的fork函数中,首先一上来就调用get_free_page ...