XML建模

博客介绍了将指定xml字符串当作对象操作的建模方法。先分析需建模文件中的对象、行为和属性,从里到外定义对象,用工厂模式解析xml生产指定对象。好处是提高代码复用性,还给出了具体xml文件建模案例。

建模的由来

  • 就是将指定的xml字符串当作对象来操作
  • 如果说当对一个指定的xml格式字符串完成了建模操作
  • 好处在于,只需要调用指定的方法就可以完成预定的字符串获取

建模的思路

  1. 分析需要被建模的文件中有那几个对象
  2. 每个对象拥有的行为以及属性
  3. 定义对象从小到大(从里到外)
  4. 通过23种的设计模式中的工厂模式,解析xml生产出指定对象
好处:

提高代码的复用性

建模

先建立一个xml文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<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" />
 </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.javaConfigModel.javaForwardModel.java)
在这里插入图片描述

编写对象代码(从里到外)

分析xml文件(结合从内到外,分析得出,先写forward再写action再到config)

ForwardModel.java 代码如下:

package com.dhj.model;
public class ForwardModel {
 private String name;
 private String path;
 private boolean redirect = true;
 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.java 代码如下:

package com.dhj.model;
import java.util.HashMap;
import java.util.Map;
public class ActionModel {
/**
 * 第一步定义属性  path  type
 */
 private String path;
 private String type;
 /**
  * 有增加和查询
  */
 private  Map<String, ForwardModel> fMap =new HashMap<>();
 /**
  * 压栈 类似于增加
  * 增加一个ForwardModel对象进去
  */
 public void push(ForwardModel forwardModel) {
  fMap.put(forwardModel.getName(), forwardModel);
 }
 /**
  * 弹栈 类似于查询
  * @param name 根据name属性查询forward
  * @return
  */
 public ForwardModel pop(String name) {
  return fMap.get(name);
 }
 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;
 }
}

ConfigModel.java 代码如下:

package com.dhj.model;
import java.util.HashMap;
import java.util.Map;
public class ConfigModel {
/**
 * 增加和查询
 */
 private Map<String, ActionModel> aMap=new HashMap<>();
 /**
  * 压栈 类似于增加
  * 增加一个ActionModel对象进去
  */
 public void push(ActionModel actionModel) {
  aMap.put(actionModel.getPath(), actionModel);
 }
 /**
  * 弹栈 类似于查询
  * @param name 根据name属性查询Action
  * @return
  */
 public ActionModel pop(String name) {
  return aMap.get(name);
 }
}

创建实例,并测试。代码如下:

package com.dhj.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;
/**
 * JAVA中有23种设计模式
 * 而建模使用的是其中的工厂模式
 * @author 10237
 *
 */
public class ConfigModelFactory {
/**
 * 默认资源文件mvc.xml是放在建模类的同包下
 * @throws Exception 
 */
 public static ConfigModel build() throws Exception {
 return build("mvc.xml"); 
 }
 public static ConfigModel build(String path) throws Exception {
  ConfigModel configModel=new ConfigModel();
  ActionModel actionModel=null;
  ForwardModel forwardModel=null;
    InputStream in = ConfigModelFactory.class.getResourceAsStream(path);//得到对应的流
    SAXReader reader=new SAXReader();
    Document doc = reader.read(in);//抛出异常
    List<Element> actionEles = doc.selectNodes("config/action");
    for (Element action : actionEles) {
     actionModel = new ActionModel();
     //第一步先个actionModel填充数据(加数据)
     actionModel.setPath(action.attributeValue("path"));
     actionModel.setType(action.attributeValue("Type"));
     List<Element> forwardEles=action.selectNodes("forward");
     for (Element forward : forwardEles) {
      forwardModel =new ForwardModel();
      //第一步先个forwardModel填充数据(加数据)
      forwardModel.setName(forward.attributeValue("name"));
      forwardModel.setPath(forward.attributeValue("path"));
      forwardModel.setRedirect(!"false".equals(forward.attributeValue("redirect")));
      actionModel.push(forwardModel);//把forwardModel加到ActionModel里面
  }
     configModel.push(actionModel);//把actionModel加到configModel里面
 }
  return configModel;
 }
 //测试是否成功
//测试是否成功
 public static void main(String[] args) throws Exception {
  ConfigModel configModel = ConfigModelFactory.build();
  ActionModel actionModel = configModel.pop("/loginAction");
  System.out.println(actionModel.getType());
  System.out.println(actionModel.pop("success").getPath());
 }
}

运行结果:
在这里插入图片描述

案例:

对(web.xml)文件进行建模。
文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
   <servlet-name>jrebelServlet</servlet-name>
   <servlet-class>com.dhj.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.dhj.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 将servlet-class标签封装成对象

代码如下:

   package com.dhj.work;   
      public class ServletClassModel {   
         private String context;    
           public String getContext() {     
             return context;    
               }      
               public void setContext(String context) {  
                    this.context = context;      }   
                      } 
                        }
