jsp上截取字符串
页面列表存在手机号,如15152462345,显示成1515****345。
银行卡号62282542325242。显示5242(后4位)
一开始是用js处理,但是卡号还是在页面源代码上,造成客户信息泄漏
后来用<%@ taglib prefix="bean" uri="/WEB-INF/struts-bean.tld" %> 的bean标签,有个属性是format
但是没有任何效果,查看源代码org.apache.struts.taglib.bean.WriteTag
protected String formatValue(Objeorg.apache.struts.taglib.beanct valueToFormat) throws JspException { Format format = null; Object value = valueToFormat; Locale locale = TagUtils.getInstance().getUserLocale(pageContext, this.localeKey); boolean formatStrFromResources = false; String formatString = formatStr; // Return String object as is. if (value instanceof java.lang.String) { return (String) value; } else { // Try to retrieve format string from resources by the key from // formatKey. if ((formatString == null) && (formatKey != null)) { formatString = retrieveFormatString(this.formatKey); if (formatString != null) { formatStrFromResources = true; } } // Prepare format object for numeric values. if (value instanceof Number) { if (formatString == null) { if ((value instanceof Byte) || (value instanceof Short) || (value instanceof Integer) || (value instanceof Long) || (value instanceof BigInteger)) { formatString = retrieveFormatString(INT_FORMAT_KEY); } else if ((value instanceof Float) || (value instanceof Double) || (value instanceof BigDecimal)) { formatString = retrieveFormatString(FLOAT_FORMAT_KEY); } if (formatString != null) { formatStrFromResources = true; } } if (formatString != null) { try { format = NumberFormat.getNumberInstance(locale); if (formatStrFromResources) { ((DecimalFormat) format).applyLocalizedPattern( formatString); } else { ((DecimalFormat) format).applyPattern(formatString); } } catch (IllegalArgumentException e) { JspException ex = new JspException(messages.getMessage( "write.format", formatString)); TagUtils.getInstance().saveException(pageContext, ex); throw ex; } } } else if (value instanceof java.util.Date) { if (formatString == null) { if (value instanceof java.sql.Timestamp) { formatString = retrieveFormatString(SQL_TIMESTAMP_FORMAT_KEY); } else if (value instanceof java.sql.Date) { formatString = retrieveFormatString(SQL_DATE_FORMAT_KEY); } else if (value instanceof java.sql.Time) { formatString = retrieveFormatString(SQL_TIME_FORMAT_KEY); } else if (value instanceof java.util.Date) { formatString = retrieveFormatString(DATE_FORMAT_KEY); } } if (formatString != null) { format = new SimpleDateFormat(formatString, locale); } } } if (format != null) { return format.format(value); } else { return value.toString(); } }
发现是字符串的话,直接跳过。
于是自定义个类覆盖此方法
主要有一个问题,format不能做到一个表达式,取前3位+****+取后4位。它只有取前几位的功能,如%.3s是取前3位
当然可以把format看成传入的是正则表达式,但是正则取前几位是^.{0,n},后4位是.{4}$。但是依然不能整合在一个表达式里。
所以楼主只能自定义个规则了 [L]%.ns[/L]表示取后n位,然后字符串取反,取前n位,然后再次取反,就是后n位
例如:
<bean:write name="termOrder" property="outPhone.mobile" format="%.3s****[L]%.4s[/L]" />
表示取前3位+****+后4位
附上代码
/** * */ package org.apache.struts.taglib.bean; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.jsp.JspException; import com.cupdata.telsales.util.StringUtils; /** * @author cruze(penkee@163.com) 2014-7-1 * */ public class MyWriteTag extends WriteTag{ /** * */ private static final long serialVersionUID = 1L; @Override /** * 自定义format,主要是字符串没有格式化 * 如果[L]存在,则[L]%.4s取最后4位 * 例如%.3s**%.3s**[L]%.4s[/L] * added by cruze at 2014-6-30 */ protected String formatValue(Object valueToFormat) throws JspException { String formatString = formatStr; Object value = valueToFormat; if (value instanceof java.lang.String && !StringUtils.isNull(value) && !StringUtils.isNull(formatString)) { String inValue=value.toString(); //判断有几个%则加入几个变量 //如果存在[L],则变量要取反 //最后将[L]再次取反 //去掉[L]和[/L] List<Object> para=new ArrayList<Object>(); for(int i=0;i<formatString.length();i++){ if("%"==formatString.charAt(i)){ if(i>2&&"[L]".equals(formatString.substring(i-3, i))){ //字符串取反 para.add(org.apache.commons.lang.StringUtils.reverse(inValue)); } else{ para.add(value); } } } //格式化 String res=String.format(formatString,para.toArray()); String returnRes=new String(res); Pattern p = Pattern.compile("\[L](.*?)\[/L]"); Matcher m = p.matcher(res); while(m.find()) { String find=m.group().substring(3, m.group().length()-4); String xifu=org.apache.commons.lang.StringUtils.reverse(find); String tmp=returnRes.replace(m.group(), xifu); returnRes=null; returnRes=tmp; } return returnRes; } return super.formatValue(valueToFormat); } }
修改struts-bean.tld的
<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>改为<tagclass>org.apache.struts.taglib.bean.MyWriteTag</tagclass>即可
效果:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: JSP页面截取字符串的长度
- 下一篇: EL表达式中如何截取字符串