~~~~~

一、XML建模
1、什么叫XML建模
? ? ? 将XML配置文件中的元素、属性、文本信息转换成对象的过程叫做XML建模;
2、建模的思路
(1)、分析需要被建模的文件中有那几个对象;
(2)、每个对象拥有的行为以及属性;
(3)、定义对象从小到大(从里到外);
(4)、利用工厂模式+dom4j+xpath解析Xml配置文件;
3、建模的好处
? ? ? 提高代码的复用性
4、建模
(1)、以面向对象的编程思想,描述xml资源文件;
(2)、将xml文件中内容封装进model实体对象。
二、案例
建模解析? 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标签:可以包含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>
思路:
首先我们来分析它的属性和对象,最大的对象是config,然后它里面有action,action属性有path、type;action里面还有forward,forward属性有name、path、redirect;所以得出我们要建三个,最后我们再用config来建一个工厂,来达到解析所有对象的属性.。
记住是从里到外(ForwardModel——ActionModel——ConfigModel—ConfigModelFactory)
①、ForwardModel
package com.mwy.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.mwy.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 forwardModel) {
fMap.put(forwardModel.getName(), forwardModel);
}
//弹栈
public ForwardModel pop(String name) {
return fMap.get(name);
}
}
③、ConfigModel
public class ConfigModel {
private Map<String, ActionModel> acMap=new HashMap<>();
//压栈
public void push(ActionModel actionModel) {
acMap.put(actionModel.getPath(), actionModel);
}
//弹栈
public ActionModel pop(String path) {
return acMap.get(path);
}
}
④、ConfigModelFactory
package com.mwy.model;
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;
/**
* 建模的思路:
* 1、将原有的config.xml进行解析
* 2、对应标签的内容,将其封装赋值给相对应的对象
* forWord标签值,赋值给ForwordModel对象
* action标签值,赋值给ActionModel对象
* config标签值,赋值给ConfigModel对象
*/
public class ConfigModelFactory {
public static ConfigModel build() throws DocumentException {
return build("config.xml");
}
public static ConfigModel build(String string) throws DocumentException {
InputStream in = ConfigModelFactory.class.getResourceAsStream(string);
SAXReader sax=new SAXReader();
Document doc = sax.read(in);
ConfigModel config=new ConfigModel();
//ActionModel
List<Element> actionEles = doc.selectNodes("/config/action");
for (Element actionEl : actionEles) {
ActionModel action=new ActionModel();
//将xml文件解析得来的pash值赋值给actionModel对象中的path属性
action.setPath(actionEl.attributeValue("path"));
action.setType(actionEl.attributeValue("type"));
//ForwordModel
List<Element> forwardEles = actionEl.selectNodes("forward");
for (Element forwardEl : forwardEles) {
ForwardModel forward=new ForwardModel();
forward.setName(forwardEl.attributeValue("name"));
forward.setPath(forwardEl.attributeValue("path"));
//Redirect只有在配置文件中赋值false的时候,代表转发,其他代表重定向
forward.setRedirect(!"false".equals(forwardEl.attributeValue("redirect")));
action.push(forward);
}
config.push(action);
}
return config;
}
}
问题:获得第二个action中的type的值;
public static void main(String[] args) throws Exception {
//此时ConfigModel对象里面没有xml内容
//ConfigModel configModel=new ConfigModel();
ConfigModel config=ConfigModelFactory.build();
//2、获得第二个action中的type的值
ActionModel action=config.pop("/loginAction");
System.out.println(action.getType());
}
结果

三、问题:
1、对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>
新建