ServletModel 将servlet标签封装成对象
package com.dhj.work;
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;
 }
}
ServletMappingModel 将servlet-mapping标签封装成对象
package com.dhj.work;
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;
 }
}
WebAppModel 将web-app标签封装成对象
 package com.dhj.work; 
 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;
 }
}
UrlPatternModel 将url-pattern标签封装成对象
package com.dhj.work;
public class UrlPatternModel {
 private String context;
 public String getContext() {
  return context;
 }
 public void setContext(String context) {
  this.context = context;
 }
}
ServletNameModel 将servlet-name标签封装成对象
package com.dhj.work;
public class ServletNameModel {
 private String context;
 public String getContext() {
  return context;
 }
 public void setContext(String context) {
  this.context = context;
 }
}
WebAppModelFactory 实行工厂模式对web.xml进行建模
package com.dhj.work;
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;
/**
 * WebAppModelFactory 实行工厂模式对web.xml进行建模
 * @author 10237
 *
 */
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);
 }
}

运行结果:在这里插入图片描述

【源码免费下载链接】:https://renmaiwang.cn/s/gxrh8 该系统采用PHP开发,功能定位为在线视频平台,并专为电影网站搭建与管理而设计。其核心优势在于具备数据采集能力,能够自动生成来自网络的影视资源链接,从而帮助用户快速构建内容库并减少手动上传工作量。在系统架构中,包含多个关键组件:配置文件(.htaccess)用于定义URL重写规则;Apache服务器配置文件(.htaccess)可能支持SEO优化、隐藏真实路径或实现目录保护等功能;IIS服务器配置文件(httpd.ini)包含了PHP配置信息、站点设置及权限管理等数据;入口文件(index.php)负责处理用户请求并展示首页内容,同时支持用户登录操作;安装脚本(install.php)引导数据库连接设置、权限验证和初始数据导入过程;后台管理界面(admin.php)允许管理员完成对网站的各种控制与维护;系统介绍文档(system-intro.txt)详细描述了系统的功能特性及其适用场景;安装说明文件(install-manual.txt)提供完整的部署步骤及注意事项;合作邀请文件(invite-partners.txt)旨在吸引合作伙伴共同推广或定制该平台;HTML模板文件位于/HMPL子目录中,用于构建网站前端页面;运行时临时文件存放于/Runtime目录内,管理日志、缓存和会话数据等。这些组件协同运作,形成一个功能完善且易于管理的在线视频平台系统,在合理配置下,用户可快速搭建包含电影推荐、分类、搜索与评论等功能的网站,并通过数据采集维持内容更新。对于希望进入在线视频领域的企业或个人来说,这是一份值得考虑的选择方案。
项目资源包含:可运行源码+sql文件+LW; python3.8+django+mysql5.7+html 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 本研究将应用Python编程语言进行数据处理和深度学习模型的建立,结合MySQL数据库存储数据,以及采用Django框架构建用户友好的Web应用界面,为用户提供便捷操作体验。深度学习方法将是本研究的核心技术,利用卷积神经网络(CNN)等模型来实现对手写文字的特征抽取和识别,从而提高系统的识别准确度和稳定性。同时,引入光学字符识别(OCR)技术对文本进行处理,进一步优化手写文字的识别过程,提升整个系统的效率和可靠性。 管理员功能需求主要包括密码修改、手写字识别、手写数字识别和识别日志信息统计功能,以提供更方便、高效的管理和监控服务。 系统将采用深度学习技术实现图像文字识别功能,通过训练模型和使用预训练模型,能够准确识别上传图像中的文字信息。深度学习模型将会通过对大量样本数据的学习和训练,掌握各种字体、大小和颜色的特征,以提高识别准确性。在文字识别过程中,系统将进行错误处理和结果记录。当发生识别错误或未能识别的情况时,系统会将相关信息进行记录,并生成日志文件,便于管理员进行问题分析和修复。为了提高系统的性能和稳定性,采用异步任务队列来处理识别请求,将请求和响应分离,减少延迟时间,提升系统的并发处理能力。
【源码免费下载链接】:https://renmaiwang.cn/s/2s69k IT 行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰,但是,我们要清楚:淘汰的永远只是那些初级水平的从业者,过硬技术的从业者永远都是稀缺的。因此对于学习,我们还是要踏踏实实的。 自学 Python ,也是一样,不要一开始因为头脑发热就不停地收藏各种资料网站,购买各种书籍,下载了大量的教学视频,过了几天,学习的热情开始褪去,再过几个星期,终于完成了学习课程 —— 《从入门到放弃》。所以,学习 Python 需要一步一个脚印,踏踏实实地学。 FQ 在讲 Python 如何入门之前,个人建议最好每个人都有自己的 FQ 工具,多使用 Google 搜索,多去看一下墙外的世界,多看 上的开源项目。 至于如何 FQ ,这里提供一下我用过的工具:FQ工具集 Python 学习资源集 相信很多人学习某门编程语言的时候,都会找各种学习资料。说句实话,资料太多,反而没用,根据自己的学习习惯,个人能力选择一门资源坚持学就好了。 因为每个人的需求不同,这里整理了一批 Python 比较好的学习资料: Python 博客网站资源 还有一些有趣的网站: 一个可以看执行过程的网站 Python 入门 对于入门,主要是掌握基本的语法和熟悉编程规范,因此大部分的教程基本一致的,所以还是建议选好适合自己的一个教程,坚持学下去。 在 Python 入门中,本人编写了一系列的 《草根学 Python 》 文章, 是基于 Python 3.6 写的 Python 入门系列教程,为了更好的阅读,把它整理在 GitBook 上,希望对各位入门 Python 有所帮助。 注:2018 年 02 月 27 日,基础知识入门部分已经完成了的。因近期读者反映有些图片没法打开了(之前图片放在七牛云,用的是临时链接,最
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值