我在Freemarker中遇到以下情况。
返回.ftl中的页面时,我从Java向URL发送了一个参数,类似于Java中的“ AAA%BBB@DDD.COM”,就可以了。
当查看Url时,它会写:“ AAA%25+BBB@DDD.COM”然后输入以下代码:
import React, { Component } from 'react';
import { View } from 'react-native';
import { LoginButton, AccessToken ,GraphRequest, GraphRequestManager} from 'react-native-fbsdk';
export default class Login extends Component {
render() {
return (
<View>
<LoginButton
onLoginFinished={
(error, result) => {
if (error) {
alert("login has error: " + result.error);
} else if (result.isCancelled) {
alert("login is cancelled.");
} else {
AccessToken.getCurrentAccessToken().then(
(data) => {
let accessToken = data.accessToken
alert(accessToken.toString())
const responseInfoCallback = (error, result) => {
if (error) {
console.log(error)
alert('Error fetching data: ' + error.toString());
} else {
console.log(result)
console.log(result.email)
alert('Success fetching data: ' + result.toString());
}
}
const infoRequest = new GraphRequest(
'/me',
{
accessToken: accessToken,
parameters: {
fields: {
string: 'name,email'
}
}
},
responseInfoCallback
);
// Start the graph request.
new GraphRequestManager().addRequest(infoRequest).start()
}
)
}
}
}
onLogoutFinished={() => alert("logout.")}/>
</View>
);
}
}
它的确在我的html字段“ AAA%”中写了,但没有写。
我该如何解决这个问题? 预先感谢。
编辑:经过进一步调查,我确实看到了之前放的代码确实将其写在HTML上:
it.only('Test one ', () => {
expect(x).to.equal(y);
});
it('Test two ', () => {
expect(x).to.equal(y);
});
EDIT2:让我们看看是否能为您提供更多信息,首先是相关的Java代码:
<#if myCase??>
value = ${user}
</#if>
我有一个类似于:mysite.xx?user=AAA%25+BBB@DDD.COM的URL,因此将其附加为该URL的查询参数的用户。
我确实需要重用“用户”参数来重新填充相对于用户名的Form字段,我知道这不是有效的电子邮件,但是客户已经安装的别名系统以这种方式进行别名处理。
答案 0 :(得分:1)
给出您的模板:
<#if myCase??>
value = ${user}
</#if>
Freemarker以输出模式HTML编写的输出结果如下:
value = AAA% BBB@DDD.COM
Freemarker不了解(从您的上下文来看)user
的值应为属性值(赋值)。相反,它将字符串user
的内容视为HTML本身(可以是完整的HTML源代码作为输入字段,单个标记等)。它只是将模型的内容粘贴到模板中您已设置变量插值${user}
的位置。
Freemarker结果不是有效的HTML(属性值对),因为每个属性都应遵循某些命名约定(即没有特殊字符)。当该属性具有值时,其后是一个等号,然后是一个用双引号引起来的值。
因此,大多数浏览器会将您的结果转换为有效的HTML 属性-实际上是两个属性:value="AAA%"
和BBB@CCC.com=""
。在Firefox中打开了HTML输出,您将在检查器中看到此内容(不在原始源代码视图中):
<input type="text" value="AAA%" bbb@ddd.com="">
FreeMarker在写入最终HTML时为auto-escaping(尤其是在OutputMode HTML中)。
@ ddekany 感谢您的comment!它使我重现并发现了真正的原因。
在Java中,您甚至可以编码字符串变量user
。因此,它将%
(即百分号后跟空格)转换为%25+
,可以在URL内部使用。
在IDEONE上在线运行this java snippet,以实现URL编码和URL解码的效果。
通过固定模板中的HTML属性值分配,使用以下两种解决方案中的任意一种可获得期望的输出:
<#if myCase??>
value="${user}"
</#if>
使用FreeMarker的某些内置字符串。在您的情况下,您可以在变量名后附加?url,并在模板中的 variable-interpolation 周围使用双引号,例如:
<#if myCase??>
href="mailto:${user?url}"
</#if>
BBB@DDD.COM
是有效的电子邮件地址。但是在电子邮件地址中不允许使用%
和空白。
另一方面,@
通常不是URL的一部分,除了作为 query-param 值内的一部分。但是您的user
(URL)不能以http://
等开头。
因此,根据具有值user
的(所谓的URL)AAA% BBB@DDD.COM
的用例/用途,它最终可以表示URL或电子邮件地址的一部分。
在您的特殊情况下,说:
填充相对于用户名的表单字段。模型变量
user
没有包含有效的电子邮件地址。它与客户已安装的别名系统结合使用。因此,混叠将以这种方式工作。
让我们假设最终用户稍后会编辑表单字段,它负责使其有效(或脚本执行此验证)。
无论如何,请记住Internet地址(例如URL /电子邮件)需要一些验证:
否则它可能无法达到预期的效果。
相关问题: