---恢复内容开始---

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

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

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

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

我们先看一下整体架构

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

下面是两个节点

<!--dom4j-->
<dependency>
<groupId>org.jvnet.hudson.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1-hudson-3</version>
</dependency>
<!--javaee-->
<dependency>
<groupId>javax.javaee</groupId>
<artifactId>javaee</artifactId>
<version>6.0-alpha-1</version>
<classifier>sources</classifier>
</dependency>

  我们要定义自己的配置文件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方法,我们最后看实现,现在先不多说。

package cn.curry.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Created by Curry on 2017/3/15.
*/
public interface Action {
public static final String SUCCESS="success";
public static final String LOGIN="login";
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

 然后我们定义一个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 Curry 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 Curry 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 Curry 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的相关问题也可以一起讨论。

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

  1. 自定义MVC框架

    我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...

  2. Struts2 自定义MVC框架

    一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...

  3. 第一章 自定义MVC框架

    第一章  自定义MVC框架1.1 MVC模式设计    组成:Model:模型,用于数据和业务的处理          View :视图,用于数据的显示          Controller:控制器 ...

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

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

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

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

  6. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

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

    转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...

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

    springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中 ...

  9. struts2自定义MVC框架

    自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...

随机推荐

  1. Bootstrap相关的网站

    http://www.bootcss.com/ http://expo.bootcss.com/ http://www.webresourcesdepot.com/20-beautiful-resou ...

  2. chrome与pdf的事情

    chrome如果安装了chrome PDF viewer插件,可以直接开发pdf文档: 如果把chrome PDF viewer插件禁用了就不能打开了: 输入:chrome://plugins进行所有 ...

  3. Java中的封装、继承、多态

    封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...

  4. HDU1166(分块)

    敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  5. 照片提取GPS 转成百度地图坐标

    感谢: 小慧only http://www.cnblogs.com/zhaohuionly/p/3142623.html  GPS转化坐标方法 大胡子青松 http://www.cnblogs.com ...

  6. iOS-直播开发(开发从底层做起)

    一直在忙, 也没写过几次播客! 但一直热衷于直播开发技术, 公司又不是直播方向的, 所以就年前忙里偷袭研究了一下直播开发, 然后翻阅了很多大神的技术博客等, 写了一个简单的Demo, 又根据网上大神们 ...

  7. MySQL的my-innodb-heavy-4G.ini配置文件的翻译

    我根据MySQL配置文件的英文文档说明,在根据自己所学的知识,使用有道词典对不懂的单词进行了查询,一个一个翻译出来的.有的专业术语翻译的不好,我使用了英文进行标注,例如主机(master)和副机(sl ...

  8. 内功心法 -- Java标记接口

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------这篇博客主要来谈谈" ...

  9. Python自然语言处理学习笔记之信息提取步骤&分块(chunking)

    一.信息提取模型 信息提取的步骤共分为五步,原始数据为未经处理的字符串, 第一步:分句,用nltk.sent_tokenize(text)实现,得到一个list of strings 第二步:分词,[ ...

  10. bootstrap 响应式工具

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...