请教各位高人应该如何实现这样一个功能的自定义标签? 提供个大体的思路:在doStartTag方法中get一个jspwriter,然后read BodyContent的内容,对这段内容进行jsp字符串查找替代。最后,将这个jspwrite写到out中,输出到页面。明天给你一个例子。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public int doEndTag(){ String content = "" ; BufferedReader br ; try{ if( bodyContent != null ){ content = bodyContent.getString() ; content = filter( content , "jsp" , "***" ) ; bodyContent.clear(); bodyContent.print( content ); bodyContent.writeOut( getPreviousOut() ); return EVAL_PAGE ; } } catch( Exception ex ){ System.err.println( ex ); } return EVAL_PAGE ; } 其中filter是自己写的私有函数,由于这个函数涉及到我们公司的产权,所以我不能贴出来了。不过我说个参数的大体的意思:第一个是原有字符串,第二个是要被替换的字符串,第三个是替换的目标字符串。用StringBuffer和String实现的。程序中的bodyContent是成员变量。 本来我想写个简单的filter,所以在那个函数里面声明了一bufferedReader,其实他用来做字符串过滤用的。bodyContent.writeOut( getPreviouseOut())的意思是:getPreviouseOut()是获得外层的jspwriter实例。也可以用pageContext.getOut()来代替他。bodyContent.writeOut()的意思是将标志体内容写入一个writer,这个writer就是我们刚才得到的。由于BodyContent是JspWriter的子类,所以BodyContent对象可以包括另一个BodyContent对象,最为外层写入器,所以我用了gertPreviouseOut()。而用pageContext对象是直接操纵JspWriter和BodyContent实例的对象栈.建议多看一下体标志方面的书籍,讲得比我清楚多了,我也只是懂懂而已。关于那个filter,本来是想自己写一个,但昨天晚上太晚了,就不写了,用了公司的程序库,所以不能给你了,我得遵守游戏规则,呵呵。不过今天随便写一个filter,很不完善,也没有作测试,你自己可以在我的程序基础上改吧。 String filter( String srcStr ,String tarStr , String repStr ){ String result = "" ; if( srcStr == null || srcStr.trim().equals( "" ) ){ return result ; } if( tarStr == null ){ return srcStr ; } if( repStr == null ){ return srcStr ; } int len = repStr.length() ; StringBuffer sb = new StringBuffer( srcStr ) ; int cur = 0 , pos = 0 ; while( cur != -1 ){ cur = srcStr.indexOf( tarStr , pos ) ; pos = cur ; if( pos < 0 ){ break ; } sb.replace( cur , cur+len , repStr ) ; srcStr = sb.toString() ; } result = sb.toString() ; return result ; } 你写的程序是对的,我又帮这个函数中多加了一项功能,这个功能解决了如果第三个参数目标字符串比第二个参数要替换的字符串长的一个解决方法,程序运行的结果是对的,就是if判断条件为真的这段代码:我想问的是为什么在这段代码中最后一次循环的时候会抛出StringIndexOutOfBounds异常呢?没有办法,我只好强行捕获这个异常,让它什么也不做了,把这段改过的代码放在你做好的这个程序中,试试看,你看看有什么办法可以不让代码抛出异常,或者还有什么更精简的方法可以实现这个问题???谢谢了!!! if(repStr.length()>tarStr.length()) { try { while(cur<=srcStr.length()) { cur=srcStr.indexOf(tarStr,cur); sb.delete(cur,cur+tarStr.length()); sb.insert(cur,repStr); sb=new StringBuffer(sb.toString()); srcStr=sb.toString(); cur=cur+tarStr.length(); } } catch(StringIndexOutOfBoundsException e) { } } else { while(cur!=-1) { cur=srcStr.indexOf(tarStr,pos); pos=cur; if(pos<0) { break; } sb.replace(cur,cur+len,repStr); srcStr=sb.toString(); } } public String filter( String srcStr ,String tarStr , String repStr ){ String result = "" ; if( srcStr == null || srcStr.trim().equals( "" ) ){ return result ; } if( tarStr == null ){ return srcStr ; } if( repStr == null ){ return srcStr ; } int tarLen = tarStr.length() ; int repLen = repStr.length() ; int len = tarLen > repLen?tarLen:repLen ; //deprecated StringBuffer sb = new StringBuffer( srcStr ) ; int cur = 0 , pos = 0 ; while( cur != -1 ){ cur = srcStr.indexOf( tarStr , pos ) ; pos = cur ; if( pos < 0 ){ break ; } if( tarLen < repLen ){ sb.insert( cur+1 , " " ) ; } sb = sb.replace( cur , cur + len , repStr ) ; srcStr = sb.toString() ; } result = sb.toString() ; return result ;} public String filter( String srcStr ,String tarStr , String repStr ){ String result = "" ; if( srcStr == null || srcStr.trim().equals( "" ) ){ return result ; } if( tarStr == null ){ return srcStr ; } if( repStr == null ){ return srcStr ; } int tarLen = tarStr.length() ; int repLen = repStr.length() ; int len = tarLen > repLen?tarLen:repLen ; //deprecated StringBuffer sb = new StringBuffer( srcStr ) ; int cur = 0 , pos = 0 ; while( cur != -1 ){ cur = srcStr.indexOf( tarStr , pos ) ; pos = cur ; if( pos < 0 ){ break ; } if( tarLen < repLen ){ for( int i = tarLen ; i<= (repLen - tarLen) ;i++){ sb.insert( cur+1 , " " ) ; } } sb = sb.replace( cur , cur + len , repStr ) ; srcStr = sb.toString() ; } result = sb.toString() ; return result ;} 请教一个问题 如何获取一个字符串中的所有连接? 经典问题,来者善 SSH问题继续郁闷??? web开发中一个jsp文件中能不能既有java语言又有javascript语言? iText中处理表格问题 Tomcat5.0运行jsp时错误,但在在weblgoic7.0上运行正确 如何学习javabean 有关tomcat的一些疑问??高手帮忙!! Cannot create JDBC driver of class '' for connect URL 'null' 求大神指教 JAVA物品分类栏怎么实现 还是没有分,各位哥哥姐姐帮忙! 怎么样取到提交表单的元素的个数?
BufferedReader br ;
try{
if( bodyContent != null ){
content = bodyContent.getString() ;
content = filter( content , "jsp" , "***" ) ;
bodyContent.clear();
bodyContent.print( content );
bodyContent.writeOut( getPreviousOut() );
return EVAL_PAGE ;
}
} catch( Exception ex ){
System.err.println( ex );
}
return EVAL_PAGE ;
}
不过我说个参数的大体的意思:第一个是原有字符串,第二个是要被替换的字符串,第三个是替换的目标字符串。用StringBuffer和String实现的。
程序中的bodyContent是成员变量。
bodyContent.writeOut( getPreviouseOut())的意思是:
getPreviouseOut()是获得外层的jspwriter实例。
也可以用pageContext.getOut()来代替他。
bodyContent.writeOut()的意思是将标志体内容写入一个writer,这个writer就是我们刚才得到的。
由于BodyContent是JspWriter的子类,所以BodyContent对象可以包括另一个BodyContent对象,最为外层写入器,所以我用了gertPreviouseOut()。
而用pageContext对象是直接操纵JspWriter和BodyContent实例的对象栈.
建议多看一下体标志方面的书籍,讲得比我清楚多了,我也只是懂懂而已。
关于那个filter,本来是想自己写一个,但昨天晚上太晚了,就不写了,用了公司的程序库,所以不能给你了,我得遵守游戏规则,呵呵。不过今天随便写一个filter,很不完善,也没有作测试,你自己可以在我的程序基础上改吧。
String result = "" ;
if( srcStr == null || srcStr.trim().equals( "" ) ){
return result ;
}
if( tarStr == null ){
return srcStr ;
}
if( repStr == null ){
return srcStr ;
} int len = repStr.length() ;
StringBuffer sb = new StringBuffer( srcStr ) ;
int cur = 0 , pos = 0 ;
while( cur != -1 ){
cur = srcStr.indexOf( tarStr , pos ) ;
pos = cur ;
if( pos < 0 ){
break ;
}
sb.replace( cur , cur+len , repStr ) ;
srcStr = sb.toString() ;
}
result = sb.toString() ;
return result ;
}
我想问的是为什么在这段代码中最后一次循环的时候会抛出StringIndexOutOfBounds异常呢?没有办法,我只好强行捕获这个异常,让它什么也不做了,把这段改过的代码放在你做好的这个程序中,试试看,你看看有什么办法可以不让代码抛出异常,或者还有什么更精简的方法可以实现这个问题???谢谢了!!!
if(repStr.length()>tarStr.length())
{
try
{
while(cur<=srcStr.length())
{
cur=srcStr.indexOf(tarStr,cur);
sb.delete(cur,cur+tarStr.length());
sb.insert(cur,repStr);
sb=new StringBuffer(sb.toString());
srcStr=sb.toString();
cur=cur+tarStr.length();
}
}
catch(StringIndexOutOfBoundsException e)
{
}
}
else
{
while(cur!=-1)
{
cur=srcStr.indexOf(tarStr,pos);
pos=cur;
if(pos<0)
{
break;
}
sb.replace(cur,cur+len,repStr);
srcStr=sb.toString();
}
}
String result = "" ;
if( srcStr == null || srcStr.trim().equals( "" ) ){
return result ;
}
if( tarStr == null ){
return srcStr ;
}
if( repStr == null ){
return srcStr ;
} int tarLen = tarStr.length() ;
int repLen = repStr.length() ;
int len = tarLen > repLen?tarLen:repLen ; //deprecated
StringBuffer sb = new StringBuffer( srcStr ) ;
int cur = 0 , pos = 0 ;
while( cur != -1 ){
cur = srcStr.indexOf( tarStr , pos ) ;
pos = cur ;
if( pos < 0 ){
break ;
}
if( tarLen < repLen ){
sb.insert( cur+1 , " " ) ;
}
sb = sb.replace( cur , cur + len , repStr ) ;
srcStr = sb.toString() ;
}
result = sb.toString() ;
return result ;
}
String result = "" ;
if( srcStr == null || srcStr.trim().equals( "" ) ){
return result ;
}
if( tarStr == null ){
return srcStr ;
}
if( repStr == null ){
return srcStr ;
} int tarLen = tarStr.length() ;
int repLen = repStr.length() ;
int len = tarLen > repLen?tarLen:repLen ; //deprecated
StringBuffer sb = new StringBuffer( srcStr ) ;
int cur = 0 , pos = 0 ;
while( cur != -1 ){
cur = srcStr.indexOf( tarStr , pos ) ;
pos = cur ;
if( pos < 0 ){
break ;
}
if( tarLen < repLen ){
for( int i = tarLen ; i<= (repLen - tarLen) ;i++){
sb.insert( cur+1 , " " ) ;
}
}
sb = sb.replace( cur , cur + len , repStr ) ;
srcStr = sb.toString() ;
}
result = sb.toString() ;
return result ;
}