• 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;
    
        }
    }
    View Code


    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>
  • 相关阅读:
    idea的tomcat消失
    数据表南车
    ElementU日历Demo
    ElementUI表格行编辑单元格编辑支持(输入框,选择框)Demo
    expect ':' at 0, actual = (JSON转化异常解决)
    java获取日历格式的日期数据
    java判断某个日期在两个日期之间(区间) (包含或不包含两个日期)
    localDate和Date的转化
    ImmutableMap的put方法问题
    invalid comparison: java.time.LocalDate and java.lang.String
  • 原文地址:https://www.cnblogs.com/isdom/p/webclips021.html
Copyright © 2020-2023  润新知