template渲染和str+=有什么区别

 我来答
兄弟连教育
2016-07-05 · 百度知道合伙人官方认证企业
兄弟连教育
兄弟连教育成立于2006年,11年来专注IT职业教育,是国内专业的IT技术培训学校。2016年成功挂牌新三板(股票代码:839467)市值过亿。开设专注程序员培训专注php、Java、UI、云计算、Python、HTML5、
向TA提问
展开全部
  工作中我们经常会遇到这样的需求:
  1.发送一段消息并在web前端展示(例如工作台就是一个很好的场景)
  
  solution 1:
  
  
  Java代码
  String message="xx";
  sender.send(message);
  
  这个方法第一个硬伤,如果xx包含中文或者其他字符呢?
  前端看到的内容可能会出现乱码。
  
  第二个问题,如果message内容更很长,代码的可读性就变得很差了。
  
  solution 2:
  
  Java代码
  String message=MessageResultCode.SHORT_MESSAGE.getMessage();
  sender.send(message);
  既然有中文的问题,我们就使用配置文件,ResultCode可以帮助我们解决这个问题,虽然如果内容长了配置文件
  会有些难看,但也还可以接受。甚至如果内容含有样式,链接,等等,我们也可以通过CDATA来解决。
  
  这个方法暂时看起来不错,不过pd似乎不让我们这么容易的完成任务。“那么我想在消息里显示下链路信息,比如链路名”。这个需求很合理,但是我们的solution 2似乎办不到。
  
  solution 3:
  
  我们知道webx3使用了velocity作为模板渲染引擎,所以何不把消息像velocity模板一样的渲染出来
  
  
  Java代码
  String template="message.vm";
  TemplateContext context = new MappedTemplateContext();
  context.put("link", link);
  context.put("chain", chain);
  //merge模板
  String message = templateService.getText(template, context);
  sender.send(message);
  代码其实很简单,新建一个模板,把所有变量放到context中去,再使用templateService渲染出来。
  我们看看供应链服务一个任务模板的例子:
  
  请审核供应链<a href="$!{link}">[$!{chain.name}]</a>编号[$!{chain.id}]-商家[$!{chain.supplierName}]-商品[$!{chain.productTitle}]

那么template路径到底怎么指定呢?这是一个问题。在回答这个问题之前我们看看templateService是如何配置的
  
  
  Java代码
  <services:template xmlns="http://www.alibaba.com/schema/services/template/engines" searchExtensions="true">
  <velocity-engine templateEncoding="UTF-8" strictReference="false" path="/templates/${component}">
  <global-macros>
  <name>macros.vm</name>
  </global-macros>
  <plugins>
  <vm-plugins:fasttext-support />
  <vm-plugins:renderable-support />
  </plugins>
  </velocity-engine>
  </services:template>
  
  事实上templateService 在渲染vm模板的时候使用velocity引擎来完成的
  我们看看templateService实现类的这个方法
  
  Java代码
  private boolean findTemplateInTemplateEngine(TemplateMatcher matcher) {
  TemplateEngine engine = getTemplateEngine(matcher.getExtension());
  
  matcher.setEngine(engine);
  
  if (engine == null) {
  return false;
  }
  
  String templateName = matcher.getTemplateName();
  
  getLogger().trace("Searching for template \"{}\" using {}", templateName, engine);
  
  return engine.exists(templateName);
  }
  
  所以路径如何设置取决 于TemplateEngine 的path参数。我们看到path="/templates/${component}",${component}这个变量是webx3
  给每个子容器的名字,例如供应链服务叫chain。我们看下pipeline的配置
  
  
  Java代码
  <when>
  <pl-conditions:target-extension-condition extension="null, vm, jsp" />
  <performAction />
  <performTemplateScreen />
  <renderTemplate />
  </when>
  
  renderTemplate这个valve也是使用templateService来渲染模板。
  例如输入的模板名叫screen/detail.vm
  那么 templateService就会找/template/chain/screen/detail.vm这个文件。
  webx3的资源加载使用ResourceLoadingService
  而由于resources.xml文件里有如下配置
  
  
  Java代码
  <resource pattern="/templates">
  <res-loaders:file-loader basedir="${alibaba_lp_lpscm_templates}" />
  </resource>
  
  
  因此这个地址也就变成了${alibaba_lp_lpscm_templates}/template/chain/screen/detail.vm,
  ${alibaba_lp_lpscm_templates}是我们antx文件里配置的模板路径。
  这个工作原理适用于web层的东西,biz层使用templateService稍微有点区别,
  因为biz层使用了root容器的templateService因此,$component 的值取决于这段配置
  
  
  
  Java代码
  <services:property-placeholder>
  <services:property key="component">common</services:property>
  </services:property-placeholder>
  因此刚刚那个例子,我们需要把文件放在 ${alibaba_lp_lpscm_templates}/template/common/message.vm.
  当然你也可以修改配置以改变模板的位置,例如把common改成message
  
  
  Java代码
  <services:property-placeholder>
  <services:property key="component">message</services:property>
  </services:property-placeholder>
  
  那么文件需要放在 ${alibaba_lp_lpscm_templates}/template/mesage/message.vm.
网易云信
2023-12-06 广告
UIkit是一套轻量级、模块化且易于使用的开源UI组件库,由YOOtheme团队开发。它提供了丰富的界面元素,包括按钮、表单、表格、对话框、滑块、下拉菜单、选项卡等等,适用于各种类型的网站和应用程序。UIkit还支持响应式设计,可以根据不同... 点击进入详情页
本回答由网易云信提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式