在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())
}
}
1.整体思路:js调用java
首先将js代码注入到webview的页面中,然后通过修改window.location.href来向java传递参数,java端通过监听页面url的改变来识别js端传递的参数.然后再经解析数据实现java方法的调用.
java调用js
java通过webView.loadUrl("JavaScript:"+jsCode)来实现js代码的调用
2. java调用js的实现
java调用js的方法,相当简单:
String jsCode = "(function(){ /*js code here*/ })()"
webview.loadUrl("javascript:" + jsCode)
注意:要把js代码用自执行函数包裹起来
利用这种方法可以把任意代码注入到页面中
注意: 当页面刚加载时就需要把 2.1中的js代码注入到页面中,但是有时会出现页面加载完成,但是注入的代码没有执行的现象,应该是因为js没有及时加载而页面先加载完成。要解决这个问题就需要在页面加载完成时触发一个事件比如jsBridgeReady,js端通过监听jsBridgeReady事件来调用java方法。那么总体流程如下:
加载页面->注入js代码->页面加载完成->触发js注入完成事件
代码:
在BridgeWebClient中添加逻辑: 1,加载页面时注入js代码: 2,加载完成后触发加载完成事件
@Override
public void onLoadResource(WebView view, String url) {
// 注入桥接代码
// 这里通过读取js文件获得js代码
if (mFileName != null) {
view.loadUrl(mBridge.createBaseJs(mContext, mFileName))
}
super.onLoadResource(view, url)
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url)
// 触发注入完成事件,用于解决 注入的代码没有及时加载成功导致无法调用的问题
view.loadUrl("(function(){if(window.UAPPJSBridgeReady){window.UAPPJSBridgeReady()}})()")
}
如果你也想从文件读取js代码,记得把读取的代码压缩一下,把注释和换行删除,不然很可能会报错
js端调用java注入的代码:
//判断代码是否注入完成
if(window.UAPPJSBridge){
//调用注入的方法
window.UAPPJSBridge.wxshare(message,success,error)
}else{
//监听注入完成的事件
window.onBridgeLoaded=function(){
if(window.UAPPJSBridge){
window.UAPPJSBridge.wxshare(message,success,error)
}
}
}