学JSP的时候,发现jsp和javaBean合作真的很方便,一些东西直接交给javaBean处理,但是在用的过程中,还是发现了不少问题,如果提交表单中有中文怎么办?javaBean里面的属性成员不只是基本数据类型,而是Object类型又如何处理?深入了解了后,发现javaBean其实不过是各种作用域的一个Attrubute属性。

 
        1、<jsp:useBean />单独使用和包含使用。单独使用即<jsp:useBean ../>,是以"/>"号结束。则表示在作用域中查找有无该Bean的实例,若找不到,则初始化并设置为作用域(scope,默认为page)的属性,若有则不初始化。 
        在包含使用中<jsp:useBean > <jsp:setProperty /> </jsp:useBean>。则包含中的语句在执行javaBean新建实例的时候才执行,若已经能找到则不执行。所有如果是scope=“session”则<jsp:setProperty />应该放在<jsp:useBean />外面,这样不会导致在整个会话作用域都不执行,相反,若是scope="page"或者scope="request"则 <jsp:setProperty /> 最好放在 <jsp:useBean /> 里面,这样就能保证执行 <jsp:setProperty />。
        2、<jsp:useBean />真正执行的语句如下。 
    在jsp中     <jsp:useBean id="book" class="com.Bookscope=“page" > 
                   <jsp:setProperty name="book" property="*" />
                    </jsp:useBean>
    在转化后的jsp.java文件代码如下 
      com.Book book = null; 
     synchronized (_jspx_page_context) {//对上下文作用域加锁,同步
        book = (com.Book) _jspx_page_context.getAttribute("book", PageContext.PAGE_SCOPE);//找到在scope中设置的作用域进行查找
        if (book == null){//如果找不到
          book = new com.Book();//初始化 新建对象
          _jspx_page_context.setAttribute("book", book, PageContext.PAGE_SCOPE);//给Page作用域设置属性
          org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("book"), request);//这就是在useBean中用setProperty的效果
        }
      }
    在jsp中执行 <jsp:useBean id="bookBean" class="com.BookBean" />//默认scope=”page“ 
    相应的jsp.java文件中代码如下: 
       com.BookBean bookBean = null;
      synchronized (_jspx_page_context) {
        bookBean = (com.BookBean) _jspx_page_context.getAttribute("bookBean", PageContext.PAGE_SCOPE);
        if (bookBean == null){
          bookBean = new com.BookBean();
          _jspx_page_context.setAttribute("bookBean", bookBean, PageContext.PAGE_SCOPE);
        }
      }这部分代码和上面的差不多,不解释了,就是少了中间setProperty的部分。
    3,、个人看法之利弊。用  <jsp:setProperty name="book" property="*" />进行处理表单提交的数据确实很方便,简写了很多代码,只要和表单相同的property对应javaBean中的实例变量,这样自动进行设置,但是这个也有不好的地方,就是在表单提交中文的情况下会有乱码,容器默认ISO8859-1编码,这样得到的javaBean中的实例变量就有乱码,不利于处理。
        加上通过<jsp:useBean />操作最终还是转还为将Bean中的对象存储到相应作用域对象的Attribute中,这样的话,可以用手动代替,实例化Bean,然后setAttribute进行设置。这样处理也比较方便。然后再用getAttribute得到属性也就是javaBean的对象。
       对<jsp:useBean /的理解差不多就这些吧。。。。 
posted on 2011-12-18 15:49  lufeng20  阅读(1295)  评论(0编辑  收藏  举报