使用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的
下面是两个节点
<!--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框架的更多相关文章
- 自定义MVC框架
我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...
- Struts2 自定义MVC框架
一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...
- 第一章 自定义MVC框架
第一章 自定义MVC框架1.1 MVC模式设计 组成:Model:模型,用于数据和业务的处理 View :视图,用于数据的显示 Controller:控制器 ...
- 自定义MVC框架之工具类-模型类
截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...
- 自定义MVC框架之工具类-图像处理类
截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...
- 自定义MVC框架之工具类-文件上传类
截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...
- Java Web自定义MVC框架详解 (转)
转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...
- springmvc执行原理及自定义mvc框架
springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中 ...
- struts2自定义MVC框架
自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...
随机推荐
- VS2013使用WebDeploy发布网站到IIS服务器
VS2013用Web Deploy方式发布网站到IIS服务器发布文档 VS版本:VS2013 服务器版本:Windows Server 2012 R2 IIS版本:IIS8.0 Web Deploy版 ...
- Qt Quick编程(1)——QML的核心部分ECMAScript
说道QML,不得不先说一下ECMAScript: ECMAScript语言的标准是由Netscape.Sun.微软.Borland等公司基于JavaScript和JScript锤炼.定义出来的. EC ...
- node源码详解(二 )—— 运行机制 、整体流程
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource2 本博客同步在https://cnodejs.o ...
- 一个案例深入Python中的__new__和__init__
准备 在Python中,一切皆对象. 既然一切皆对象,那么类也是对象,我们暂且称之为 类对象.来个简单例子(本篇文章的所有案例都是运行在Python3.4中): class foo(): pass p ...
- 使用 visualstudio code 编辑器调试执行在 homestead 环境中的 laravel 程序
由于之前做 .net 开发比较熟悉 visualstudio,所以自 visualstudio code 发布后就一直在不同场合使用 vscode ,比如前端.node等等.最近在做 laravel ...
- WebForm 全局对象、commend
Repeater的增删改 内置对象:页面之间的数据交互为什么要用这些玩意? HTTP的无状态性 Response:响应请求 Request:获取请求 Cookies:保存登录状态----------- ...
- Modelbuilder进阶教程
Modelbuilder进阶教程 By 李远祥 Modelbuilder 进阶1 自定义变量 参数是用来交互操作的,因此,参数具备非常大的灵活性,包括参数的定义和调用. 除了工具里面的参数之外,还可以 ...
- CSS3知识点整理(四)----布局样式及其他
包括CSS3多列布局样式.Flexbox伸缩布局.盒子模型等.重点介绍了Flexbox伸缩布局的各种属性用法. 一.多列布局 为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给 ...
- MVC - 云服务器部署
本章将和大家分享的是如果在云服务器上部署mvc,云服务器部署其实也不高大上,就和咋们在自己电脑上用iis发布部署站点一样,只是需要使用云解析把自己购买的域名解析到对应的自己的云服务器上,这些都是用的云 ...
- 基于Spring DM管理的Bundle获取Spring上下文对象及指定Bean对象
在讲述服务注册与引用的随笔中,有提到context.getServiceReferences()方法,通过该方法可以获取到OSGI框架容器中的指定类型的服务引用,从而获取到对应的服务对象.同时该方法还 ...