readbook:自己设计mvc框架,java类似struts2的实现
如果你不能简单说清楚,就是你还没有完全明白。——爱因斯坦
need things:
1.操作xml文档 dom4j 等开源类库
2. dtd的验证 等知识储备
* n到n次 ? 0到1次 + 1到n次
3. java 反射的相关知识
反射过程:
导入 java.lang.reflect.*
1.获得需要操作的类的 Java.lang.Class对象
2.调用Class的方法获取Field, Method等对象
使用 反射api 进行操作
反射的常用类
Class 类 : 反射的核心类,反射的所有操作都是围绕该类来生成的,通过它,可以获取类的属性,方法等信息
Field 类 : 类的属性, 可以获取和设置类中属性信息
Method 类: 类的方法,可以获取类中方法的信息,或者执行方法
Constructor类: 类的构造方法
1.
通过Class类的forName()静态方法也可以获取该类对应的Class对象,它会要求虚拟机查找并加载指定的类
Class cla = Class.forName("java.lang.String"); 如果字符串有问题,会抛出ClassNotFoundException异常
2.从Class 对象获取信息
创建对象
使用Class对象的newInstance()方法创建对象
notice:实际上利用了它的无参构造方法来创建了该类的实例, 所以要求该Class对象的对应类有相应的无参构造方法
正文:构建开始
构建基于mvc模式的框架
实现方案1
所有请求发到一个统一的controller (用filter api 实现拦截请求) 这样控制器负责接收请求 ,(根据请求的路径指定由哪个action 来执行处理
然后定义Action接口,用来进行请求的处理, 比如登录action, 注册action 等
action 调用model,进行model的操作并返回相应的view
//controller类的定义
public class ActionFilter implements Filter{
private FilterConfig config;
public voic destroy(){ } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException,ServletException { //类型转换
HttpServletRequest hsr = (HttpServletRequest) request;
HttpServeltResponse hsp = (HttpServletResponse) response; //获得action
Action action = this.getAction(hsr); //调用action的excute 方法
String resultView = null;
try{
resultView = action.execute(hsr,hsp);
}
catch(Exception e){
e.printStackTrace();
} //页面跳转
if(null != resultView) {
request.getRequestDispatcher(resultView).forward(request, response);
}
} public void init(FilterConfig conf) throws ServletException {
this.config = config;
}
public Action getAction(HttpServletRequest request) { String uri = request.getRequestURI(); //获取请求的url String contextPath = request.getContextPath(); //获取上下文路径 String actionPath = uri.substring(contextPath.length()); //截取上下文路径以后的部分 String actionName = actionPath.substring(1,actionPath.lastIndexOf('.')).trim(); Action action = null; // 以后每个定义的Action在这里添加一项用于实例化一个需要的action 类的对象
if("login".equals(actionName)) {
action = new LoginAction();
} return action; }
}
action接口的定义
主要 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
....
基于Filter 的ActionFilter类的调用执行需要在web.xml中配置
<filter>
<filter-name>requestFilter</filter-name>
<filter-class>com.xx.xx.mystruts.framework.ActionFilter</filter-class>
</filter> <filter-mapping>
<filter-name>requestFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
以上就是一个mvc框架大致思路的主体实现,很明显还有很多遗漏的细节需要完善,但主体是这样.
很明显有改进的地方,比如
用前面xml的知识 读取配置文件 把一个一个的action的注入通过xml注入
这样就不用每新增一个action 就得重新加一行if 判断处理需要的action类了
改为让控制器初始化的时候读xml
xml里抽出来定义的这些信息包括 action的name,匹配的url,调用的class文件,作为结果的视图的路径
这里用一个java Bean来生成xml读取后 对应的对象数据模型, 以在运行时读取需要的信息
再写一个manager用来管理这个action
与此同时controller也需要升级,让web容器启动的时候加载controller,并读取我们写的保存action信息的xml,
因此需要在filter的配置里加上初始化参数,来实现这一功能本身
修改web.xml 之前的配置为类似下面这种:
<filter>
<filter-name>requestFilter</filter-name>
<filter-class>com.xx.mystruts.ActionFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>mystruts.xml</param-value>
</init-param>
</filter>
然后是actionFilter 类代码实现的修改, 实现读取配置文件
这时主要用到的几个东西,和它们分别负责的内容为 (关于action mapping的映射可以方便的使用HashMap来进行相应的get,put)
mystruts.xml 配置文件,里面定义每个Action的name result
ActionMapping 用来保存从xml中读取的Action的信息
ActionFilter 作为controller 拦截请求,初始化应用,分配action
ActionMappingManager ActionMapping的管理器 它被调用初始化时,遍历xml节点,
根据节点建立ActionMapping ,同时封装一些对ActionMapping的操作,如根据ActionNameget到相应的ActionMapping对象等
ActionManager 使用反射技术生成具体的 Action实例
注意:
以上配置的时候关于请求访问的时候触发action,
1.可以通过直接访问 localhost:xxx/xx.action
2.可以通过jsp的页面转发来调用,这时地址就可以不必是 xx.action结尾了,而是相应的jsp页面地址
jsp页面里写
<body>
<jsp:forward page="/index.action"></jsp:forward>
</body>
此时web.xml中的filter-mapping做如下修改:
<filter-mapping>
<filter-name>requestFilter</filter-name>
<url-pattern>*.action</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
readbook:自己设计mvc框架,java类似struts2的实现的更多相关文章
- 自己实现的简单MVC框架(类似Struts2+Spring)
一.框架简介 本框架是一个类似于Struts2+Spring的框架,目的在于个人钻研和技术分享,将流行技术框架Struts2.Spring中使用到的主要技术以较为简化的方式实现出来,给大家一个更直观的 ...
- IDEA创建一个Spring MVC 框架Java Web项目,Gradle构建
注:此篇有些细节没写出,此文主要写重要的环节和需要注意的地方,轻喷 新建项目 选择Gradle , 勾选java 和 web.之后就是设定项目路径和名称,这里就不啰嗦了. build.gradle文件 ...
- 设计 REST 风格的 MVC 框架
http://www.ibm.com/developerworks/cn/java/j-lo-restmvc/ 传统的 JavaEE MVC 框架如 Struts 等都是基于 Action 设计的后缀 ...
- Java之struts2框架学习
Java之struts2框架学习 About Struts2 Struts也是一款MVC框架 , Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全 ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
- 从零开始学 Java - 搭建 Spring MVC 框架
没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...
- 【原创】三分钟教你学会MVC框架——基于java web开发(1)
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法. ...
- [Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用
转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之 ...
- struts2.1笔记01:MVC框架思想浅层理解
1. Struts 1是全世界第一个发布的MVC框架: 它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,S ...
随机推荐
- PHP常用的自定义函数
PHP常用的自定义函数 目录 php常用自定义函数类下载 php 设置字符编码为utf-8 路径格式化(替换双斜线为单斜线) 转码 打印输出 api返回信息 字符串截取 方法一: 方法二: 数组 字符 ...
- CI 框架源码解析一之入口文件 index.php
Index.php作为CI框架的入口文件,源码分析,自然而然由此开始.在源码分析的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现,如果英文水平很好的话,读过index.php文件的英文注释之 ...
- php-安装与配置-未完待续2
一,准备工作 在入门指引中,我们已经知道PHP的3个应用领域,不同的场景,需要安装的东西是不同的.具体如下: 服务器端脚本,在通常情况下,需要三样东西:PHP 自身.一个 web 服务器和一个 web ...
- linuxC编程介绍
第一步:写完程序 /first.c/ #include <stdio.h> int main() { printf("hello,welcome to the LinuxC!\n ...
- A Country on Wheels【车轮上的国家】
A Country on Wheels As cultural symbols go, the American car is quite young. 作为文化象征的美国汽车还相当年轻. The ...
- python-10多进程
1-多进程(multiprocessing), 1个父进程可以有多少子进程 1.1下面的例子演示了启动一个子进程并等待其结束 from multiprocessing import Process i ...
- python基础之多态与多态性、绑定方法和非绑定方法
多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...
- 6 Django的视图层
视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . ...
- 安测云验证有CTA问题
背景: 现在所有的app 都需要通过工信部的审核.用户不同意之前,不能联网. 那么,我怎么知道自己的应用有没有联网呢?那么多sdk ,那么多代码?我怎么测试呢? 哈哈,我们测试给的方法真的很管用. l ...
- RandomAecessFile open failed: EISDIR (Is a directory)
今天下午搞断点续传,下载文件的时候,弄了一下,我把下载的文件命名为plug.jar.后来老是报错: open failed: EISDIR (Is a directory) 我烦了,两个小时啊,我操. ...