学习目标看一下
1 xml建模
首先,拿一个config.xml文件来为大家讲解一下
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>
首先给大家讲解一下建模的思路,建模是从内到外的方式,这点注意
所以我们从xml文件中可知,内层第一个元素为forward标签,我们给它建一个实体类,说明其中的属性
我们要给每一个节点建立实体类
ForwardModel:
package com.lsy.model;
/**
* 建模方式由内到外
* @author zjjt
*
*/
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:
因为要取到ForwardModel里面的值,所以里面要放一个map集合进行取值
package com.lsy.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:
package com.lsy.model;
import java.util.HashMap;
import java.util.Map;
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);
}
public static void main(String[] args) throws Exception {
//此时ConfigModel对象里面没有xml内容
// ConfigModel configModel=new ConfigModel();
ConfigModel configModel=ConfigModelFactory.build();
ActionModel actionModel = configModel.pop("/loginAction");
System.out.println(actionModel.getType());
ForwardModel forwardModel=actionModel.pop("success");
System.out.println(forwardModel.getPath());
}
}
ConfigModelFactory:
package com.lsy.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;
/**
* 工厂类
* @author zjjt
* 建模的思路:
* 1.将原有的config.xml进行解析
* 2.对应标签的内容,将其封装赋值给相对应的对象
* forward标签值 赋值给ForwardModel对象
* Action标签值 赋值给ActionModel对象
* config标签值 赋值给ConfigModel对象
*/
public class ConfigModelFactory {
public static ConfigModel build() throws Exception {
return build("config.xml");
}
private static ConfigModel build(String resourcepath) throws Exception {
InputStream in = ConfigModelFactory.class.getResourceAsStream(resourcepath);
SAXReader sr=new SAXReader();
Document doc = sr.read(in);
ConfigModel configModel=new ConfigModel();
//获取config下面action节点的值
List<Element> actioneles=doc.selectNodes("/config/action");
for (Element actionEle : actioneles) {
ActionModel actionModel=new ActionModel();
//将xml文件解析得来的path值赋值给actionModel对象中的path属性
actionModel.setPath(actionEle.attributeValue("path"));
actionModel.setType((actionEle.attributeValue("path")));
List<Element> forwardEles=actionEle.selectNodes("forward");
for (Element forwardEle : forwardEles) {
ForwardModel forwardModel=new ForwardModel();
forwardModel.setName(forwardEle.attributeValue("name"));
forwardModel.setPath(forwardEle.attributeValue("path"));
//redirect只有在配置文件中赋值false的时候,代表转发,其他为重定向
forwardModel.setRedirect(!"false".equals(forwardEle.attribute("redirect")));
actionModel.push(forwardModel);
}
configModel.push(actionModel);
}
return configModel;
}
}
二 例题
对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>
这个是web.xml文件
每个类对应一个标签
子节点用list集合表示
package com.lsy.model.work;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.lsy.model.ConfigModel;
public class WebAppModelFactory {
public static Web_AppModel build() throws Exception {
return build("web.xml");
}
private static Web_AppModel build(String xmlPath) throws Exception {
InputStream in = Web_AppModel.class.getResourceAsStream(xmlPath);
SAXReader sax=new SAXReader();
Web_AppModel webAppModel=new Web_AppModel();
Document doc=sax.read(in);
//将servlet标签内容填进webapp
List<Element> servletEles=doc.selectNodes("/web-app/servlet");
for (Element servletEle : servletEles) {
ServletModel servletModel=new ServletModel();
//找到servlet节点下的servlet-name节点
Element servletNameEle=(Element)servletEle.selectSingleNode("servlet-name");
//找到servlet节点下的servlet-class节点
Element servletClassEle=(Element)servletEle.selectSingleNode("servlet-class");
Servlet_NameModel servletNameModel=new Servlet_NameModel();
Servlet_ClassModel servletClassModel=new Servlet_ClassModel();
servletNameModel.setContext(servletNameEle.getText());
servletClassModel.setContext(servletClassEle.getText());
//设置值
servletModel.setServletnameModel(servletNameModel);
servletModel.setServletclassModel(servletClassModel);
webAppModel.push(servletModel);
}
//将servlet-mapping的标签内容填充进webapp
List<Element> servletMappingEles=doc.selectNodes("/web-app/servlet-mapping");
for (Element servletMappingEle : servletMappingEles) {
Servlet_MappingModel servletMappingModel=new Servlet_MappingModel();
//找到servlet-mapping节点下的servlet-name节点
Element servletNameEle=(Element)servletMappingEle.selectSingleNode("servlet-name");
Servlet_NameModel servletNameModel=new Servlet_NameModel();
servletNameModel.setContext(servletNameEle.getText());
servletMappingModel.setServletnameModel(servletNameModel);
//找到servlet-mapping节点下的url-pattern节点
List<Element> urlPatternEles=servletMappingEle.selectNodes("url-pattern");
for (Element urlPatternEle : urlPatternEles) {
Url_PatternModel urlPatternModel=new Url_PatternModel();
urlPatternModel.setContext(urlPatternEle.getText());
servletMappingModel.push(urlPatternModel);
}
webAppModel.pushMappingModel(servletMappingModel);
}
return webAppModel;
}
}
总结:建模要理清思路,建模有23种,工厂模式只是其中一种,先进行解析再进行建模
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/12258.html