J2EE&XML建模

简介: J2EE&XML建模
用一个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);
  }


相关文章
|
11月前
|
XML 设计模式 开发框架
J2EE(xml建模)
J2EE(xml建模)
49 0
|
11月前
|
XML 开发框架 JSON
J2EE基础XML(dtd)
J2EE基础XML(dtd)
54 0
|
11月前
|
XML 存储 开发框架
J2EE之XML建模
J2EE之XML建模
38 0
|
11月前
|
XML 存储 Java
XML建模
XML建模
|
10月前
|
XML 存储 设计模式
xml建模
xml建模
45 0
|
10月前
|
XML 存储 数据库
xml建模----详细完整,易懂结合代码分析
xml建模----详细完整,易懂结合代码分析
|
10月前
|
XML 数据格式
XML-----建模
XML-----建模
30 0
|
10月前
|
XML 存储 设计模式
XML建模
XML建模
42 0
|
11月前
|
XML 存储 Java
XML之建模
XML之建模
58 0
|
11月前
|
XML 设计模式 数据格式
XML建模
XML建模
30 0