标签: velocity

Char []到Byte []用于web中的输出优化(java)

我只是在一个来自infoq的经历分享演示中找到.它声称如果你将字符串转换为servlet中的byte [],它将增加QPS(每秒查询数?).代码示例显示了比较:

之前

private static String content = “…94k…”;
protected doGet(…){
response.getWrite().print(content);
}
Run Code Online (Sandbox Code Playgroud)

private static String content = “…94k…”;
Private static byte[] bytes = content.getBytes();
protected doGet(…){
response.getOutputStream().write(bytes);
}
Run Code Online (Sandbox Code Playgroud)

结果之前

  • 页面大小(K)94
  • 最大QPS 1800

结果之后

  • 页面大小(K)94
  • 最大QPS 3500

谁能解释为什么它被优化了?我相信这是真的.

UPDATE

如果我引起任何误导.我需要解释原始演示文稿仅以此为例.他们实际上通过这种方式重构速度引擎.BUt这个源代码有点长.

实际上在演示文稿中并没有暗示他们如何详细地做到这一点.但我发现了一些领先优势.

在ASTText.java中,他们缓存了byte [] ctext而不是char [] ctext,这大大提升了性能〜!

就像上面的方式一样.这很有道理,对吧?

(但是他们肯定也应该重构Node接口.Writer不能写byte [].这意味着使用OutputStream代替!)

正如Perception所建议的那样,Write最终委托给StreamEncoder.而StreamEncoder写入将首先将char []更改为byte [].然后将其委托给OutputSteam进行实际写入.您可以轻松参考源代码并进行验证.考虑到每次显示页面时都会调用render方法,节省的成本将相当可观.

StreamEncoder.class

 public class ASTText extends SimpleNode {
            private char[] ctext;
        /**
         * @param id
         */
        public ASTText(int id) {
            super (id);
        }

        /**
         * @param p
         * …
Run Code Online (Sandbox Code Playgroud)

java arrays performance velocity bytearray

1
推荐指数
1
解决办法
509
查看次数

Velocity(VM)模板请求参数:获取GET变量

如何访问VM模板中URI中传递的GET变量?

这仅在加载小部件URL时有效:

$request.get("parameters").get("fav").get(0)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个可以使用友好URL的简洁解决方案.

这是我的测试模板:

<br><br><br>
#set($url = $request.attributes.CURRENT_URL)

<h2>url: $url</h2>

#set($favs = $url.split("fav="))
favs: $favs<br>
favs.size(): $favs.size() <br>
#if($favs.size() > 1)
  #set($fav1 = $favs.get(1).split("&").get(0))
  fav1: $fav1<br>
#else
  No fav!
#end
#if($favs.size() > 2)
  #set($fav2 = $favs.get(2).split("&").get(0))
  fav2: $fav2<br>
#end

#set($favs2 = $httpUtil.getParameterMap($url, "fav"))
favs2: $favs2

<hr>
<h3>Fav?</h3>
<form method="get">
  <input type="checkbox" name="fav" value="dave"/> Dave<br>
  <input type="checkbox" name="fav" value="nate"/> Nate<br>
  <input type="checkbox" name="fav" value="taylor"/> Taylor<br>
  <input type="submit" value="Send"/>
</form>
<hr>
<div style="font-size: 9px;">request: $request</div>
Run Code Online (Sandbox Code Playgroud)

velocity vtl liferay liferay-velocity

1
推荐指数
1
解决办法
2万
查看次数

使用Classpath找不到速度模板

当我切换到"classpath"资源加载器时,我似乎无法访问我的速度模板.我已经尝试将模板目录放在/ WEB-INF/classes/templates,/ WEB-INF/templates上,在/ WEB-INF/lib中创建templates.jar.他们都没有工作.有任何想法吗?这些文件的权限都是正确的.

Properties p = new Properties();
p.setProperty("runtime.log.logsystem.class", "org.apache.velocity.tools.generic.log.CommonsLogLogSystem");

/*
// Works fine:
p.setProperty(RuntimeConstants.RESOURCE_LOADER, "file");
p.setProperty("file.resource.loader.path", "/path/to/templates");
*/

// Cannot find template with this:
p.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
p.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
p.setProperty("resourceLoaderPath", "/WEB-INF/classes/templates");

org.apache.velocity.app.Velocity.init(p);

template = org.apache.velocity.app.Velocity.getTemplate("confirmation_html.vm");
Run Code Online (Sandbox Code Playgroud)

java velocity

1
推荐指数
1
解决办法
7947
查看次数

新结构字段不为空

我正在通过为结构添加新字段来更改我的liferay速度模板.例如'heading1'然后将这个新字段添加到模板:

<h1>Heading is: $heading1.data</h1>
Run Code Online (Sandbox Code Playgroud)

但如果结构领域尚未填补,结果是:

标题是:$ heading1.data

所以我想我可以解决这个问题:

#if($heading1.data!="")<h1>Heading is: $heading1.data</h1>#end
Run Code Online (Sandbox Code Playgroud)

但结果仍然是:

标题是:$ heading1.data

如果我打开网页内容并发布它然后结果是正确的,它没有显示任何内容,但我不想找到每个类似的网页内容并开始手动发布.

那么有没有办法检查标题是否未填充?

谢谢.

velocity liferay-6 liferay-velocity

1
推荐指数
1
解决办法
1423
查看次数

对于Velocity中的循环

我想在Velocity视图中使用for循环.我想在速度视图中取一个计数器变量并循环直到它等于.例如

counter = 3
for(i=0; i< counter; i++){

...

}
Run Code Online (Sandbox Code Playgroud)

java velocity

1
推荐指数
1
解决办法
1599
查看次数

如何转义Velocity模板的所有输入

我们正在使用Apache Velocity生成HTML,我想将自己的转义添加到我们模板的所有输入中 - 而无需更改我们的模板.速度似乎相当可扩展,但我很难找到绕框架的方法.

你知道是否有一些简单的方法来逃避输入而不改变我的所有模板?

html java velocity escaping

1
推荐指数
1
解决办法
1498
查看次数

将Integer转换为Long in Velocity

它打印相关的类作为java.lang.Longjava.lang.String不转换.请帮忙解决这个问题.

有没有其他简单的方法来做到这一点.

在Java文件中设置

resolver.setAttirbutes("Long",Long.class);
resolver.setAttirbutes("String",String.class);
Run Code Online (Sandbox Code Playgroud)

在VM文件中转换

$Long.parseLong($String.valueOf(2))
Run Code Online (Sandbox Code Playgroud)

java velocity

1
推荐指数
1
解决办法
3520
查看次数

在IF语句中结合多个AND / OR的Apache Velocity

我对在if语句中处理多个和/或语句感到困惑。我希望有人可以帮助我解决这个问题。Velocity参考指南似乎没有解决我想要做的事情。

我正在使用将要使用公共字段的应用程序。我必须使用名称映射公共字段中的ID。我的if语句有两个部分。我首先有一个OR操作数来处理一个字段的两个值。然后,我还有另一个必须结合AND语句的组件。

这是我目前拥有的:

      #if ($!myid == '21' && $!mytechno == 161)
      <B>Technologist:</B>&nbsp;$!MytechData<BR><BR>
      <B>Tech2</B>&nbsp;John Smith
      #elseif ($!myid == '21' && $!mytechno == 162)
      <B>Technologist:</B>&nbsp;$!MytechData<BR><BR>
      <B>Tech2</B>&nbsp;Mickey Mouse
      #elseif ($!myid == '21' && $!mytechno == 164)
      <B>Technologist:</B>&nbsp;$!MytechData<BR><BR>
      <B>Tech2</B>&nbsp;Jean Jones)
      #else<B>Technologist:</B>&nbsp;$!MytechData

      #end
      #end
