对下面代码进行建模
<config>
<!--
action标签:可以饱含0~N个forward标签
path:以/开头的字符串,并且值必须唯一 非空
type:字符串,非空
-->
<action path="/regAction" type="test.RegAction">
<!--
forward标签:没有子标签;
name:字符串,同一action标签下的forward标签name值不能相同 ;
path:以/开头的字符串
redirect:只能是false|true,允许空,默认值为false
-->
<forward name="failed" path="/reg.jsp" redirect="false" />
<forward name="success" path="/login.jsp" redirect="true" />
</action>
<action path="/loginAction" type="test.LoginAction">
<forward name="failed" path="/login.jsp" redirect="false" />
<forward name="success" path="/main.jsp" redirect="true" />
</action>
</config>
一 : 首先我们要知道为什么要建模?
1 :代码封装,调高复用性
2: 提高性能,xml解析的过程只会有一次了
二 :搞懂建模的过程
1:获取到资源文件进行加载
2:分析xml标签,将其看成对象,分析该对象的属性及行为
3: 解析出xml资源文件中的所有类容
4: 建模的核心部分(将xml资源文件中的内容填充到各个标签对应的模型
对象ActionModel)
5 注意将子模型对象填充到父模型中
6:最后一步就是测试
写作过程
package com.zhoujun.model;
import java.util.HashMap;
import java.util.Map;
public class ActionModel {
private String path;
private String type;
private Map<String, ForwardModel> foMap=new HashMap<>();
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
//两个行为
/**
* 将指定的forwardModel 压入当前actionModel对象中
* <forward> 放入<action>标签中
* @param forwardModel
*/
public void push(ForwardModel forwardModel) {
foMap.put(forwardModel.getName(), forwardModel);
}
public ForwardModel pop(String name) {
return foMap.get(name);
}
}
package com.zhoujun.model;
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(boolean redirect) {
this.redirect = redirect;
}
}
package com.zhoujun.model;
import java.util.HashMap;
import java.util.Map;
public class configModel {
private Map<String, ActionModel> acMap=new HashMap<String, ActionModel>();
/**
* 将指定的actionModel 压入当前ConfigModel对象中
* <action> 放入<config>标签中
* @param forwardModel
*/
public void push(ActionModel actionModel) {
acMap.put(actionModel.getPath(), actionModel);
}
public ActionModel pop(String path) {
return acMap.get(path);
}
}
package com.zhoujun.model;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 23种设计模式之工厂模式
* 将代码封装,提高代码的复用性
* 一般工厂类一定会有一个方法,就是生产指定模型对象的方法
* build
* newInstance
*
* 注意:一般在工厂类中会有两个以上的构建方法,
* 一个是默认框架路径的模型对象构建方法
* 还有一个是动态读取任意位置下的框架配置文件
*
*
* @author 周俊
*
*/
public class ConfigModelFactory {
/**
* 通过资源文件构建对应的模型对象
* @param path 具体的资源文件路径
* @return
* @throws Exception
*/
public static configModel build(String path) throws Exception {
InputStream in=ConfigModelFactory.class.getResourceAsStream(path);
SAXReader reader=new SAXReader();
Document doc = reader.read(in);
//把内容填充到configModel对象中
configModel configModel=new configModel();
ActionModel actionModel=null;
ForwardModel forwardModel=null;
List<Element> actionEles = doc.selectNodes("/config/action");
for(Element actionEle: actionEles) {
actionModel=new ActionModel();
actionModel.setPath(actionEle.attributeValue("path"));
actionModel.setType(actionEle.attributeValue("type"));
//给actionModel中放入ForwardModel对象
//拿到forward标签内容
List<Element> forwardEles = actionEle.selectNodes("forward");
for (Element forwardEle : actionEles) {
forwardModel =new ForwardModel();
forwardModel.setName(forwardEle.attributeValue("name"));
forwardModel.setPath(forwardEle.attributeValue("path"));
//redirct属性是boolean类型的
//只有config.xml中redirect属性值填写了false,他才代表转发
forwardModel.setRedirect(!"false".equals(forwardEle.attributeValue("redirect")));
actionModel.push(forwardModel);
}
configModel.push(actionModel);
}
return configModel;
}
/**
* 一个是默认框架路径的模型对象构建方法
*
* @return
* @throws Exception
*/
public static configModel build() throws Exception {
return build("/config.xml");
}
public static void main(String[] args) throws Exception {
configModel model = ConfigModelFactory.build();
// 需求:获取/loginAction下的success结果码对应的页面.main.js
ActionModel actionModel = model.pop("/loginAction");
System.out.println(actionModel.getType());
//ForwardModel forwardModel = actionModel.pop("success");
//System.out.println(forwardModel.getPath());
}
}
输出结果