一尘不染

jsp:useBean的范围

jsp

home.jsp

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

<%
      username="Jitendra";
%>

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

include.jsp

<%=username%>

这给出了一个错误,指出即使在Bean的范围是application的情况下,include.jsp中也没有定义“ username”。


阅读 269

收藏
2020-06-08

共1个答案

一尘不染

对于您的问题,您使用老式scriptlet在本地声明的任何内容都 不会
与链接jsp:useBean。另外,声明本地scriptlet变量在包含的页面中 可见,您需要至少将它们明确地放入请求范围内。因为使用scriptlet是一个_坏习惯_ 。我建议完全忘记它。

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

public class User {

    private String name;

    public String getName() {
        return name;
    }

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

}

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

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映射到上。然后,该servlet应该可以被servlet访问,并且可以立即执行。url- pattern``/show``http://example.com/context/show``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教程/书开始。例子:

希望这可以帮助。

2020-06-08