目录
1. XML建模
2. 工厂模式
3. 示例
首先上思维导图:
一,XML建模
建模:(将指定的xml字符串当作对象来操作)
特点:(只需要调用指定的方法就可以完成预定的字符串获取)
建模的思路:
1,将原有的config.xml进行解析
2,对应标签的内容,将其封装赋值给相应的对象
3,定义对象从小到大(从里到外)
如下代码我们可以看成三个对象:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/regAction" type="test.RegAction">
<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>
根据标签从内向外建出实体类:
- forward
- action‘
- config
注:每个类属性有所包含的子节点,分别用map集合表示,而最小的子节点只包含文本,用string类型,其中除最小的节点没有添加的方法,其他节点都有添加的方法
第一个:ForwardModel
package com.whw.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;
}
}
第二个:ActionModel
package com.whw.model;
import java.util.HashMap;
import java.util.Map;
public class ActionModel {
private String path;
private String type;
private Map<String, ForwardModel> fMap=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;
}
//压栈
public void push(ForwardModel f) {
fMap.put(f.getName(), f);
}
//弹栈
public ForwardModel pop(String name) {
return fMap.get(name);
}
}
第三个:ConfigModel
package com.whw.model;
import java.util.HashMap;
import java.util.Map;
public class ConfigModel {
private Map<String, ActionModel> aMap=new HashMap<>();
public void push(ActionModel a) {
aMap.put(a.getPath(), a);
}
public ActionModel pop(String name) {
return aMap.get(name);
}
}
二,工厂模式
建一个ConfigModelFactory(工厂类)
package com.whw.model;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 建模的思路
* 1.将原有的xml进行解析
* 2.对应标签的内容,将其封装赋值给相对应的对象
* forward标签的值 赋值给ForwardModel对象
* action标签的值 赋值给ActionModel对象
* config标签的值 赋值给ConfigModel对象
* @author zjjt
*
*/
public class ConfigModelFactory {
public static ConfigModel build() throws Exception {
return build("config.xml");
}
public static ConfigModel build(String resourcepath) throws Exception {
InputStream in = ConfigModelFactory.class.getResourceAsStream(resourcepath);
SAXReader sr=new SAXReader();
Document doc=sr.read(in);
ConfigModel cm=new ConfigModel();
List<Element> actionEles = doc.selectNodes("/config/action");
for (Element ae : actionEles) {
ActionModel am=new ActionModel();
//将xml文件解析得来的path值赋值给actionmodel对象中的path属性
am.setPath(ae.attributeValue("path"));
am.setType(ae.attributeValue("type"));
List<Element> fEles = ae.selectNodes("forward");
for (Element fe : fEles) {
ForwardModel fm=new ForwardModel();
fm.setName(fe.attributeValue("name"));
fm.setPath(fe.attributeValue("path"));
//Redirect只有在配置文件中赋值false的时候,代表转发,其他代表重定向
fm.setRedirect(!"false".equals(fe.attribute("redirect")));
am.push(fm);
}
cm.push(am);
}
return cm;
}
}
三,示例:
1.对web.xml进行建模
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>
将xml文件中标签内容由内到外的封装进实体对象
最后建一个工厂类(WebAppModelFactory)
不过我这里只用到了以下几个类:
ServletModel:
package com.whw.sl;
public class ServletModel extends WebAppModel{
private String servletname;
private String servletcalss;
public String getServletname() {
return servletname;
}
public void setServletname(String servletname) {
this.servletname = servletname;
}
public String getServletcalss() {
return servletcalss;
}
public void setServletcalss(String servletcalss) {
this.servletcalss = servletcalss;
}
public ServletModel(String servletname, String servletcalss) {
super();
this.servletname = servletname;
this.servletcalss = servletcalss;
}
public ServletModel() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "ServletModel [servletname=" + servletname + ", servletcalss=" + servletcalss + "]";
}
}
ServletMappingModel:
package com.whw.sl;
public class ServletMappingModel extends WebAppModel{
private String servletname;
private String urlpattern;
public String getServletname() {
return servletname;
}
public void setServletname(String servletname) {
this.servletname = servletname;
}
public String getUrlpattern() {
return urlpattern;
}
public void setUrlpattern(String urlpattern) {
this.urlpattern = urlpattern;
}
@Override
public String toString() {
return "ServletMappingModel [servletname=" + servletname + ", urlpattern=" + urlpattern + "]";
}
public ServletMappingModel(String servletname, String urlpattern) {
super();
this.servletname = servletname;
this.urlpattern = urlpattern;
}
public ServletMappingModel() {
// TODO Auto-generated constructor stub
}
}
WebAppModel:
package com.whw.sl;
import java.util.HashMap;
import java.util.Map;
public class WebAppModel {
Map<String , WebAppModel> map=new HashMap<>();
public void push(WebAppModel w){
if(w instanceof ServletModel) {//判断w是不是ServletModel的实类
map.put(((ServletModel)w).getServletname(), (ServletModel)w);
}
if(w instanceof ServletMappingModel) {//判断w是不是ServletMappingModel的实类
map.put(((ServletMappingModel)w).getUrlpattern(), (ServletMappingModel)w);
}
}
public WebAppModel pop(String name) {
return map.get(name);
}
}
工厂类如下:
package com.whw.sl;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class WebAppModelFactory {
public WebAppModel build() throws DocumentException {
return build("web.xml");
}
private WebAppModel build(String path) throws DocumentException {
//得到文件输入流
InputStream in = WebAppModelFactory.class.getResourceAsStream(path);
//解析器
SAXReader sr=new SAXReader();
Document dom = sr.read(in);
//定义WebappModel 容器
WebAppModel w=new WebAppModel();
List<Element> servletent = dom.selectNodes("/web-app/servlet");
for (Element element : servletent) {
//赋值
ServletModel ser=new ServletModel();
ser.setServletcalss(element.selectSingleNode("servlet-class").getText());
ser.setServletname(element.selectSingleNode("servlet-name").getText());
w.push(ser);
}
List<Element> servletmapping = dom.selectNodes("/web-app/servlet-mapping");
for (Element element : servletmapping) {
//赋值
ServletMappingModel sermin=new ServletMappingModel();
sermin.setServletname(element.selectSingleNode("servlet-name").getText());
sermin.setUrlpattern(element.selectSingleNode("url-pattern").getText());
w.push(sermin);
}
return w;
}
}
2.通过url-pattern读取的servlet-class的值
测试类:
package com.whw.sl;
import org.dom4j.DocumentException;
public class Text {
public static void main(String[] args) throws DocumentException {
WebAppModel w=new WebAppModelFactory().build();
/**
* 拿到ServletMappingDodel 类
* 再通过ServletMappingDodel类 的 servletname属性
* 拿ServletDodel类的servletcalss 属性
*/
ServletMappingModel pop = (ServletMappingModel) w.pop("/jrebelServlet2");
ServletModel pop2 = (ServletModel) w.pop(pop.getServletname());
System.out.println(pop2.getServletcalss());
}
}
运行结果:
到这里就结束了,有不对或补充欢迎大家评论,谢谢