使用Intellij Idea自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架!

MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

我们今天自己定义的MVC框架是简单模仿struts2的

然后我们会用到两个常用的技能点,一个是使用dom4j解析xml文件,还有一个是java反射机制。

我们先看一下整体架构

我们用的是intellij idea这个工具。我们会创建一个maven项目,然后在pom文件导入我们需要的两个jar包,一个是dom4j的,一个是javaee的

下面是两个节点:

 我们要定义自己的配置文件frame.xml.

我们要定义自己的dtd文件约束和配置信息:

<?xml version=‘1.0‘ encoding=‘UTF-8‘?>
<!DOCTYPE myframe[
        <!ELEMENT myframe (actions)>
        <!ELEMENT actions (action*)>
        <!ELEMENT action (result*)>
        <!ATTLIST action
                name CDATA #REQUIRED
                class CDATA #REQUIRED>
        <!ELEMENT result (#PCDATA)>
        <!ATTLIST result
                name CDATA #IMPLIED
                redirect (true|false) "false">
        ]>
<myframe>
    <actions>
        <action name="login" class="cn.curry.action.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="login">login.jsp</result>
        </action>
    </actions>
</myframe>

然后建好包开始创建我们需要的类和接口。

首先我们定义自己的Action接口,在这个接口里我们简单定义了两个字符串常量,还有一个抽象的execute方法,我们最后看实现,现在先不多说。

然后我们定义一个ActionManager管理类,我们通过类名用反射机制获取对象。

package cn.curry.action;

/**
 * Created by Curry on 2017/3/15.
 */
public class ActionManager {
    public static Action getActionClass(String className) throws Exception{
        Class clazz=null;
        Action action=null;
        clazz=Thread.currentThread().getContextClassLoader().loadClass(className);
        if (clazz==null){
            clazz=Class.forName(className);
        }
        if (action==null){
            action=(Action) clazz.newInstance();
        }
        return action;
    }
}然后我们再定义一个ActionMapping类,这个类定义了几个属性,类似于实体类的作用。
package cn.curry.action;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by zl on 2017/3/15.
 */
public class ActionMapping {
    private String name;
    private String className;
    private Map<String,String> map=new HashMap<String, String>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getValue(String key) {
        return map.get(key);
    }

    public void addToMap(String key,String value) {
        map.put(key,value);
    }
}然后我们要做解析XML的类,我们的类ActionMappingManager ,我们通过读取用jdom4j读取xml,然后把数据添加到集合中。
package cn.curry.action;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by zl on 2017/3/15.
 */
public class ActionMappingManager {
    private Map<String,ActionMapping> map=new HashMap<String, ActionMapping>();

    public  ActionMapping getValue(String key) {
        return map.get(key);
    }

    public void addToMaps(String key,ActionMapping value) {
        map.put(key,value);
    }

    public ActionMappingManager(String [] files)throws Exception{
        for (String item:files){
            init(item);
        }
    }
    public void init(String path)throws Exception{
        InputStream is=this.getClass().getResourceAsStream("/"+path);
        Document doc=new SAXReader().read(is);
        Element root=doc.getRootElement();
        Element actions=(Element)root.elements("actions").iterator().next();
        for (Iterator<Element> action=actions.elementIterator("action");action.hasNext();){
            Element actionnext=action.next();
            ActionMapping am=new ActionMapping();
            am.setName(actionnext.attributeValue("name"));
            am.setClassName(actionnext.attributeValue("class"));
            for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){
                Element resultnext=result.next();
                String name=resultnext.attributeValue("name");
                String value=resultnext.getText();
                if (name==null||"".equals(name)){
                    name="success";
                }
                am.addToMap(name,value);
            }
            map.put(am.getName(),am);
        }
    }
}接下来我们要定义一个servlet来获取请求,LoginServlet.主要通过获取的请求来找到frame.xml.
package cn.curry.servlet;

import cn.curry.action.Action;
import cn.curry.action.ActionManager;
import cn.curry.action.ActionMapping;
import cn.curry.action.ActionMappingManager;
import org.omg.PortableInterceptor.ACTIVE;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by zl on 2017/3/15.
 */
