J2EE--XML建模

目录

一、XML建模:

二、案例一:

三、案例二:


一、XML建模:

核心思想:以面向对象的思想取操作xml文件。

思路

1.要分析需要被建模的文件中有哪几个对象

2.每个对象拥有的行为以及属性

3.定义一个从里到外的对象

4.通过23重设计模式中的工厂模式,解析xml生产指定对象

建模:(将指定的xml字符串当作对象来操作)

特点:(只需要调用指定的方法就可以完成预定的字符串获取)

二、案例一:

  • config.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
    <!--
        config标签:可以包含0~N个action标签
    -->
<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>


 先分别建立三个对象:

  • ActionModel:
package com.ps.model;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * 对应Action标签
 * @author ps
 *
 * @time 2022年6月15日 上午9:54:14
 */
public class ActionModel {
//    <action path="/loginAction" type="test.LoginAction">
    private String path;
    private String type;
    private Map<String,ForwardModel> fMap=new HashMap<String,ForwardModel>();
    
    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对象,查找forwardModel对象
    //将一个新的forward标签对象加入容器
    public void push(ForwardModel forward) {
        fMap.put(forward.getName(), forward);
    }
    public ForwardModel pop(String name) {
        return fMap.get(name);
    }
}
ConfigModel 
package com.ps.model;
/**
 * 根标签对应的对象
 * @author ps
 *
 * @time 2022年6月15日 上午9:52:45
 */
 
import java.util.HashMap;
import java.util.Map;
 
public class ConfigModel{
    private Map<String, ActionModel> amap=new HashMap<String, ActionModel>();
    public void push(ActionModel act) {
        amap.put(act.getPath(), act);    
    }
    public ActionModel pop(String path) {
        return amap.get(path);
    }
}
  • ForwardModel:
package com.ps.model;
/**
 * 对应forward标签
 * @author 彭帅
 *
 * @time 2022年6月15日 上午9:54:56
 */
public class ForwardModel {
//    <forward name="failed" path="/reg.jsp" redirect="false" />
    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.ps.model;
 
import java.io.InputStream;
import java.util.List;
 
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
/**
 * 23种设计模式值工厂模式
 * sessionfactory
 * 生产出来的ConfigModelFactory就是用来生产configmodel对象的
 * 生产出来的ConfigModel对象就包含leconfig.xml中的配置内容
 *
 * 此地生产configmodel有配置信息?
 * 1.解析config.xml中的配置信息
 * 2.将对应的配置信息分别加载进行不同的模型对象中
 * @author ps
 *
 * @time 2022年6月15日 上午10:16:16
 */
public class ConfigModelFactory {
    public static ConfigModel build(String path) throws Exception{
//        String defaultPath="/config.xml";
        InputStream in = ConfigModelFactory.class.getResourceAsStream(path);
        SAXReader sr =new SAXReader();
        Document doc =sr.read(in);
        List<Element> actionEles =doc.selectNodes("/config/action");
        ConfigModel configModel=new ConfigModel();
        for (Element ac : actionEles) {
            ActionModel a =new ActionModel();
            a.setPath(ac.attributeValue("path"));
            a.setType(ac.attributeValue("type"));
            //将forwardmodel赋值并且添加到Actionmodel中
            List<Element> forwardEles=ac.selectNodes("forward");
            for (Element element : forwardEles) {
                ForwardModel forwardModel =new ForwardModel();
                forwardModel.setName(element.attributeValue("name"));
                forwardModel.setPath(element.attributeValue("path"));
//                redirect:只能是false|true,允许空,默认值为false
                forwardModel.setRedirect("true".equals(element.attribute("redirect")));
                a.push(forwardModel);
            }
            configModel.push(a);
        }
        return configModel;
    }
    public static ConfigModel build() throws Exception {
        String defaultPath="/config.xml";
        return build(defaultPath);
    }
}
  • 测试类:
package com.ps.model;
 
public class Demo1 {
    public static void main(String[] args) throws Exception {
//        ConfigModel con =new ConfigModel();
        ConfigModel con =ConfigModelFactory.build();
        ActionModel action =con.pop("/loginAction");
        System.out.println(action.getType());
        ForwardModel forwardModel =action.pop("success");
        System.out.println(forwardModel.getPath());
    }
}

结果: 

三、案例二:

