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>

执行结果;

自定义MVC实现登录案例的更多相关文章

  1. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  2. C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)

    C# MVC 用户登录状态判断   来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...

  3. 自定义MVC框架

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

  4. Struts2 自定义MVC框架

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

  5. 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)

    新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...

  6. 第一章 自定义MVC框架

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

  7. C#学习笔记(35)——事件做的登录案例

    说明(2018-4-9 20:11:42): 1. 先自定义了一个登录控件,可以输入账号.密码,点击登录.然后在Form1里面拖入这个控件,要求输入账号密码正确时,点击登录,控件显示绿色,否则显示红色 ...

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

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

  9. struts2自定义MVC框架

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

随机推荐

  1. 数据库导出excel,前后端分离

    主要参考了这篇博文:https://www.cnblogs.com/jerehedu/p/4343509.html  2.3和2.4 采用xssf,依赖:compile group: 'org.apa ...

  2. busybox(三)最小根文件系统

    目录 busybox(三)最小根文件系统 引入 构建终端 构造inittab 配置应用程序 构建C库 制作映像文件yaffs title: busybox(三)最小根文件系统 tag: arm dat ...

  3. solr的搜索

    主要讲一下solr面板的使用: 查询 q:     查询用  语法: name:刘中华      支持通配符 ? 表示单个任意字符的通配 * 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号 ...

  4. windows下搭建vue开发环境+IIS部署

    原创]win10下搭建vue开发环境  https://www.cnblogs.com/ixxonline/p/6007885.html 特别说明:下面任何命令都是在windows的命令行工具下进行输 ...

  5. 《JavaScript.DOM》读书笔记

  6. SpringBoot系列: SpringBoot Web项目中使用Shiro

    注意点有:1. 不要启用 spring-boot-devtools, 如果启用 devtools 后, 不管是热启动还是手工重启, devtools总是试图重新恢复之前的session数据, 很有可能 ...

  7. 基于STM32F1的局域网通信模块W5500驱动

    目录 说明 W5500 W5500.c 使用方法 说明 需要调整的内容为W5500.h中关于IP地址.端口号.子网掩码.网关等参数 W5500 #ifndef _W5500_H_ #define _W ...

  8. mysql 原理 ~ 并行复制

    一 概念1 MTS(Prepared transactions slave parallel applier)   主库在同一时间进入prepare状态的事务可以被从库并行回放2 传统与改进   ma ...

  9. python模块 - pywinauto(windows自动化安装软件)

    GUI 窗口查询工具 spy++lite pywinauto 模块 原理: https://www.cnblogs.com/testlife007/p/4710599.html pywhinayto ...

  10. 函数的if--while流程控制

    一.流程控制---if 1.if条件判断 age=18 hight=1.70 sex="female" is_beautiful=True if sex=="female ...