jsp的范围:useBean

针对home.jsp

   

include.jsp

  

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

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

在您的特定情况下,只需创建一个真正的 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()

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

 

User name: ${user.name}

${user}引用与任何请求/会话/应用程序属性密钥user相关联的对象。 这在幕后制作jspContext.findAttribute("user") 。 当返回的User实例符合javabean规范时, ${user.name}将调用User实例上的getName()方法,EL将显示其结果。

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

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

  • Sun Java EE教程第二部分1-8章 。
  • Coreservlets.com JSP / Servlet教程 。
  • Head First Servlets和JSP书 。

希望这可以帮助。

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

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

在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。