`
xiaolongfeixiang
  • 浏览: 236432 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Apache的EL函数Replace实现中存在的一点不足之处

阅读更多

全文总结:

 

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

 

缘起:

 

考虑以下的应用场景:

 

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



 

如果是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.3 KB
  • 大小: 2.3 KB
3
5
分享到:
评论
1 楼 xiaolongfeixiang 2010-05-25  

呵呵,又被人踩了。可能是 我没有表达清楚吧。希望路过的JavaEyer们,给点意见。

相关推荐

    apache开源项目源码commons-el-1.0-src(全部高质量el表达式的java源程序)

    apache开源项目源码commons-el-1.0-src 全部高质量el表达式的java源程序 java,el,el表达式,el表达式源码,apache开源项目源码commons-el-1.0-src 各种el表达式操作工具类源码,你会从中得到意想不到的效果! ...

    Apache Drill常用函数

    在Apache Drill 1.18版本中,我们找到了一些常用的SQL函数,这些函数对于数据转换和处理非常有用。 首先,`CAST`函数用于将数据从一种类型转换为另一种。例如,如果你有一个包含小数的字符串,你想将其转换为...

    ApacheSpark设计与实现.pdf+ApacheSpark源码剖析.pdf+Spark原著中文版.pdf

    《Apache Spark设计与实现》这本书可能会详细讲解Spark的架构设计,包括其核心组件如弹性分布式数据集(RDD)、Spark SQL、Spark Streaming、MLlib(机器学习库)和GraphX(图计算)。书中可能涵盖了以下知识点: 1...

    Apache函数共9个实例代码

    在实践中,这些函数通常结合使用,以实现更复杂的服务器端功能。例如,你可能会使用`ap_is_initial_request()`来决定是否执行特定的处理逻辑,然后用`ap_set_content_length()`和`ap_rwrite()`发送定制的响应。同时...

    Apache Spark的设计与实现 PDF中文版

    本文主要讨论 Apache Spark 的设计与实现,重点关注其设计思想、运行原理、实现架构及性能调优,附带讨论与 Hadoop MapReduce 在设计与实现上的区别。不喜欢将该文档称之为“源码分析”,因为本文的主要目的不是去...

    Java apache Math (commons-math3-3.0-bin)包,有Gama,Beta函数

    在Java Apache Commons Math中,你可以通过调用特定的API来计算伽马函数的值,这对于处理概率论、统计学和特殊函数的问题非常有用。 2. **贝塔函数**:贝塔函数是另一个重要的特殊函数,它在概率分布、统计推断和...

    Apache Spark 设计与实现

    Apache Spark 设计与实现

    从JSTL和STRUTS的TLD文件到自定义EL函数

    1. **编写实现类**:创建一个类实现`javax.el.FunctionMapper`接口或者继承`org.apache.jasper.runtime.FunctionMapperImpl`类,并定义静态方法`myFunction`。 ```java public class MyFunctions extends org....

    php函数手册(中文chm)

    Apache特定函数库 图形函数库 GNU记录函数库 数组函数库 IMAP,POP3和NNTP函数库 Perl相容正规表达函数库 拼字检查函数库 LDAP函数库 正规表达函数库 BC高精准度函数库 邮件函数库 信号与共享记忆体函数库 历法...

    Apache Commons Math3探索之多项式曲线拟合实现代码

    首先,我们要知道多项式曲线拟合是数据分析和科学计算中的常见任务,它通过找到一个多项式函数来最好地逼近给定的一组数据点。Apache Commons Math3提供的`PolynomialCurveFitter`类实现了这一功能。该类允许我们...

    apache和C++实现fastcgi时Apache中httpd.conf的配置

    本篇文章将详细讲解在Apache服务器中配置FastCGI,特别是如何编辑`httpd.conf`文件来实现这一功能。 首先,我们需要了解Apache的`httpd.conf`配置文件。这是Apache的主要配置文件,包含了服务器启动、运行以及与...

    Apache Camel中文开发使用指南.zip

    这些模式是解决企业系统集成中常见问题的最佳实践,而Apache Camel则将这些模式实现为可重用的组件,使得开发者可以通过简单的DSL(Domain Specific Language)来应用这些模式。 1. **DSL与路由定义**:Apache ...

    Apache hive常用函数.zip

    本资料"Apache Hive常用函数.zip"包含了一份详尽的Apache Hive函数指南,涵盖了各种运算类别,如关系运算、数学运算、逻辑运算、数值运算以及日期函数和条件函数。以下是对这些函数的详细介绍: 1. **关系运算**:...

    apache commons all 中文api合集

    apache commons all 中文api合集

    PHP函数大全.pdf

    1. apache_lookup_uri() 函数:将文档里的 URI 信息返回到类变量中。 2. apache_note() 函数:获取记录表的值,是 Apache 专属函数。 3. getallheaders() 函数:返回数组类型的 HTTP 请求标头(Header)的值,不需...

    apache-tomcat-apis-0.1-1.el6.noarch.rpm

    apache-tomcat-apis-0.1-1.el6.noarch.rpm

    配置安装Apache+Apache Tomcat实现tomcat负载均衡教程.doc

    配置安装Apache+Apache Tomcat实现tomcat负载均衡教程.doc

    PHP函数集 PHP手册

    Apache特定函数库 图形函数库 GNU记录函数库 数组函数库 IMAP,POP3和NNTP函数库 Perl相容正规表达函数库 拼字检查函数库 LDAP函数库 正规表达函数库 BC高精准度函数库 邮件函数库 信号与共享记忆体函数库 历法...

    ant-apache-log4j-1.7.1-13.el6.i686.rpm

    ant-apache-log4j-1.7.1-13.el6.i686.rpm是centos依赖包。

Global site tag (gtag.js) - Google Analytics