自己瞎捉摸学习:十三种设计模式之模板方式设计

模板方式就是将对象分为可变与不可变得部分,就例如spring_mvc中的共有行为和特有行为,将不可变的部分封装起来,提供给需要此类对象操作的用户,然后将再有用户对对可变部分进行自己的进一步处理,就例如springmvc中的特有行为.

目前已用的模板设计模式,

1,JDBCtemplate

  顾名思义,在操作数据库连接池对数据库进行CRUD时,其中的某些步骤的固定不定的,例如注册驱动,获取连接对象等,而JDBCTemplate就是对这些共性进行了封装 我们使用时只需创建此类对象,然后对对象进行可变行为的操作,例如按照不同的需要撰写不同的sql语句,然后再通过JDBC模板获得查询对象

2,Freemarker

  用Java语言写的模板工具,可以用来生成静态页面,对于用户经常访问的页面可以设置为静态页面,减少数据库的访问量,生成时机,当第一次查询数据库时生成

  环境搭建,

     在逻辑层创建属性文件freemarker.properties

out_put_path=D:/ideaProjects/health_parent/health_mobile/src/main/webapp/pages         // 此路径为生成静态页面的路径

    在spring配置文件中配置

        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
          <!--指定字符集-->
          <property name="defaultEncoding" value="UTF-8" />
          </bean>
        <context:property-placeholder location="classpath:freemarker.properties"/>

  在需要生成页面的类中创建路径对象并进行注入

  @Value("${out_put_path}")//从属性文件读取输出目录的路径
  private String outputpath ;

  创建静态页面模板生成方法

  public void generateHtml(String templateName,String htmlPageName,Map<String, Object> dataMap){//三个参数分别为 模板名,生成的静态页面名,注入数据
    Configuration configuration = freeMarkerConfigurer.getConfiguration();
    Writer out = null;
    try {
      // 加载模版文件
      Template template = configuration.getTemplate(templateName);
      // 生成数据
      File docFile = new File(outputpath + "\\" + htmlPageName);
      out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
      // 输出文件
      template.process(dataMap, out);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (null != out) {
          out.flush();
        }
      } catch (Exception e2) {
        e2.printStackTrace();
      }
    }
  }
}

   创建静态页面生成方法  

  //生成静态页面
  public void generateMobileStaticHtml() {
    //准备模板中需要注入的数据,调取本类中的其他方法获取
    List<Setmeal> setmealList = this.findAll();
    //生成单个静态页面方法
    generateMobileSetmealListHtml(setmealList);
    //生成对个静态页面方法
    generateMobileSetmealDetailHtml(setmealList);
  }

  生成单个静态页面方法

  public void generateMobileSetmealListHtml(List<Setmeal> setmealList) { //参数列表为注入数据,由于是单个,里面只有一个页面的所需数据
    Map<String, Object> dataMap = new HashMap<String, Object>();
    dataMap.put("setmealList", setmealList);//将数据存入模板所需的map中
    this.generateHtml("mobile_setmeal.ftl","m_setmeal.html",dataMap);//调用本类中的模板方法
  }

  生成多个静态页面方法

  

  public void generateMobileSetmealDetailHtml(List<Setmeal> setmealList) {
    for (Setmeal setmeal : setmealList) { //由于是多个数据,所以需要遍历
      Map<String, Object> dataMap = new HashMap<String, Object>();
      dataMap.put("setmeal", this.findById(setmeal.getId()));
      this.generateHtml("mobile_setmeal_detail.ftl",
                        "setmeal_detail_"+setmeal.getId()+".html",
                        dataMap);
    }
  }

  最后在需要生成静态页面的方法中调用静态页面生成方法 generateMobileStaticHtm 即可

3 JasperReports

  对IText的一个封装 itext  java中生成pdf模板的工具

  使用步骤

  在指定文件夹内倒入.jrxml的模板文件

  

public Result exportBusinessReport4PDF(HttpServletRequest request, HttpServletResponse response) {
    try {
        Map<String, Object> result = reportService.getBusinessReportData();
?
        //取出返回结果数据,准备将报表数据写入到PDF文件中
        List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");
?
        //动态获取模板文件绝对磁盘路径
        String jrxmlPath =
            request.getSession().getServletContext().getRealPath("template") + File.separator + "health_business3.jrxml";//此路径为模板文件路径
        String jasperPath =
            request.getSession().getServletContext().getRealPath("template") + File.separator + "health_business3.jasper";//此路径为模板文件生成的二进制值文件
        //编译模板
        JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
?
        //填充数据---使用JavaBean数据源方式填充
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath,result,new JRBeanCollectionDataSource(hotSetmeal));
        ServletOutputStream out = response.getOutputStream();
        response.setContentType("application/pdf");//确定输出文件格式
        response.setHeader("content-Disposition", "attachment;filename=report.pdf");
        //输出文件
        JasperExportManager.exportReportToPdfStream(jasperPrint,out);
        return null;
    } catch (Exception e) {
        e.printStackTrace();
        return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
    }
}

  JasperReport工作原理

    

    ,存在一个模板文件本质是一个xml文件

    对其进行编译得到一个二进制的后缀名为jasper的文件,用于代码填充数据

    Jrprint 填充数据后得到的对象,等待输出

    Expoet对象进行输出,可以指定输出的报表为何种格式

    最终获得一个输出了的相应格式文件