public class LoginServlet extends HttpServlet {
    private ActionMappingManager manager=null;
    private String getClassName(HttpServletRequest request){
        String uri=request.getRequestURI();
        System.out.println(uri+"        uri");
        String context=request.getContextPath();
        System.out.println(context+"             context");
        String result=uri.substring(context.length());
        System.out.println(result+"              result");
        return result.substring(1,result.lastIndexOf("."));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String key=getClassName(request);
        System.out.println(key+"           key");
        try {
            ActionMapping actionMapping=manager.getValue(key);
            System.out.println(actionMapping.getClassName()+"            classname");
            Action action= ActionManager.getActionClass(actionMapping.getClassName());
            String result=action.execute(request,response);
            System.out.println(result+"                   result");
            String path=actionMapping.getValue(result);
            System.out.println(path+"                path");
            request.getRequestDispatcher(path).forward(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        String fileName=config.getInitParameter("config");
        String file[]=null;
        if(fileName==null){
            file=new String[]{"myframe.xml"};
        }else {
            fileName.split(",");
        }
        try {
            manager=new ActionMappingManager(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}最后我们配置一下web.xml,然后就书写页面:
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>cn.curry.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

书写页面,我们准备了两个页面,一个login.jsp。一个success.jsp。

首先看login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="login.action" method="post">
    <input name="name"><br>
    <input type="submit" value="登陆"/>
</form>
</body>
</html>然后看success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h2>登录成功</h2>
</body>
</html>

最后我们看一下运行效果

大家想要更好的理解,需要自己调试看一下每一步怎么走的。

还有就是使用intellij idea遇到各种问题如果,大家有使用idea的相关问题也可以一起讨论。

时间: 2024-10-03 23:10:05

使用Intellij Idea自定义MVC框架的相关文章

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前

Struts2 自定义MVC框架

一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发 二.MVC设计模式: 由3个部分组成,各部分作用如下: Model:模型,主要用于数据和业务的处理 View:视图,用于数据的显示 Controller:控制器,用于进行流程控制 MVC设计模式的特点: ①一个模型可以对应多个视图 ②显示与逻辑控

自定义MVC框架之工具类-图像处理类

截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( 支持任意位置与九宫格位置 ) 2,图片缩放处理( 等比缩放,不变形裁剪 ) 1 <?php 2 3 class Image{ 4 //文件路径 5 protected $path; 6 //是否允许随机文件名称 7 protected $enableRandName; 8 //文件类型 9 pro

自定义MVC框架之工具类-模型类

截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理类 这个模型类支持以下功能: >连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等 如 $db->table( 'user' )->where( 'id=1' )->select() 等

ideat使用struts2之自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

简单封装自定义MVC框架

自定义Mvc框架结构及其使用方法 一,什么是MVC框架 MVC框架全名是model(模型)controller(控制器)view(视图文件)所构成的一种开发框架,是一种典型的软件设计典范,用一种业务逻辑,数据,显示相分离的方法组织代码,其好处是将业务逻辑聚集到一个部件里面,在改进和指定个性化页面的同时不需要重新编写业务逻辑,MVC被独特的发展起来用于映射传统的输入,处理,显示在一个业务逻辑的图形化业务界面中. 二,组成 ①,model(模型):主要负责具体功能的实现,一个模型对应一种功能 ②,v

自定义MVC框架

一.实现自定义MVC的体系结构图 1.Model I模式开发Web应用时,分两种情况: *纯JSP技术方式开发 *JSP+JavaBean方式开发 2.Model I模式开发的不足: *JSP页面中嵌入大量的Java代码,可读性差. *大量代码在JSP中难以复用. *后期维护及扩展的难度大. 3.为了克服Model I模式的缺陷,引入了Model II的模式开发 *Model II模式体现了基于MVC(Model-View-Controller,模型-视图-控制器)的设计模式,简单的说,Mode

springmvc执行原理及自定义mvc框架

springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中央调度器调用处理器映射器handerMapping,处理器映射器根据请求的url找到处理该请求对应的处理器hander及相关的拦截器intercepter,将它们封装成一个处理器执行链并返回给中央调度器 (3)中央调度器根据处理器执行链中的处理器找到对应的处理器适配器handerAdaptor (4

struts2自定义MVC框架

自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发. 总结MVC特点如下: (1)数据的获取和显示分离     (2)控制器将不同的模型和视图组合在一起     (3)应用分为三部分,三部分之间松耦合并协同工作,从而提高应用的可扩展性和可维护