从里到外
①、Servlet_classModel、Servlet_nameModel、Url_patternModel:内容是一样的
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
②、ServletModel?
package com.mwy.model.zy;
public class ServletModel {
private Servlet_nameModel sname;
private Servlet_classModel sclass;
public Servlet_nameModel getSname() {
return sname;
}
public void setSname(Servlet_nameModel sname) {
this.sname = sname;
}
public Servlet_classModel getSclass() {
return sclass;
}
public void setSclass(Servlet_classModel sclass) {
this.sclass = sclass;
}
}
③、Servlet_mappingModel?
public class Servlet_mappingModel {
private Servlet_nameModel sname;
private List<Url_patternModel> upattern=new ArrayList<Url_patternModel>();
public Servlet_nameModel getSname() {
return sname;
}
public void setSname(Servlet_nameModel sname) {
this.sname = sname;
}
public void push(Url_patternModel url_pattern) {
upattern.add(url_pattern);
}
public List<Url_patternModel> pop() {
return upattern;
}
}
④、Web_appModel?
public class Web_appModel {
private List<ServletModel> servletm=new ArrayList<>();
private List<Servlet_mappingModel> mappingm=new ArrayList<>();
public void push(ServletModel servletModel) {
servletm.add(servletModel);
}
public void push1(Servlet_mappingModel servlet_mappingModel) {
mappingm.add(servlet_mappingModel);
}
public List<ServletModel> pops() {
return servletm;
}
public List<Servlet_mappingModel> popm() {
return mappingm;
}
}
⑤、Web_appModelFactory工厂类
public class Web_appModelFactory {
public static Web_appModel build() throws DocumentException {
return build("web.xml");
}
private static Web_appModel build(String string) throws DocumentException {
InputStream in = Web_appModel.class.getResourceAsStream(string);
SAXReader sax=new SAXReader();
Document doc = sax.read(in);
//将servlet的标签内容填充进web-app
Web_appModel app=new Web_appModel();
//SelectModel
List<Element> servletEles = doc.selectNodes("/web-app/servlet");
for (Element servletEl : servletEles) {
ServletModel servlet=new ServletModel();
//selectSingleNode获得对应节点对象,返回单个元素对象
//获取到servlet-name,servlet-class模型
Element servletName = (Element)servletEl.selectSingleNode("servlet-name");
Element servletClass = (Element)servletEl.selectSingleNode("servlet-class");
//Servlet_nameModel
Servlet_nameModel sname=new Servlet_nameModel();
sname.setValue(servletName.getText());
//Servlet_classModel
Servlet_classModel sclass=new Servlet_classModel();
sclass.setValue(servletClass.getText());
//将servlet-name,servlet-class填进servlet中
servlet.setSname(sname);
servlet.setSclass(sclass);
//将servlet填进web-app
app.push(servlet);
}
//将servlet-mapping的标签内容填充进web-app
List<Element> servletmappEles = doc.selectNodes("/web-app/servlet-mapping");
for (Element servletmappEl : servletmappEles) {
Servlet_mappingModel Servlet_mapping=new Servlet_mappingModel();
//得到servlet-name,url-pattern标签
//selectSingleNode获得对应节点对象,返回单个元素对象
Element servletName = (Element)servletmappEl.selectSingleNode("servlet-name");
Servlet_nameModel sname=new Servlet_nameModel();
sname.setValue(servletName.getText());
Servlet_mapping.setSname(sname);
//Url_patternModel
List<Element> upatternEles = servletmappEl.selectNodes("url-pattern");
//遍历
for (Element upatternEl : upatternEles) {
Url_patternModel pattern=new Url_patternModel();
pattern.setValue(upatternEl.getText());
Servlet_mapping.push(pattern);
}
//将servlet-mapping填进web-app中
app.push1(Servlet_mapping);
}
return app;
}
}
?2、通过url-pattern读取到servlet-class的值
/**
* 通过浏览器输入的网址自动找到对应的后台处理类
* @param webAppModel 建模后的实体类
* @param url 浏览器访问的网址
* @return
*/
public static String getServletClassByUrl(Web_appModel app, String url) {
String servletClass = "";
// 找到浏览器网址对应的servlet-name
String servletName = "";
List<Servlet_mappingModel> mapping = app.popm();
for (Servlet_mappingModel servletMappingModel : mapping) {
List<Url_patternModel> upatternp = servletMappingModel.pop();
for (Url_patternModel upm : upatternp) {
if(url.equals(upm.getValue())) {
Servlet_nameModel sname = servletMappingModel.getSname();
servletName = sname.getValue();
}
}
}
// 找到servlet-name对应的后台处理类
List<ServletModel> servletM = app.getServletModels();
for (ServletModel servletModel : servletM) {
Servlet_nameModel sname = servletModel.getSname();
if(servletName.equals(sname.getValue())) {
Servlet_classModel sclass = servletModel.getSclass();
servletClass = sclass.getValue();
}
}
return servletClass;
}
public static void main(String[] args) throws DocumentException {
Web_appModel webAppModel = Web_appModelFactory.build();
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);
}
结果为:

再见!!!
|