MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(1)

简介: MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)

前言:

刚刚学完了MVC,根据自己的感悟和理解写了一个小项目。

完全按照MVC模式,后面有一个MVC的理解示意图。

用MVC模式重新完成了联系人的管理系统:

用户需求:
多用户系统,提供用户注册、登录功能,对于没有登录的用户,不允许使用任何功能。
可以查询、增加和删除联系人信息。
详细设计:
数据结构设计。
功能模块设计。
工具类设计。
搭建初步的项目框架、其他功能:防止用户重复提交、注册和登录时使用验证码。

项目代码在后面、

演示效果:

主页:

image.png

注册页面:

image.png

MVC介绍:

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

Struts、ZF、.NET、Spring MVC、Tapestry、JSF等常用流行框架,都是MVC框架模式、

框架和设计模式的区别

有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式。实际上它们完全是不同的概念。[7]  

框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。

框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。

框架模式有哪些?

MVC、MTV、MVP、CBD、ORM等等;

Java语言的框架有哪些?

SSH 、SSI,等等

设计模式有哪些?

工厂模式、适配器模式、策略模式等等

简而言之:框架是大智慧,用来对软件设计进行分工;设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。

图示介绍一下MVC

前面的第一个部分就是MVC框架模式

image.png

实例演示:

因为代码量比较大,只写部分代码:

全部代码:

所有的代码我已push至github,链接:

https://github.com/chenhaoxiang/Web/tree/master/myMvcWeb

可以看看我的构架:

前台jsp–>servlet–>service–>dao–>数据库(这里用xml简单当做数据库)

image.png

image.png

Dom4jDocument.java:

