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

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

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

案例架构:

1.导入依赖jar包:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>01MyBatis</artifactId>
<groupId>cn.happy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>12CustomMVC</artifactId>
<packaging>war</packaging>
<name>12CustomMVC Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3</version>
<scope>test</scope>
</dependency> <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency> <!--ServletAPI-->
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
</project>

2..定义自己的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>

3.分层搭建

Action:

Action  自己定义的结果集和执行方法 :

 package cn.curry.action;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Created by Administrator on 2018/3/4.
*/
public interface Action {
//定义字符串常量
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
//准备一个方法,用于获取数据
public String execute(HttpServletRequest request, HttpServletResponse response)throws Exception;
}

定义一个ActionMapping用来存放Action节点

 package cn.curry.action;

 import java.util.HashMap;
import java.util.Map; /**
* Created by Administrator on 2018/3/4.
*/
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);
}
}

定义ActionManager  通过类名用反射机制获取对象

 package cn.curry.action;

 /**
* Created by Administrator on 2018/3/4.
*/
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;
}
}

ActionMappingManager  通过dom4j读取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 Administrator on 2018/3/4.
*/
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 主通过获取的请求找到Framework.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 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 Administrator on 2018/3/4.
*/
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);
} public void init(ServletConfig config) throws ServletException {
String fileName=config.getInitParameter("config");
String file[]=null;
if(fileName==null){
file=new String[]{"Framework.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>
</web-app>

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 name="pwd"/><br/>
<input type="submit" value="登陆"/>
</form>
</body>
</html>

success.jsp

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/3/4
Time: 19:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>success!!!</h1>
</body>
</html>

执行结果;

最新文章

  1. 学习笔记:利用GDI+生成简单的验证码图片
  2. Ant学习-002-ant 执行 TestNG 测试用例时 [testng] java.lang.NoClassDefFoundError: com/beust/jcommander/ParameterException 解决方案
  3. android studio配置AndroidAnnotations
  4. ARP:地址解析协议
  5. [反汇编练习] 160个CrackMe之005
  6. iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了
  7. 公有云开启全面竞争时代——青云QingCloud
  8. http://www.shengshiyouxi.com
  9. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
  10. C#扩展方法类库StringExtensions
  11. Spring揭秘 读书笔记 三 bean的scope与FactoryBean
  12. 小程序顶部navbar(非Slider)
  13. ASP.NET Core 快速入门(环境篇)
  14. CG-CTF simple-machine
  15. 稍稍解读下ThreadPoolExecutor
  16. 一、I/O操作(中文问题)
  17. 玩linux就是不断的踩坑,踩坑。最近的坑。xpath firefox兼容问题,抓取表格。
  18. MySQL安装配置错误\日常使用错误
  19. Linux:TCP状态/半关闭/2MSL/端口复用
  20. 基于java NIO 的服务端与客户端代码

热门文章

  1. Springboot 5.Springboot 返回cookies信息的post接口开发
  2. es6常用的
  3. .pyc是个什么 python的执行过程
  4. 模型评估【PR|ROC|AUC】
  5. Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?
  6. 老男孩Python全栈学习 S9 日常作业 001
  7. 利用 /proc/sys/kernel/core_pattern隐藏系统后门
  8. LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001
  9. 设置redis服务开机自启动
  10. JS 正则中的命名捕获分组