J2EE&XML建模

目录

用一个xml-config文件实例:

先看config.xml文件

[再看 ActionModel](#再看 ActionModel)

ConfigModel

ActionNotFoundException

ForwardNotFoundException

ConfigModelFactory

ActionDuplicateDefinitionException

ForwardDuplicateDefinitionException

InvalidPathException


用一个xml-config文件实例:

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

先看config.xml文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config[
	<!ELEMENT config (action*)>
	<!ELEMENT action (forward*)>
	<!ELEMENT forward EMPTY>
	<!ATTLIST action
	  path CDATA #REQUIRED
	  type CDATA #REQUIRED
	>
	<!ATTLIST forward
	  name CDATA #REQUIRED
	  path CDATA #REQUIRED
	  redirect (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

java 复制代码
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<>(); //转发模型的HashMap
	private 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

java 复制代码
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

java 复制代码
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

java 复制代码
/*
 * 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

java 复制代码
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

java 复制代码
public class ConfigModelFactory {
    //私有化构造方法,确保该类不会被实例化
    private ConfigModelFactory() {}

    //使用饿汉模式,类加载时就初始化了config对象
    private static ConfigModel config = null;
    static {
        //读取配置文件config.xml
        InputStream 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

java 复制代码
/*
 * 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

java 复制代码
/**
 * 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

java 复制代码
public class InvalidPathException extends RuntimeException{

	public InvalidPathException() {
		super();
	}
	
	public InvalidPathException(String msg) {
		super(msg);
	}
	
	public InvalidPathException(String msg,Throwable cause) {
		super(msg,cause);
	}
相关推荐
cxoptics17 分钟前
冰洲石分束器设计与应用
java
ck-joker31 分钟前
M1 Pro跑LLM实测:Ollama+LangChain4j零成本本地大模型开发,比云端API快在哪?
java·语言模型
丙氨酸長鏈1 小时前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#
Nontee1 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
我是唐青枫1 小时前
Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁
java·开发语言
云水一下2 小时前
零基础玩转bWAPP靶场(三十):XML/XPath 注入(登录表单)
xml·web安全·bwapp
晨曦中的暮雨2 小时前
Virtual Thread 优化 Spring AI 阻塞式 LLM I/O:对照压测报告
java·并发·个人项目
AKA__Zas3 小时前
芝士算法(前缀和2.0)
java·数据结构·算法·leetcode·哈希算法·学习方法
caishenzhibiao3 小时前
降雨带波段点差 同花顺期货通指标
java·c语言·c#
七夜zippoe3 小时前
OpenClaw Prompt 工程:从角色设定到 Skill 封装的 Agent 输出质量方法论
java·服务器·prompt·openclaw·skill封装