.

原文地址:https://www.cnblogs.com/jumpTk/p/12173596.html

时间: 2024-09-29 06:57:44

自己瞎捉摸学习:十三种设计模式之模板方式设计的相关文章

二十三种设计模式——工厂模式

二十三种设计模式--工厂模式 简单工厂模式 简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一. 简单工厂模式是工厂模式最简单使用的模式. 类图: 程序: #include <iostream> #include<string> using namespace std; class NationalFlag//父类 { public: NationalFlag(){} ~NationalFlag(){} virtual void di

二十三种设计模式及其python实现

本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>——吴强 <Python设计模式>——pythontip.com <23种设计模式>——http://www.cnblogs.com/beijiguangyong/ 设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用

[系列汇总] - 二十三种设计模式(持续更新中&hellip;)

摘要 最近在读GOF的Design Patterns: Elements of Reusable Object-Oriented Software(设计模式:可复用面向对象软件的基础),学习前辈们的经验来增加自己的编码设计能力.在学习的过程中,会把我从书上学到的知识以及自己的理解写到这里.一方面能够巩固自己学到的东西同时方便以后的复习,另一方面是希望能够帮助到那些跟我一样不大了解设计模式的人. 我理解的设计模式不是一套固定的代码,更多的是一种设计理念.它能够帮助我们解决特定的设计问题,使我们的程

二十三种设计模式[12] - 代理模式(Proxy Pattern)

前言 代理模式,属于对象结构型模式.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 为其它对象提供一种代理以控制对这个对象的访问 ". 在代理模式中,通常使用一个类来代表另一个类的功能,并由这个代理对象去控制原对象的引用. 结构 Subjuet(公共接口):代理类和被代理类的公共接口,保证任何使用目标的地方都可以被代理类替换: RealSubject(被代理类):代理类所代表的目标类: Proxy(代理类):包含对目标类的引用,目标类的封装: 场景 在日常生活中

二十三种设计模式[17] - 中介者模式(Mediator Pattern)

前言 在开发软件的过程中,我们通常会将类设计的比较单纯,使其复用性更高.但类间的相互引用又使得类本身在没有其他类的支持下不能正常工作,导致其复用性降低.所以为了提高类的复用性我们需要尽可能的减少对其它类的引用,也就是说我们常说的解耦.中介者模式,顾名思义,就是存在一个类似中介的角色,类与类之间不直接交互而是通过中介进行间接的交互,也就意味着类与类之间不需要存在显示的引用,以达到松耦合的目的. 中介者模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为"

二十三种设计模式[20] - 状态模式(State Pattern)

前言 状态模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类 ". 场景 我们都坐过火车,火车可以简单的分为" 开门 "," 关门 "," 运行 "," 停止 "四个状态.火车在这四个状态下分别可以做不同的事情.比如只有在关门时才行运行.只有在停止时才能开门. 我们在开发类似的业务时,往

二十三种设计模式[21] - 策略模式(Strategy Pattern)

前言 策略模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 定义一些列的算法,把它们一个个封装起来,并且使它们可相互替换.使得算法可以独立于使用它的客户而变化 ". 也就是说通过策略模式,我们能够将算法与其调用者分离成相对独立的个体,降低维护成本,使代码更加优雅. 场景 就拿数据的搜索来说,可以简单的分为模糊搜索和精确搜索.在开发这个功能时,可能会写出如下代码. public List<string> Search(stri

二十三种设计模式[23] - 访问者模式(Visitor Pattern)

前言 访问者模式,是一种将数据的结构与其操作分离的类行为型模式.它能够帮助我们解决数据结构稳定但数据操作多变的问题,使我们可以很容易的增加或修改数据的操作. 在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 ". 结构 Visitor(访问者接口):定义了每种元素的访问行为,一般情况下访问行为的个数与元素种类的个数一致: ConcretVisitor(具体访问

二十三种设计模式之:工厂方法模式

工厂方法模式是将工厂类放到一个方法种进行创建,这样既可以实现工厂类的创建,又可以不修改工厂类的代码,从而对功能进行扩展,这样设计的另一个好处是:对代码实现了很好的封装. 例: 创建一个工厂接口 public interface Sender{ public void send(); } 两个工厂实现类 public class MailSender implements Sender{ @Override public void send(){ System.out.println("This