当前位置: 首页 > 知识库问答 >
问题:

jsp:useBean范围属性是如何工作的?

支铭晨
2023-03-14

我试图理解jsp:useBeanjsp操作标记中的scope属性是如何工作的。据我所知,scope用于指示bean所在的位置(请求、会话、应用程序等),但经过一些测试后,我遇到了一个有趣的情况,情况并非如此,请考虑以下JSP代码(为了简单起见,我在这里使用scriplets):

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"  import="package2JSP.User" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Title</title>
</head>

<body>
    <%
        User user1 = new User("id1","name1");
        User user2 = new User("id2","name2");
        request.setAttribute("user", user1);
        session.setAttribute("user", user2);
    %>
    <%-- Here I expect to create user bean that represents user2 from session scope--%>
    <jsp:useBean id="user" class="package2JSP.User" scope="session"/>

    <%-- Here I expect user name to be name2 but it is name1 instead--%>
    <jsp:getProperty property="name" name="user"/>
</body>
</html>

所以基本上在这里我创建了2个用户对象并将它们设置为请求和会话范围中的“用户”属性,当我尝试使用jsp: useBean从“会话”范围中检索“用户”时,似乎“请求”范围中的“用户”被检索到了。

你能解释一下为什么会这样吗?那么,让jsp:useBean以这种方式工作而不是通常从指定范围中选择属性的开发原因是什么,它有什么优点吗?

现在我知道我可以使用JSTL/EL来检索所需的值,即


共有1个答案

吴俊晤
2023-03-14

在这种情况下,涉及两个标签:

  • jsp:useBean

jsp:useBean

根据规范——第JSP章。5-JSP。5.1<代码>

jsp:useBean操作将定义在给定范围内且具有给定id的Java编程语言对象的实例与新声明的具有相同id的脚本变量相关联。当在无脚本页面或无脚本上下文(如在所示的操作主体中)中使用操作时,不会创建Java脚本变量,而是创建EL变量

编译后的java代码是:

      package2JSP.User user = null;
      synchronized (session) {
        user = (package2JSP.User) _jspx_page_context.getAttribute("user", PageContext.SESSION_SCOPE);
        if (user == null){
          try {
            user = (package2JSP.User) java.beans.Beans.instantiate(this.getClass().getClassLoader(), "package2JSP.User");
          } catch (ClassNotFoundException exc) {
            throw new InstantiationException(exc.getMessage());
          } catch (Exception exc) {
            throw new ServletException("Cannot create bean of class " + "package2JSP.User", exc);
          }
          _jspx_page_context.setAttribute("user", user, PageContext.SESSION_SCOPE);
        }
      }

如果您想访问此用户对象,您可以使用script let(表达式)

jsp:getProperty

根据规范——第JSP章。5-JSP。5.3<代码>

jsp:setProperty和jsp:getProperty中name属性的值将引用通过其findAttribute方法从pageContext对象获得的对象。

JSP编译器从jsp: getProperty标记对findAttie()的调用:

out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString(
  (((package2JSP.User)_jspx_page_context.findAttribute("user")).getName())));

findAttribute()
按顺序搜索页面、请求、会话(如果有效)和应用程序范围中的命名属性,并返回相关值或null。

基本上:第一场比赛返回。

使用useBeangetProperty被认为是不好的做法
使用JSTL/EL是处理属性的更好方法。

 类似资料:
  • 我想使用filterset写出一个文件来替换设置为ant属性的变量。如果我有嵌套的filterset,但没有refid,我可以传递属性;我正在重用过滤器集,所以我想使用refid。 富。旧的只包含foo=@foo@ 这工作原理: 这无法替换令牌: 有没有办法做到后者?我还尝试编写一个属性文件,并将其用作filtersfile属性。

  • 是因为我的文件名精度设置为秒吗? 是因为我只设置了吗? 或者这是怎么回事? 我的目标是建立一个滚动配置,记录最近5次应用程序运行的情况。

  • 问题内容: 第一次使用Java开发,第一次使用Android开发,因此这是一个新手问题。 我目前有以下代码: 简短问题: 什么是 的.class 属性来完成,f.ex. 在’ C = NewTourny 的.class ‘? 为什么我不能将c转换为Tourny(所有这些类的父类)? 长问题: 目前,这可以处理整个应用程序中的所有按钮导航,并且工作正常。但是,如您所见,当我将c强制转换为Class时

  • 我想让导航栏贴在视区的顶部,一旦用户滚动页面,但它不起作用,我不知道为什么。如果你能帮忙,这里是我的HTML和CSS代码: null null

  • 问题内容: 我已经成功地使用了Python属性,但看不到它们如何工作。如果我取消引用类之外的属性,我只会得到一个类型的对象: 但是,如果我将一个属性放在一个类中,则行为会大不相同: 我注意到未绑定仍然是对象,因此类实例化必须在做魔术,但是那是什么魔术呢? 问题答案: 正如其他人指出的那样,它们使用称为描述符的语言功能。 当您通过类访问实际属性对象时,返回该属性对象的原因在于该属性如何实现特殊方法:

  • 我们知道,在maven项目中,我们可以设置以下属性来为插件maven-compiler-plugin指定java版本: 问题是,如果要使用上述属性,我们是否应该在本地安装jdk8呢?