整体流程是这样:
比如学校管理系统中添加一个学生的相关信息(姓名、年龄……),在addStudent.jsp提交到Form中,再到Action,在Action中直接将Form中的信息拷贝(用PropertyUtils)到StudentDTO中(StudentDTO是一个学生JavaBean),再调用模型层里的insert()方法,从而将StudentDTO里的值添加到数据库就是这样一个过程,但,如果在addStudent.jsp页面中的某些表单内容前后有空格,需要用trim()去掉,我平时一般是在数据插入时处理的:
ps.setString(2, studentDTO.getName().trim());今天发现个问题,如果页面的某些表单没有输入内容,那么studentDTO.getName()=null,null.trim()当然就不行1、曾经有种做法,就是在StudentDTO类中,把属性的初始值都设为"",如:private String name = "","".trim()当然行,但本来某条学生信息没值的,现在把它的值设为"",""占用内存空间不说,而且似乎……2、如果在action不用拷贝的方法,从Form中取出,再一条条添加到StudentDTO,添加时判断下是否为null再trim()即可,这种方法可行,但如果数据量大的话,就不方便了究竟在哪处地添加trim()合适呢,应该如何解决?

解决方案 »

  1.   

    前台就可以过滤掉空格了。
    不可以直接给StudentDTO赋值么,拷贝多麻烦
      

  2.   

    楼主用的是struts1吧。。那简单了
    public class StudentForm extends ActionForm {
        private StudentDTO studentDTO = new StudentDTO();
        public void setName(String name) {
            //这里做判断
            if (name != null)
                studentDTO.setName(name.trim());
        }
        //省略其它
         public StudentDTO getBean() {  //不用拷贝了
            return studentDTO;
        }
    }
      

  3.   

    Filter或者RequestProcessor.processPopulate中,使用HttpRequestWrapper,对
    getParameter等方法进行过滤:
    public class TrimmedParameterRequest extends HttpServletRequestWrapper {  /**
       * 创建一个新的<code>TrimmedRequest</code>对象。
       * 
       * @param request
       */
      public TrimmedParameterRequest(HttpServletRequest request) {
        super(request);
      }  /**
       * 根据指定的参数名,返回去除前后空白字符的参数值。
       * 
       * @param name
       *          参数名
       * @return 去除前后空格的参数值
       * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
       */
      @Override
      public String getParameter(String name) {
        return StringUtils.trim(super.getParameter(name));
      }  /**
       * 返回参数名-参数值数组映射,其中的参数数组将被去除前后空白字符。
       * 
       * @return 去除空白字符的参数名-参数值数组映射
       * @see javax.servlet.ServletRequestWrapper#getParameterMap()
       */
      @SuppressWarnings("unchecked")
      @Override
      public Map getParameterMap() {
        Map<String, String[]> parameterMap = new LinkedHashMap<String, String[]>();
        Enumeration<String> names = super.getParameterNames();
        while (names.hasMoreElements()) {
          String name = names.nextElement();
          parameterMap.put(name, getParameterValues(name));
        }
        return parameterMap;
      }  /**
       * 根据指定的参数名,返回去除前后空格的参数值数组。
       * 
       * @param name
       *          参数名
       * @return 去除前后空格的参数值数组
       * @see javax.servlet.ServletRequestWrapper#getParameterValues(java.lang.String)
       */
      @Override
      public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name).clone();
        for (int i = 0; i < values.length; i++) {
          values[i] = StringUtils.trim(values[i]);
        }
        return values;
      }}第二,你的Form写法效率太低了,而且非常不方便:public class StudentForm extends ActionForm {
        private StudentDTO student;
        public void reset(...,...) {
          super.reset(...,...);
          student = new StudentDTO();
        }
        public StudentDTO getStudent() {
          return this.student;
        }
        public void setStudent(StudentDTO student) {
          this.student = student;
        }
    }jsp上面的参数
    <html:form action="....">
    <html:text property="student.name" />
    </html:form>
      

  4.   

    ps.setString(2, studentDTO.getName()==null?"":studentDTO.getName().trim());
      

  5.   

    加个判断啊  1楼的就可以
    public class StudentForm extends ActionForm {
        private StudentDTO studentDTO = new StudentDTO();
        public void setName(String name) {
            //这里做判断
            if (name != null)
                studentDTO.setName(name.trim());
        }
        //省略其它
         public StudentDTO getBean() {  //不用拷贝了
            return studentDTO;
        }
    }
    或者在页面js验证下 必须填写内容
      

  6.   

    写个js  trim一下呗  反正也是要前台校验的用一楼的方法也行,struts1就在formbean里处理,struts2就在Action里处理