jsp的范围:useBean

时间:2009-12-06 14:16:59

标签: java jsp jsp-tags java-ee-6 jspinclude

针对home.jsp

<jsp:useBean id="username" class="java.lang.String" scope="application"/>

<%
      username="Jitendra";
%>

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

include.jsp

<%=username%>

这给出了一个错误,即在include.jsp中未定义“username”,即使Bean的范围是应用程序......

3 个答案:

答案 0 :(得分:14)

关于您的问题,您使用旧式scriptlet在本地声明的任何内容都 jsp:useBean相关联。此外,在包含的页面中声明本地scriptlet变量可见,您需要至少将它们显式放入请求范围。使用scriptlet是bad practice。我建议完全忘掉它。

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

public class User {

    private String name;

    public String getName() {
        return name;
    }

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

}

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

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);
}

将此servlet映射到web.xml上的url-pattern,例如/show。然后,http://example.com/context/show可以访问此servlet,并立即执行其doGet()

然后更改/创建放在show.jsp中的JSP文件/WEB-INF,以防止直接访问(以便客户端无法通过http://example.com/context/show.jsp访问它,但被“强制”调用servlet),包含以下行:

<p>User name: ${user.name}</p>

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

哦,我应该补充一下,你为此做了需要jsp:useBean,因为servlet已经创建并将所需的bean放在范围内。

那就是说,我建议从一个体面的JSP / Servlet教程/书开始。例子:

希望这有帮助。

答案 1 :(得分:1)

你的代码是“邪恶的”,因为java.lang.String实际上并不是一个bean。值得注意的是,它没有“设置”方法来改变它的文本(这是有意的,它意味着是不可变的)。

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

答案 2 :(得分:1)

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

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”设置到应用程序范围中,仅设置局部变量的值。

正如其他人所指出的那样,不可变的String不会成为一个非常好的bean。