  • 解析web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
  	<servlet-name>jrebelServlet</servlet-name>
  	<servlet-class>com.zking.xml.JrebelServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jrebelServlet</servlet-name>
  	<url-pattern>/jrebelServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>jrebelServlet2</servlet-name>
  	<servlet-class>com.zking.xml.JrebelServlet2</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jrebelServlet2</servlet-name>
  	<url-pattern>/jrebelServlet2</url-pattern>
  	<url-pattern>/jrebelServlet3</url-pattern>
  </servlet-mapping>
</web-app>
  • 定义对象:

ServletClassModel:

package com.ps.text1;
 
public class ServletClassModel {
	private String context;
 
	public String getContext() {
		return context;
	}
 
	public void setContext(String context) {
		this.context = context;
	}
}

 ServletMappingModel:

package com.ps.text1;
 
import java.util.ArrayList;
import java.util.List;
 
public class ServletMappingModel {
	private ServletNameModel servletNameModel;
	private List<UrlPatternModel> urlPatternModels = new ArrayList<>();
	public ServletNameModel getServletNameModel() {
		return servletNameModel;
	}
	public void setServletNameModel(ServletNameModel servletNameModel) {
		this.servletNameModel = servletNameModel;
	}
	
	public void pushUrlPatternModel(UrlPatternModel urlPatternModel) {
		urlPatternModels.add(urlPatternModel);
	}
	
	public List<UrlPatternModel> getUrlPatternModels() {
		return urlPatternModels;
	}
}

 ServletModel:

package com.ps.text1;
 
public class ServletModel {
	private ServletNameModel servletNameModel;
	private ServletClassModel servletClassModel;
 
	public ServletNameModel getServletNameModel() {
		return servletNameModel;
	}
 
	public void setServletNameModel(ServletNameModel servletNameModel) {
		this.servletNameModel = servletNameModel;
	}
 
	public ServletClassModel getServletClassModel() {
		return servletClassModel;
	}
 
	public void setServletClassModel(ServletClassModel servletClassModel) {
		this.servletClassModel = servletClassModel;
	}
 
}

 ServletNameModel:

package com.ps.text1;
 
public class ServletNameModel {
	private String context;
 
	public String getContext() {
		return context;
	}
 
	public void setContext(String context) {
		this.context = context;
	}
}

UrlPatternModel:

package com.ps.text1;
 
public class UrlPatternModel {
	private String context;
 
	public String getContext() {
		return context;
	}
 
	public void setContext(String context) {
		this.context = context;
	}
 
}

WebAppModel:

package com.ps.text1;
 
import java.util.ArrayList;
import java.util.List;
 
public class WebAppModel {
	private List<ServletModel> servletModels = new ArrayList<>();
	private List<ServletMappingModel> servletMappingModels = new ArrayList<>();
 
	public void pushServletModel(ServletModel servletModel) {
		servletModels.add(servletModel);
	}
	
	public List<ServletModel> getServletModels() {
		return servletModels;
	}
	
	public void pushServletMappingModel(ServletMappingModel servletMappingModel) {
		servletMappingModels.add(servletMappingModel);
	}
	
