首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsp的作用域:useBean

jsp的作用域:useBean
EN

Stack Overflow用户
提问于 2009-12-06 22:16:59
回答 3查看 15.4K关注 0票数 0

home.jsp

代码语言:javascript
复制
<jsp:useBean id="username" class="java.lang.String" scope="application"/>

<%
      username="Jitendra";
%>

<jsp:include page="include.jsp"/>

include.jsp

代码语言:javascript
复制
<%=username%>

即使Bean的作用域是应用程序…,这也会给出一个错误,指出“username”在Bean中未定义

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-06 22:48:51

至于你的问题,你使用老式的scriptlet在本地声明的任何东西都是,而不是用jsp:useBean链接的。此外,如果声明本地scriptlet变量在包含的页面中不可见,则至少需要显式地将它们放入作用域中。因为使用scriptlet是一个。我建议你完全忘记这件事。

在您的特定情况下,只需创建一个真正的java bean来保存数据。也就是说,具有(隐式)默认构造函数和私有属性的类由公共getter/setter公开。下面是一个基本的例子:

代码语言:javascript
复制
public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

然后,您可以使用servlet类来预处理请求。为此,您可以使用servlet的doGet()方法。

代码语言:javascript
复制
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    User user = new User();
    user.setName("Jitendra");
    request.setAttribute("user", user); // Store in request scope.
    request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}

web.xml中的这个servlet映射到例如/showurl-pattern上。然后,http://example.com/context/show应该可以访问这个servlet,并且它的doGet()将立即执行。

然后,使用下面的代码行更改/创建您放在/WEB-INF中的show.jsp文件,以防止直接访问(这样客户机就不能通过http://example.com/context/show.jsp访问它,而是被“强制”调用servlet):

代码语言:javascript
复制
<p>User name: ${user.name}</p>

${user}是指与任何请求/会话/应用属性键user相关联的对象。这是在jspContext.findAttribute("user")的幕后完成的。由于返回的User实例符合javabean规范,因此${user.name}将调用User实例上的getName()方法,EL将显示其结果。

哦,我要补充的是,您不需要jsp:useBean来完成此操作,因为servlet已经创建了所需的bean,并将其放入作用域中。

也就是说,我建议从一本像样的JSP/Servlet教程/书开始。示例:

希望这能有所帮助。

票数 15
EN

Stack Overflow用户

发布于 2009-12-06 22:26:41

您的代码是“邪恶的”,因为java.lang.String并不是真正的bean。值得注意的是,它没有一个"set“方法来改变它的文本(这是有意的,它意味着它是不可变的)。

访问bean的方式是声明一个bean,然后使用它的属性(即get()和set()方法后面的名称)来更改它。您不能直接更改实际的bean实例,只能更改它的值。

票数 1
EN

Stack Overflow用户

发布于 2009-12-06 23:20:47

在Tomcat6上,home.jsp被转换为Servlet代码:

代码语言:javascript
复制
java.lang.String username = null;
synchronized (application) {
  username = (java.lang.String) _jspx_page_context.getAttribute("username", 
                                                  PageContext.APPLICATION_SCOPE);
  if (username == null){
    username = new java.lang.String();
    _jspx_page_context.setAttribute("username", username,
                                                  PageContext.APPLICATION_SCOPE);
  }
}

username="Jitendra"; 

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, 
                                                 "include.jsp", out, false);

尽管行为是相同的,但生成的确切代码取决于应用程序服务器实现。

本地username变量的作用域不会扩展到将从include.jsp生成的Servlet中。您没有将值"Jitendra“设置到应用程序范围中,而只是设置了本地变量的值。

正如其他人所指出的,不可变的字符串并不是一个非常好的bean。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1855507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档