学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.Book" scope=“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 /的理解差不多就这些吧。。。。