Run Code Online (Sandbox Code Playgroud)

因此,到目前为止,此操作正常。基本上,我正在检查myID的值,并确保必须存在mytechno。这样,它将填充我正在引用的Tech2字段。

尽管这一切都很好,但我需要添加另一个myid值。假设myID的值为10。

    #if ($!myid == '21' || $myid='10' && $!mytechno == 161)
      <B>Technologist:</B>&nbsp;$!MytechData<BR><BR>
      <B>Tech2</B>&nbsp;John Smith
      #elseif ($!myid == '21' || $myid='10' && $!mytechno == 162)
      <B>Technologist:</B>&nbsp;$!MytechData<BR><BR>
      <B>Tech2</B>&nbsp;Mickey Mouse
      #elseif ($!myid == '21 || $myid='10'' && $!mytechno == 164)
      <B>Technologist:</B>&nbsp;$!MytechData<BR><BR>
      <B>Tech2</B>&nbsp;Jean Jones) …
Run Code Online (Sandbox Code Playgroud)

velocity

1
推荐指数
1
解决办法
9068
查看次数

摩卡测试不等待发布/订阅

使用Mocha + Velocity(0.5.3)进行Meteor客户端集成测试.我们假设我安装了自动发布包.

问题

如果从服务器插入MongoDB上的文档,则客户端mocha测试将不会等待订阅同步,从而导致断言失败.

代码示例

服务器端Accounts.onCreateUser钩子:

Accounts.onCreateUser(function (options, user) {
  Profiles.insert({
    'userId': user._id,
    'profileName': options.username
  });

  return user;
});
Run Code Online (Sandbox Code Playgroud)

客户端摩卡测试:

beforeEach(function (done) {
  Accounts.createUser({
    'username'  : 'cucumber',
    'email'     : 'cucumber@cucumber.com',
    'password'  : 'cucumber' //encrypted automatically
  });

  Meteor.loginWithPassword('cucumber@cucumber.com', 'cucumber');
  Meteor.flush();
  done();
});

describe("Profile", function () {

  it("is created already when user sign up", function(){
    chai.assert.equal(Profiles.find({}).count(), 1);
  });

});
Run Code Online (Sandbox Code Playgroud)

我怎么能让Mocha等待我的个人资料文件进入客户端,避免Mocha超时(从服务器创建)?

javascript testing velocity mocha.js meteor

1
推荐指数
1
解决办法
276
查看次数

速度模板子字符串问题

我在提取速度中的子字符串时遇到问题。我拥有的字符串是1M / 1Y(这里是可变字符串),我需要提取1M和1Y。最好的方法是什么?

#set($index=$string.index('/'))
#set($val=$string.substring($index,index+2))
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

java velocity

1
推荐指数
1
解决办法
7338
查看次数