在java Web体系中,可以写自定义标签,过滤用户输入,也可以写一个filter过滤器。比如说自定义标签。
开发步骤:
1 写一个标签处理类
2 在/WEB-INF/目录下,写一个*.tld文件,目的是让Web容器知道自定义标签和标签处理类的对应关系
3 在JSP页面中,通过<%@taglib%>指令引用标签库.
4 部署web应用,访问simple.jsp即可
其中,标签处理类可以这样写,转义大于号,小于号等特殊符号。
package cn.itcast.web.jsp.tagimport java.io.IOException
import java.io.StringWriter
import javax.servlet.jsp.JspException
import javax.servlet.jsp.PageContext
import javax.servlet.jsp.tagext.JspFragment
import javax.servlet.jsp.tagext.SimpleTagSupport
//<simple:filter>标签处理类
public class FilterTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspFragment jspFragment = this.getJspBody()
StringWriter writer = new StringWriter()
jspFragment.invoke(writer)
String temp = writer.getBuffer().toString()
//结果必定是转义后的字符串
temp = filter(temp)
PageContext pageContext = (PageContext) this.getJspContext()
pageContext.getOut().write(temp)
}
public String filter(String message) {
if (message == null)
return (null)
char content[] = new char[message.length()]
message.getChars(0, message.length(), content, 0)
StringBuffer result = new StringBuffer(content.length + 50)
for (int i = 0 i < content.length i++) {
switch (content[i]) {
case '<':
result.append("&lt")
break
case '>':
result.append("&gt")
break
case '&':
result.append("&amp")
break
case '"':
result.append("&quot")
break
default:
result.append(content[i])
}
}
return (result.toString())
}
}
答案是不要这么搞,大段的 HTML 嵌入到 JS 里结果就是悲剧。不能代码高亮不能自动缩进,太难维护了。我的经验是,直接把 HTML 单独写到一个浏览器能访问到的文件里,比如 template/foo.html。然后 JS 里发一个同步 XHR 请求去读这个文件,例如:
var html = Template.load('/template/foo.html')
var target = document.getElementById('xxx')
target.innerHTML = html
Template 是一个工具类,负责发送同步 XHR 请求并返回结果。
这样在开发的时候,模板文件和 JS 代码分离,非常好维护。
当然这样做的话,上线的时候总发 XHR 请求也不是办法。所以在打包 JS 之前,我一般会通过脚本把所有的 Template.load('.*') 提取出来,替换成对应 HTML 的内容。这样在开发时非常方便,上线时也没有性能问题。
比如上面的代码被打包工具跑一下就变成了:
var html = "<ol>\n<li class=\"xxx\">...</li>\n</ol>"// 引号里是 /template/foo.html 对引号、换行做了转义之后的内容,由工具自动生成
var target = document.getElementById('xxx')
target.innerHTML = html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)