Struts中bean:write标签丢失半角空格的处理方法

来源:互联网 发布:同花顺股票开户软件 编辑:程序博客网 时间:2024/05/18 00:23

这两天在测试的过程中发现。

jsp画面中一览区域的数据总是丢失前后的半角空格。

于是进行了调查。

发现Struts标签底层代码根本就没有对空格进行处理。

源代码如下:

This useful method states:

    public static String filter(String value) {

        if (value == null)
            return (null);

        char content[] = new char[value.length()];
        value.getChars(0, value.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());

    }

于是,我想到了重新封装一下bean:write标签。

jsp代码(没变):

<bean:write name="vatMaster" property="mc0_vat_cd"/>

 

...WEB-INF/tlds/struts/struts-bean.tld文件修改如下:

<tag>
<name>write</name>
<tagclass>jp.co.....frame.web.ui.tag.UserWriteTag</tagclass>
.

.

.
</tag>

蓝色部分为修改后的代码(具体路径省略)。

也就是从新写的一个类,继承了WriteTag类。

 

UserWriteTag代码如下:

package jp.co.gminds.frame.web.ui.tag;

import javax.servlet.jsp.JspException;

import org.apache.struts.taglib.TagUtils;
import org.apache.struts.taglib.bean.WriteTag;


public class UserWriteTag extends WriteTag {
 
 private static final long serialVersionUID = 1L;
 
 public int doStartTag() throws JspException {    // Look up the requested bean (if necessary)   
     if (ignore) {   
         if (TagUtils.getInstance().lookup(pageContext, name, scope) == null) {   
             return (SKIP_BODY); // Nothing to output   
         }   
     }    // Look up the requested property value   
     Object value = TagUtils.getInstance().lookup(pageContext, name, property, scope);   
     if (value == null) {   
         return (SKIP_BODY); // Nothing to output   
     }    // Convert value to the String with some formatting   
     String output = formatValue(value);   
     // Print this property value to our output writer, suitably filtered   
     if (filter) {   
      output = TagUtils.getInstance().filter(output);
      output = toHtmlString(output, true);  //这句是加的,别的都是原来的   
      
         TagUtils.getInstance().write(pageContext, output);   
     } else {   
         TagUtils.getInstance().write(pageContext, output);   
     }    // Continue processing this page   
     return (SKIP_BODY);
 }
 
   /**
    * 文字列に含まれるHTML特殊文字をエスケープ変換するメソッド。
    *
    * @param p String
    * @param b boolean
    * @return 変換後文字列
    */
   public static String toHtmlString(String p, boolean b) {
  if (p == null) {
   return "";
  }
  StringBuffer sf = new StringBuffer();
  for (int i = 0; i < p.length(); i++) {
   char temp = p.charAt(i);
   if (b) {
    switch (temp) {
    case ' ':
     sf.append("&nbsp;");
     break;
    default:
     sf.append(temp);
    }
   }
  }
  return sf.toString();
 }
}

上述方法toHtmlString中。

只是对空格进行了转换。

如果还有别的处理,往里追加即可。