package cn.hncu.utils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import cn.hncu.domain.Contact;
import cn.hncu.domain.User;
public class Dom4jDocument {
    private static Document dom=null;
    private static String path;
    //静态块!只会在类加载的时候运行一次
    static{
        try {
            SAXReader sax = new SAXReader();
            //因为我们的资源已经从myelipse中发布到tomcat服务器中了,所以跟原来的纯Java项目不一样了。
            //利用当前类找到它的类加载器,然后通过该类加载器再去获得资源路径
            path = Dom4jDocument.class.getClassLoader().getResource("users.xml").getPath();
             //getClassLoader()返回:加载此对象所表示的类或接口的类加载器
            //public URL getResource(String name)返回:读取资源的 URL 对象;如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null。
            //此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。
            //public String getPath()获取此 URL 的路径部分。 
            dom = sax.read(new FileInputStream(path));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 保存到服务器-本地
     * @return 布尔型
     */
    public static boolean save(){
        try {
            XMLWriter w = new XMLWriter(new FileOutputStream(path));
            w.write(dom);
            w.close();
        }catch (UnsupportedEncodingException e) {
            return false;
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            return false;
        }
        return true;
    }
    /**
     * @param uuid - 通过联系人的uuid-删除联系人
     * @return
     */
    public static boolean del(String uuid){
        Node node = dom.selectSingleNode("//contacts[@uuid=\""+uuid+"\"]");
        if(node==null){
            return false;
        }
        node.getParent().remove(node);
        save();
        return true;
    }
    /**
     * 添加联系人
     * @param uuid--通过user的uuid
     * @return
     */
    public static boolean addContact(String userUuid,Contact contacts){
        Element userNode = (Element)dom.selectSingleNode("//user[@uuid=\""+userUuid+"\"]");
        if(userNode==null){
            return false;
        }
        Element contactE =  userNode.addElement("contacts");
        contactE.addAttribute("uuid", contacts.getUuid());
        contactE.addAttribute("name", contacts.getName());
        contactE.addAttribute("age", ""+contacts.getAge());
        contactE.addAttribute("tel", contacts.getTel());
        save();
        return true;
    }
    /**
     * 添加用户
     * @param user
     * @return
     */
    public static boolean addUser(User user){
        //先防范重复name的
        if(dom.selectSingleNode("//user[@name=\""+user.getName()+"\"]")!=null){
            return false;
        }
        try {
            Element root = dom.getRootElement();
            Element u = root.addElement("user");
            u.addAttribute("uuid", user.getUuid());
            u.addAttribute("name", user.getName());
            u.addAttribute("pwd", user.getPwd());
            save();
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    /**
     * 用户登录时,返回封装的user或false
     * @param user
     * @return
     */
    public static User login(User user){
        Element userE = (Element)dom.selectSingleNode("//user[@name=\""+user.getName()+"\"]");
        if(userE==null){
            return null;
        }
        user.setUuid(userE.attributeValue("uuid"));
        return user;
    }
    public static List<Contact> getUserContacts(String userUuid){
        List<Contact> contacts = new ArrayList<Contact>();
        Element user = (Element) dom.selectSingleNode("//user[@uuid=\""+userUuid+"\"]");
        List<Element> lists =  user.elements();
        for(Element list:lists){
            Contact c = new Contact();
            c.setName(list.attributeValue("name"));
            c.setAge(Integer.parseInt(list.attributeValue("age")));
            c.setTel(list.attributeValue("tel"));
            c.setUuid(list.attributeValue("uuid"));
            contacts.add(c);
        }
        return contacts;
    }
    public static List<Contact> getQueryContacts(Contact contact,String userUuid){
        List<Contact> contacts = new ArrayList<Contact>();
        Element user = (Element) dom.selectSingleNode("//user[@uuid=\""+userUuid+"\"]");
        if(user==null){
            return null;
        }
        String name = contact.getName().trim();
        Integer age = contact.getAge();
        String tel = contact.getTel().trim();
//      System.out.println("name="+name);
//      System.out.println("age="+age);
//      System.out.println("tel="+tel);
        List<Element> lists =  user.elements();
        for(Element c : lists){
            //System.out.println("c=="+c);
            if(name.equals("")||c.attributeValue("name").indexOf(name)!=-1){
                if(age==-1||c.attributeValue("age").indexOf(age+"")!=-1){
                    if(tel.equals("")||c.attributeValue("tel").indexOf(tel)!=-1){
                        Contact cc = new Contact();
                        cc.setName(c.attributeValue("name"));
                        cc.setAge(Integer.parseInt(c.attributeValue("age")));
                        cc.setTel(c.attributeValue("tel"));
                        cc.setUuid(c.attributeValue("uuid"));
                        contacts.add(cc);
                    }
                }
            }
        }
        return contacts;
    }
}
目录
相关文章
|
7月前
|
JSON 前端开发 JavaScript
|
28天前
|
编解码 JavaScript 前端开发
在跨平台虚拟 DOM 框架中处理动画效果
【10月更文挑战第25天】在跨平台虚拟 DOM 框架中处理动画效果需要综合运用多种技术和方法,充分考虑不同平台的特点和性能要求,通过合理的设计和优化,实现高效、流畅且具有良好兼容性的动画效果,从而为用户提供更加丰富和生动的交互体验。
103 63
|
28天前
|
JavaScript 前端开发 算法
框架为什么要设计虚拟 dom?
【10月更文挑战第26天】框架设计虚拟 DOM 是为了在性能优化、开发效率提升、可维护性增强以及跨平台适配等方面提供更好的解决方案。它有效地解决了传统前端开发中存在的诸多问题,使得前端开发更加高效、灵活和可维护,为构建复杂的现代 Web 应用和跨平台应用提供了有力的支持。
38 6
|
3月前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
3月前
|
JSON 前端开发 JavaScript
JavaWeb基础8——Filter,Listener,Ajax,Axios,JSON
Filter过滤器、Listener监听器、AJAX、 同步、异步优点和使用场景、Axios异步框架、JSON、js和JSON转换、案例,Axios + JSON 品牌列表查询和添加
JavaWeb基础8——Filter,Listener,Ajax,Axios,JSON
|
4月前
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
119 1
|
4月前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
55 1
|
4月前
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
|
4月前
|
XML JSON 前端开发
JSON与AJAX:网页交互的利器
JSON与AJAX:网页交互的利器
38 0
|
6月前
|
JSON 中间件 Go
基于框架的服务创建处理json响应
【6月更文挑战第22天】本文探索Go的Gin框架:高性能HTTP服务与路由。Gin默认用encoding/json处理JSON响应,但可选jsoniter加速。
64 7
基于框架的服务创建处理json响应