我只是在一个来自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)
谁能解释为什么它被优化了?我相信这是真的.
UPDATE
如果我引起任何误导.我需要解释原始演示文稿仅以此为例.他们实际上通过这种方式重构速度引擎.BUt这个源代码有点长.
实际上在演示文稿中并没有暗示他们如何详细地做到这一点.但我发现了一些领先优势.
在ASTText.java中,他们缓存了byte [] ctext而不是char [] ctext,这大大提升了性能〜!
就像上面的方式一样.这很有道理,对吧?
(但是他们肯定也应该重构Node接口.Writer不能写byte [].这意味着使用OutputStream代替!)
正如Perception所建议的那样,Write最终委托给StreamEncoder.而StreamEncoder写入将首先将char []更改为byte [].然后将其委托给OutputSteam进行实际写入.您可以轻松参考源代码并进行验证.考虑到每次显示页面时都会调用render方法,节省的成本将相当可观.
public class ASTText extends SimpleNode {
private char[] ctext;
/**
* @param id
*/
public ASTText(int id) {
super (id);
}
/**
* @param p
* …
Run Code Online (Sandbox Code Playgroud) 如何访问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) 当我切换到"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) 我正在通过为结构添加新字段来更改我的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视图中使用for循环.我想在速度视图中取一个计数器变量并循环直到它等于.例如
counter = 3
for(i=0; i< counter; i++){
...
}
Run Code Online (Sandbox Code Playgroud) 我们正在使用Apache Velocity生成HTML,我想将自己的转义添加到我们模板的所有输入中 - 而无需更改我们的模板.速度似乎相当可扩展,但我很难找到绕框架的方法.
你知道是否有一些简单的方法来逃避输入而不改变我的所有模板?
它打印相关的类作为java.lang.Long
或java.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) 我对在if语句中处理多个和/或语句感到困惑。我希望有人可以帮助我解决这个问题。Velocity参考指南似乎没有解决我想要做的事情。
我正在使用将要使用公共字段的应用程序。我必须使用名称映射公共字段中的ID。我的if语句有两个部分。我首先有一个OR操作数来处理一个字段的两个值。然后,我还有另一个必须结合AND语句的组件。
这是我目前拥有的:
#if ($!myid == '21' && $!mytechno == 161)
<B>Technologist:</B> $!MytechData<BR><BR>
<B>Tech2</B> John Smith
#elseif ($!myid == '21' && $!mytechno == 162)
<B>Technologist:</B> $!MytechData<BR><BR>
<B>Tech2</B> Mickey Mouse
#elseif ($!myid == '21' && $!mytechno == 164)
<B>Technologist:</B> $!MytechData<BR><BR>
<B>Tech2</B> Jean Jones)
#else<B>Technologist:</B> $!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> $!MytechData<BR><BR>
<B>Tech2</B> John Smith
#elseif ($!myid == '21' || $myid='10' && $!mytechno == 162)
<B>Technologist:</B> $!MytechData<BR><BR>
<B>Tech2</B> Mickey Mouse
#elseif ($!myid == '21 || $myid='10'' && $!mytechno == 164)
<B>Technologist:</B> $!MytechData<BR><BR>
<B>Tech2</B> Jean Jones) …
Run Code Online (Sandbox Code Playgroud) 使用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超时(从服务器创建)?
我在提取速度中的子字符串时遇到问题。我拥有的字符串是1M / 1Y(这里是可变字符串),我需要提取1M和1Y。最好的方法是什么?
#set($index=$string.index('/'))
#set($val=$string.substring($index,index+2))
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?