<jsp:useBean />及相关动作深入理解

本文探讨了JSP与JavaBean之间的合作方式,详细解析了&lt;jsp:useBean&gt;的不同用法及其背后的工作原理,并讨论了中文乱码等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学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 /的理解差不多就这些吧。。。。 
例外情况 org.apache.jasper.JasperException: 在 [36] 行处理 [/jsp/admin/login.jsp] 时发生异常 33: </script> 34: </head> 35: <body> 36: <jsp:useBean id="infoList" scope="request" type="java.util.List"/> 37: <c:if test="${!empty infoList}"> 38: <c:forEach items="${infoList}" var="i"> 39: <script type="text/javascript"> Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:602) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:489) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) com.shine.bookshop.filter.FilterLogin.doFilter(FilterLogin.java:45) com.shine.bookshop.filter.FilterEnconding.doFilter(FilterEnconding.java:41) 根本原因。 javax.servlet.ServletException: java.lang.InstantiationException: bean infoList not found within scope org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:906) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:835) org.apache.jsp.jsp.admin.login_jsp._jspService(login_jsp.java:206) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) com.shine.bookshop.filter.FilterLogin.doFilter(FilterLogin.java:45) com.shine.bookshop.filter.FilterEnconding.doFilter(FilterEnconding.java:41) 根本原因。 java.lang.InstantiationException: bean infoList not found within scope org.apache.jsp.jsp.admin.login_jsp._jspService(login_jsp.java:164) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) com.shine.bookshop.filter.FilterLogin.doFilter(FilterLogin.java:45) com.shine.bookshop.filter.FilterEnconding.doFilter(FilterEnconding.java:41)
最新发布
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值