当前位置: 首页 > news >正文

J2EEXML建模

目录

用一个xml-config文件实例:

先看config.xml文件

再看 ActionModel

ConfigModel

ActionNotFoundException

ForwardNotFoundException

ConfigModelFactory

ActionDuplicateDefinitionException

ForwardDuplicateDefinitionException

InvalidPathException


用一个xml-config文件实例:

  •  ActionModel
  • ConfigModel
  • ForwardModel     
  • ActionNotFoundException
  • ForwardNotFoundException
  • ConfigModelFactory
  • ActionDuplicateDefinitionException
  • ForwardDuplicateDefinitionException
  • InvalidPathException

先看config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config[<!ELEMENT config (action*)><!ELEMENT action (forward*)><!ELEMENT forward EMPTY><!ATTLIST actionpath CDATA #REQUIREDtype CDATA #REQUIRED><!ATTLIST forwardname CDATA #REQUIREDpath CDATA #REQUIREDredirect (true|false) "false">
]>
<config><action path="/studentAction" type="org.lisen.mvc.action.StudentAction"><forward name="students" path="/students/studentList.jsp" redirect="false"/></action>
</config>

再看 ActionModel

package com.zking.mymvc.framework;import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** ActionModel类:表示一个Action的模型,包含了Action的路径、类型、转发模型、重定向等属性* */
public class ActionModel {private String path; //Action的路径private String type; //Action的类型,例如:request、ajax等private static Pattern pattern = Pattern.compile("^/.+$"); //静态的正则表达式,用于匹配Action的路径private Map<String, ForwardModel> forwardmap = new HashMap<>(); //转发模型的HashMapprivate Boolean redirect; //是否重定向public String getPath() {return path;}public void setPath(String path) {checkPath(path); //校验Action的路径是否符合规范,即必须以/开头this.path = path;}public String getType() {return type;}public void setType(String type) {this.type = type;}// put()方法用于将ForwardModel转发模型添加到HashMap集合中;public void put(ForwardModel forward) {if(!forwardmap.containsKey(forward.getName())) {forwardmap.put(forward.getName(), forward); //添加转发模型}else {throw new ForwardDuplicateDefinitionException("forward name:"+forward.getName()+" 不能重复");//如果转发模型已经存在,则抛出ForwardDuplicateDefinitionException异常}}// find()方法用于查找指定名称的转发模型,如果不存在则抛出ForwardNotFoundException异常public  ForwardModel find(String name) {if(!forwardmap.containsKey(name)) {return forwardmap.get(name);}else {throw new ForwardNotFoundException("forward name:"+name+"不存在");//如果转发模型不存在,则抛出ForwardNotFoundException异常}}// setRedirect()方法用于设置属性redirect的值必须为true或者false;public void setRedirect(String redirect) {if("true".equals(redirect) || "false".equals(redirect)){this.redirect=Boolean.valueOf(redirect);}else {throw new RuntimeException("属性redirect的值必须为true或者false");//如果属性redirect的值不为true或者false,则抛出RuntimeException异常}}// checkPath()方法用于校验路径是否符合规范,即必须以/开头;public void checkPath(String path) {Matcher matcher = pattern.matcher(path); //匹配Action的路径是否符合规范boolean b = matcher.matches();if(!b) {throw new InvalidPathException("ForwardModel.path["+path+"]必须以/开头");//如果Action的路径不符合规范,则抛出InvalidPathException异常}}}

ConfigModel

public class ConfigModel {private Map<String, ActionModel> actionMap = new HashMap<>();//根据指定的路径 path,在 actionMap 中查找对应的 ActionModel 对象并返回。public ActionModel find(String path) {if(actionMap.containsKey(path)) {return actionMap.get(path);}else {throw new RuntimeException("action path:"+path+"没有找到");}}//将指定的 ActionModel 对象存储到 actionMap 中。public void put(ActionModel action) {if(!actionMap.containsKey(action.getPath())) {actionMap.put(action.getPath(), action);}else {//如果该对象的路径已经存在于 actionMap 中,则抛出自定义的 ActionDuplicateDefinitionException 异常,提示路径重复定义。 throw new ActionDuplicateDefinitionException("action path:"+action.getPath()+"重复定义");}}}

ForwardModel     

public class ForwardModel {private String name;private String path;private boolean redirect;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public boolean isRedirect() {return redirect;}public void setRedirect(String redirect) {this.redirect = Boolean.valueOf(redirect);}}

ActionNotFoundException

/** action找不到指定路径*/
public class ActionNotFoundException extends RuntimeException{public ActionNotFoundException() {super();}public ActionNotFoundException(String msg) {super(msg);}public ActionNotFoundException(String msg,Throwable cause) {super(msg,cause);}}

ForwardNotFoundException

public class ForwardModel {private String name;private String path;private boolean redirect;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public boolean isRedirect() {return redirect;}public void setRedirect(String redirect) {this.redirect = Boolean.valueOf(redirect);}}

ConfigModelFactory

public class ConfigModelFactory {//私有化构造方法,确保该类不会被实例化private ConfigModelFactory() {}//使用饿汉模式,类加载时就初始化了config对象private static ConfigModel config = null;static {//读取配置文件config.xmlInputStream in = ConfigModelFactory.class.getResourceAsStream("/config.xml");SAXReader reader  = new SAXReader();Document doc;try {doc = reader.read(in);Element root = doc.getRootElement();config = new ConfigModel();//读取每个action节点List<Element> actions = root.selectNodes("action");for (Element action : actions) {String actionPath = action.attributeValue("path");String actionType = action.attributeValue("type");//创建ActionModel对象ActionModel actionModel = new ActionModel();actionModel.setPath(actionPath);actionModel.setType(actionType);//读取每个action节点下的forward子节点List<Element> forwards = action.selectNodes("forward");for (Element forward : forwards) {String forwardPath = forward.attributeValue("path");String forwardName = forward.attributeValue("name");String redirect = forward.attributeValue("redirect");//创建ForwardModel对象ForwardModel forwardModel = new ForwardModel();forwardModel.setPath(forwardPath);forwardModel.setName(forwardName);forwardModel.setRedirect(redirect);//将ForwardModel对象放入ActionModel对象中actionModel.put(forwardModel);}//将ActionModel对象放入ConfigModel对象中config.put(actionModel);}} catch (Exception e) {//抛出运行时异常throw new RuntimeException("解析config.xml发生异常", e.getCause());}}//提供一个方法获取config对象public static ConfigModel getConfigModel() {return config;}public static void main(String[] args) throws DocumentException {//测试ActionModel action = config.find("/studentAction");System.out.println(action.getType());System.out.println("yes");}
}

ActionDuplicateDefinitionException

/** action重复定义异常*/
public class ActionDuplicateDefinitionException extends RuntimeException{public ActionDuplicateDefinitionException() {super();}public ActionDuplicateDefinitionException(String msg) {super(msg);}public ActionDuplicateDefinitionException(String msg,Throwable cause) {super(msg,cause);}
}

ForwardDuplicateDefinitionException

/*** forward重复定义异常* @author PC**/
public class ForwardDuplicateDefinitionException extends RuntimeException{public ForwardDuplicateDefinitionException() {super();}public ForwardDuplicateDefinitionException(String msg) {super(msg);}public ForwardDuplicateDefinitionException(String msg,Throwable cause) {super(msg,cause);}

InvalidPathException


public class InvalidPathException extends RuntimeException{public InvalidPathException() {super();}public InvalidPathException(String msg) {super(msg);}public InvalidPathException(String msg,Throwable cause) {super(msg,cause);}

相关文章:

J2EEXML建模

目录 用一个xml-config文件实例&#xff1a; 先看config.xml文件 再看 ActionModel ConfigModel ActionNotFoundException ForwardNotFoundException ConfigModelFactory ActionDuplicateDefinitionException ForwardDuplicateDefinitionException InvalidPathExcept…...

vue中export和export default

参考&#xff1a;vue中export和export default的使用 参考&#xff1a;vue里的export default...

转职做项目经理,我为什么选择PMP?

老实说&#xff0c;在学习PMP之前&#xff0c;我做了很长时间的思想斗争&#xff0c;一是平时工作有些忙&#xff0c;没有大块儿时间集中学习&#xff1b;二是不确定考完之后是否真能用上。但现在我可以很明确的告诉每一个想学习PMP的人&#xff1a;放心学吧&#xff0c;知识不…...

LangChain(5)Conversational Agents

Large Language Models (LLMs) 在语义知识方面表现不错&#xff0c;但也有一些不足&#xff0c;如&#xff1a;不能正确计算数学公式、无法获取最新知识新闻 通过 Agents 可以赋予 LLMs 更多能力&#xff0c;让LLM能够计算、上网查询 agent 简单使用 from langchain import …...

【云原生】Kubernetes临时容器

临时容器 特性状态&#xff1a; Kubernetes v1.25 [stable] 本页面概述了临时容器&#xff1a;一种特殊的容器&#xff0c;该容器在现有 Pod 中临时运行&#xff0c;以便完成用户发起的操作&#xff0c;例如故障排查。 你会使用临时容器来检查服务&#xff0c;而不是用它来构建…...

Jenkins+Robot 接口自动化测试

目录 前言&#xff1a; 设计目标 项目说明 目录结构 配置 jenkins 1.安装插件 2.配置项目 前言&#xff1a; JenkinsRobot是一种常见的接口自动化测试方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;而Robot Framew…...

【Visual Studio Code】---自定义键盘快捷键设置

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、进入键盘快捷键设置 1、进入键盘快捷键设置方法1 使用快捷键进入键盘快捷键设置先按 Ctrl K再…...

FastEdit ⚡:在10秒内编辑大型语言模型

概述&#xff1a; 这个仓库旨在通过一个单一的命令&#xff0c;有效地将新鲜且定制化的知识注入到大型语言模型中&#xff0c;以辅助开发人员的工作。 支持的模型&#xff1a;○ GPT-J (6B)○ LLaMA (7B/13B)○ BLOOM (7.1B)○ Falcon (7B)○ Baichuan (7B/13B)○ InternLM (7…...

SpringBoot + Docker 实现一次构建到处运行

一、容器化部署的好处 Docker 作为一种新兴的虚拟化方式&#xff0c;它可以更高效的利用系统资源&#xff0c;不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟&#xff0c;而 Docker 容器应用&#xff0c;由于直接运行宿主内…...

Spring-Cloud-Gateway如何自定义断言工厂?

遇到这么一个面试题&#xff1a;如何在网关做配置&#xff0c;实现只有在早晨9点到下午18点之间接口才允许访问&#xff0c;其他时间访问都是404。 我们知道网关的一个重要的作用就是路由转发&#xff0c;路由表的配置大概是这个样子: spring:cloud:gateway:routes:- id: user…...

Android平台如何高效率实现GB28181对接?

技术背景 GB28181协议是一种用于设备状态信息报送的协议&#xff0c;可以在不同设备之间进行通信和数据传输。 在安卓系统上实现GB/T 28181非常必要&#xff0c;GB28181协议实现分两部分&#xff0c;一部分是信令&#xff0c;另外一部分就是媒体数据的编码。 信令主要包括S…...

vue2 实现后台管理系统左侧菜单联动实现 tab根据路由切换联动内容,并支持移动端框架

效果图&#xff1a; pc端 移动端 由于代码比较多&#xff0c;我这里就不一一介绍了&#xff0c;可以去我的git上把项目拉下来 git地址https://gitee.com/Flechazo7/htglck.git 后台我是用node写的有需要的可以评论联系...

一本通1910:【00NOIP普及组】计算器的改良题解

今天是编程集训的第二天&#xff0c;也是我来到CSDN整整1年。感谢所有阅读过我的文章的人&#xff0c;谢谢。 今天的比赛难度略低于昨天&#xff0c;但这道题也卡了我好久。 进入正题 题目&#xff1a; 题目描述&#xff1a; NCL是一家专门从事计算器改良与升级的实验室&a…...

golang网络编程学习-1rpc

网络编程主要的内容是&#xff1a; 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 一、rpc RPC 框架----- 远程过程调用协议RPC&#xff08;Remote Procedure Call Protocol)-----允许像调用本地服务一样调用远程服务。 RPC是指远程过程调用&#xff0c;也就是说两台服…...

【MQTT】Esp32数据上传采集:最新mqtt插件(支持掉线、真机调试错误等问题)

前言 这是我在Dcloud发布的插件-最完整Mqtt示例代码&#xff08;解决掉线、真机调试错误等问题&#xff09;&#xff0c;经过整改优化和替换Mqtt的js文件使一些市场上出现的问题得以解决&#xff0c;至于跨端出问题&#xff0c;可能原因有很多&#xff0c;例如&#xff0c;合法…...

基于PyQt5的UI界面开发——对基本控件的介绍

基本控件介绍 在PyQt中&#xff0c;控件是用户界面上的可见元素。控件可以包括按钮、标签、文本框、进度条等。每个控件都有自己的属性和方法&#xff0c;可以通过编程方式进行调整和操作。 以下是一些常用的PyQt控件&#xff1a; QLabel&#xff08;标签&#xff09;&#…...

flink 报错:Caused by: java.lang.RuntimeException: Assigned key must not be null!

问题描述 不同情况下需要找对应的解决方法&#xff0c;这里介绍的解决方法不能拓展到别的场景。 场景描述&#xff1a; flink job 的开发过程中遇到这样的需求&#xff0c;需要先 map 处理&#xff0c;然后把返回的 DataStream 作为输入&#xff0c;流入别的 map 中。这里我们遇…...

AN OVERVIEW OF LANGUAGE MODELS RECENT DEVELOPMENTS AND OUTLOOK

LLM系列相关文章&#xff0c;针对《AN OVERVIEW OF LANGUAGE MODELS: RECENT DEVELOPMENTS AND OUTLOOK》的翻译。 语言模型综述&#xff1a;近年来的发展与展望 摘要1 引言2 语言模型的类型2.1 结构化LM2.2 双向LM2.3 置换LM 3 语言单元3.1 字符3.2 单词和子单词3.2.1 基于统…...

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注…...

fastapi初使用,构建自己的api

文章目录 1、安装2、api实现2.1、 app.get("/1")2.2、app.get("/{a}")2.3、app.get("/{a}{b}")2.4、函数和api分离 3、运行 原文链接&#xff1a;https://wangguo.site/posts/d98bb3c9.html fastapi 是一个基于 Python 的 API 构建框架&#xff…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...