你的位置:首页 > Java教程

[Java教程]readbook:自己设计mvc框架,java类似struts2的实现


如果你不能简单说清楚,就是你还没有完全明白。——爱因斯坦

 need things:
 1.操作 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;  }}

View Code


action接口的定义
主要 import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;

....

基于Filter 的ActionFilter类的调用执行需要在web.

<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框架大致思路的主体实现,很明显还有很多遗漏的细节需要完善,但主体是这样.

很明显有改进的地方,比如
用前面这样就不用每新增一个action 就得重新加一行if 判断处理需要的action类了
改为让控制器初始化的时候读
这里用一个java Bean来生成再写一个manager用来管理这个action


与此同时controller也需要升级,让web容器启动的时候加载controller,并读取我们写的保存action信息的因此需要在filter的配置里加上初始化参数,来实现这一功能本身
修改web.

<filter>  <filter-name>requestFilter</filter-name>  <filter-class>com.xx.mystruts.ActionFilter</filter-class>  <init-param>    <param-name>config</param-name>    <param-value>mystruts.

然后是actionFilter 类代码实现的修改, 实现读取配置文件

这时主要用到的几个东西,和它们分别负责的内容为  (关于action mapping的映射可以方便的使用HashMap来进行相应的get,put)

mystruts.

注意:
以上配置的时候关于请求访问的时候触发action,
1.可以通过直接访问 localhost:xxx/xx.action
2.可以通过jsp的页面转发来调用,这时地址就可以不必是 xx.action结尾了,而是相应的jsp页面地址
jsp页面里写

<body>  <jsp:forward page="/index.action"></jsp:forward></body>

此时web.

<filter-mapping>  <filter-name>requestFilter</filter-name>  <url-pattern>*.action</url-pattern>  <dispatcher>REQUEST</dispatcher>  <dispatcher>FORWARD</dispatcher></filter-mapping>