用一个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 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
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
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.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
/* * 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); }