主页.jsp
<jsp:useBean id="username" class="java.lang.String" scope="application"/>
<%
username="Jitendra";
%>
<jsp:include page="include.jsp"/>
包含.jsp
<%=username%>
这给出了一个错误,说“用户名”在 include.jsp 中未定义,即使 Bean 的范围是应用程序......</p>
主页.jsp
<jsp:useBean id="username" class="java.lang.String" scope="application"/>
<%
username="Jitendra";
%>
<jsp:include page="include.jsp"/>
包含.jsp
<%=username%>
这给出了一个错误,说“用户名”在 include.jsp 中未定义,即使 Bean 的范围是应用程序......</p>
至于您的问题,您使用老式 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
. 然后应该可以访问这个 servlet,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 教程/书开始。例子:
希望这可以帮助。
您的代码是“邪恶的”,因为 ajava.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
. 您没有将值“Jitendra”设置到应用程序范围内,而只是设置局部变量的值。
正如其他人指出的那样,不可变的 String 并不是一个很好的 bean。