设为首页 收藏本站
查看: 1225|回复: 0

[经验分享] Apache的EL函数Replace实现中存在的一点不足之处

[复制链接]

尚未签到

发表于 2017-1-14 09:05:24 | 显示全部楼层 |阅读模式
  全文总结:


  Apache的EL函数replace实现中对于fn:replace的实现过于简陋,不能使用正则表达式。


  缘起:


  考虑以下的应用场景:
  对于新闻评论功能,为了显示真实性,可以将用户的IP信息,加在留言中。但是,保护隐私起见,需要把部分的IP信息隐藏了。如下图,是网易新闻评论的效果:
  
DSC0000.png

 
DSC0001.png
  如果是JavaSE引用,替换部分内容,用正则表达式很容易。

public class Test {
public static void main(String[] args) {
String ip = "192.168.7.20";
String result = ip.replaceAll(
"(\\d{1,3}\\.\\d{1,3}\\.)\\d{1,3}\\.\\d{1,3}", "$1*.*");
System.out.println(result);
}
}
输出:

192.168.*.*
  但是在JSP中该如何做呢?

${fn:replace(ip,"(\\d{1,3}\\.\\d{1,3}\\.)\\d{1,3}\\.\\d{1,3}","$1*.*")}
   结果输出的是:

"192.168.7.20"
  应该是正则表达式没有起作用,让我们来看看EL的function是的源码吧。


  深究:


  我用的是Apache的JSTL的实现,其源码如下:

public static String replace(
String input,
String substringBefore,
String substringAfter)
{
if (input == null) input = "";
if (input.length() == 0) return "";
if (substringBefore == null) substringBefore = "";
if (substringBefore.length() == 0) return input;
StringBuffer buf = new StringBuffer(input.length());
int startIndex = 0;
int index;
while ((index = input.indexOf(substringBefore, startIndex)) != -1) {
buf.append(input.substring(startIndex, index)).append(substringAfter);
startIndex = index + substringBefore.length();
}
return buf.append(input.substring(startIndex)).toString();
}

  可以看到,EL的Replace函数,就是将subStringBefore作为普通的字符串(相反在JavaSE的replaceAll方法中,直这可以是一个正则表达式),提供的就是简单的查找并替换的功能。


  


  因此,如果要达到替换的目的,需要采用其他迂回的办法了。O(∩_∩)O~


  个人解决方案:



  


  这里我写了个简单的EL函数,可以使用:



package study.el.functions;
import java.util.regex.Pattern;
public class MyFunctions {
private static Pattern ipMask = null;
private static Pattern phoneMask = null;
static {
ipMask = Pattern.compile("(\\d{1,3}\\.\\d{1,3}\\.)\\d{1,3}\\.\\d{1,3}");
phoneMask = Pattern.compile("(\\d{3})\\d{4}(\\d{3})");
}
public static String replaceAll(String source, String regex, String target) {
if (source == null)
return "";
if (regex == null || regex.length() == 0)
return source;
return source.replaceAll(regex, target);
}
public static String ipMask(String source, String symbol) {
if (symbol == null)
symbol = "*";
return ipMask.matcher(source).replaceAll("$1"+symbol+"."+symbol);
}
public static String phoneMask(String source, String symbol) {
if (symbol == null)
symbol = "*";
return phoneMask.matcher(source).replaceAll("$1"+symbol+symbol+symbol+symbol+"$2");
}
}
   封装成了个jar包,放入lib目录下,即可使用:



<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/Myfunctions" prefix="my"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>自定义的EL function</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
request.setAttribute("ip", "193.233.2.12");
request.setAttribute("phone", "17871994766");
%>
ip : ${ip}<br/>
用ipMask: ${my:ipMask(ip,"-") }<br/>
用replaceAll :${my:replaceAll(ip,"(\\d{1,3}\\.\\d{1,3}\\.)\\d{1,3}\\.\\d{1,3}","$1*.*")}<br/>
phone : ${phone}<br/>
用phoneMask:${my:phoneMask(phone,"*") }<br/>
用replaceAll: ${my:replaceAll(phone,"(\\d{3})\\d{4}(\\d{3})","$1####$2")}<br/>

</body>
</html>

  输出结果:


  

  使用直接使用正则表达式的话,效率不高,因为每次都需要编译。所以可以考虑写成通用方法的方式,如ipMask、phoneMask。


  至此,利用EL表达式的扩展功能,达到了目的。

O(∩_∩)O~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-328154-1-1.html 上篇帖子: 使用Apache Axis 生成Web服务客户端开发天气预报的功能 下篇帖子: [Apache Click快速开发]Click的组件(二) Menu、PickList和自定义TextArea
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表