	public List<ServletMappingModel> getServletMappingModels() {
		return servletMappingModels;
	}
 
}
 

工厂:WebAppModelFactory

package com.ps.text1;
 
import java.io.InputStream;
import java.util.List;
 
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
 
 
public class WebAppModelFactory {
	public static WebAppModel buildWebAppModel() {
		String xmlPath = "/web.xml";
		return buildWebAppModel(xmlPath);
	}
 
	
	/**
	 * 建模
	 * 
	 * @param xmlPath
	 * @return
	 */
	public static WebAppModel buildWebAppModel(String xmlPath) {
		InputStream in = WebAppModelFactory.class.getResourceAsStream(xmlPath);
		SAXReader saxReader = new SAXReader();
		WebAppModel webAppModel = new WebAppModel();
		try {
			Document doc = saxReader.read(in);
			/*
			 * 将servlet的标签内容填充进WebApp
			 */
			List<Element> servletEles = doc.selectNodes("/web-app/servlet");
			for (Element servletEle : servletEles) {
				ServletModel servletModel = new ServletModel();
 
				/*
				 * 给ServletModel填充xml的内容
				 */
				Element servletNameEle = (Element) servletEle.selectSingleNode("servlet-name");
				Element servletClassEle = (Element) servletEle.selectSingleNode("servlet-class");
				ServletNameModel servletNameModel = new ServletNameModel();
				ServletClassModel servletClassModel = new ServletClassModel();
				servletNameModel.setContext(servletNameEle.getText());
				servletClassModel.setContext(servletClassEle.getText());
				
				servletModel.setServletNameModel(servletNameModel);
				servletModel.setServletClassModel(servletClassModel);
 
				webAppModel.pushServletModel(servletModel);
			}
 
			/*
			 * 将servlet-mapping的标签内容填充进WebApp
			 */
			List<Element> servletMappingEles = doc.selectNodes("/web-app/servlet-mapping");
			for (Element servletMappingEle : servletMappingEles) {
				ServletMappingModel servletMappingModel = new ServletMappingModel();
 
				/*
				 * 给ServletMappingModel填充xml的内容
				 */
				Element servletNameEle = (Element) servletMappingEle.selectSingleNode("servlet-name");
				ServletNameModel servletNameModel = new ServletNameModel();
				servletNameModel.setContext(servletNameEle.getText());
				servletMappingModel.setServletNameModel(servletNameModel);
				
				List<Element> urlPatternEles = servletMappingEle.selectNodes("url-pattern");
				for (Element urlPatternEle : urlPatternEles) {
					UrlPatternModel urlPatternModel = new UrlPatternModel();
					urlPatternModel.setContext(urlPatternEle.getText());
					servletMappingModel.pushUrlPatternModel(urlPatternModel);
				}
 
				webAppModel.pushServletMappingModel(servletMappingModel);
			}
 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return webAppModel;
	}
	
	/**
	 * 通过浏览器输入的网址自动找到对应的后台处理类
	 * @param webAppModel	建模后的实体类
	 * @param url	浏览器访问的网址
	 * @return
	 */
	public static String getServletClassByUrl(WebAppModel webAppModel, String url) {
		String servletClass = "";
		/*
		 * 找到浏览器网址对应的servlet-name
		 */
		String servletName = "";
		List<ServletMappingModel> servletMappingModels = webAppModel.getServletMappingModels();
		for (ServletMappingModel servletMappingModel : servletMappingModels) {
			List<UrlPatternModel> urlPatternModels = servletMappingModel.getUrlPatternModels();
			for (UrlPatternModel urlPatternModel : urlPatternModels) {
				if(url.equals(urlPatternModel.getContext())) {
					ServletNameModel servletNameModel = servletMappingModel.getServletNameModel();
					servletName = servletNameModel.getContext();
				}
			}
		}
		
		/*
		 * 找到servlet-name对应的后台处理类
		 */
		List<ServletModel> servletModels = webAppModel.getServletModels();
		for (ServletModel servletModel : servletModels) {
			ServletNameModel servletNameModel = servletModel.getServletNameModel();
			if(servletName.equals(servletNameModel.getContext())) {
				ServletClassModel servletClassModel = servletModel.getServletClassModel();
				servletClass = servletClassModel.getContext();
			}
		}
		return servletClass;
	}
	
	public static void main(String[] args) {
		WebAppModel webAppModel = WebAppModelFactory.buildWebAppModel();
		String res = getServletClassByUrl(webAppModel, "/jrebelServlet");
		String res2 = getServletClassByUrl(webAppModel, "/jrebelServlet2");
		String res3 = getServletClassByUrl(webAppModel, "/jrebelServlet3");
		System.out.println(res);
		System.out.println(res2);
		System.out.println(res3);
		
	}
}

结果:

 好啦!今天的分享就到这里啦!咱们有空再见 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值