Java JSP在哪里初始化?

Java JSP在哪里初始化?,java,jsp,initialization,Java,Jsp,Initialization,我有一个很好的项目。我不明白它在哪里初始化JSP的变量?没有豆子。我们只有Java类。JSP调用java类的变量,但如何调用?我搜索了所有的配置文件,但什么也没找到 public class Bookstore { private final Map<String, Item> items = new TreeMap<String, Item>(); private String name; public Booksto

我有一个很好的项目。我不明白它在哪里初始化JSP的变量?没有豆子。我们只有Java类。JSP调用java类的变量,但如何调用?我搜索了所有的配置文件,但什么也没找到

public class Bookstore {    
    private final Map<String, Item> items = new TreeMap<String, Item>();
    
    private String name;
    
    public Bookstore() {
        setName("Otel Sheriton");
    }
    
    public void setName(String name) {
        this.name = name;
    }
}
公共类书店{
私有最终映射项=新树映射();
私有字符串名称;
公共书店(){
setName(“奥特雪利顿”);
}
公共void集合名(字符串名){
this.name=名称;
}
}
这是我的jsp文件:

.....
<body>

    <h1>${it.name}</h1>
 ......

</body>   
。。。。。
${it.name}
......
${it.name}的意思是:从BookStore的一个对象获取变量“name”

因此,如何以及在何处识别${it}

如果将代码放入scriptlet(较旧的标记),JSP编译器会将它们转换为_jspService()方法。每当客户端直接访问JSP页面,或者在容器内部使用服务器端转发或包含访问JSP页面时,都会调用此方法

无法重写_jspService()方法。JSP编译器按照JSP页面中代码出现的顺序创建服务方法体。因此,变量被创建为局部变量,并在每次调用服务方法时初始化

在使用较旧的标记或较新的jsp:declaration标记来定义方法的情况下,将在执行声明的方法时创建并初始化变量

顺便说一下,所有隐式变量都将由容器初始化

有关此行为的其他详细信息,请参见和

如果您想知道容器是如何初始化和使用JspPage和HttpJspPage类的,您必须阅读容器源代码。然而,JSP规范(JSP容器契约的第11章)定义了JSP容器如何初始化和创建JSP页面。通常,page类本身的初始化只完成一次;此时将调用jspInit()。当页面被销毁时,通常在应用程序或容器关闭时,会在页面被销毁之前调用jspDestroy()方法

更新


EL表达式最终通过尝试找到bean。要使用的变量应该在适当的范围内声明和初始化。JavaBean组件可以使用初始化。其他对象应该在servlet或scriptlet中声明和初始化。

${it.name}表示从对象中获取属性名,该属性名可以作为命名属性找到

例如,可以在您的请求或会话中找到。这基本上可以理解为

((Bookstore) pageContext.findAttribute("it")).getName()
这将按顺序搜索页面、请求、会话(如果有效)和应用程序范围中的命名属性,并返回关联值或null

因此,在转到JSP之前,必须将对象放置在所需的范围内,例如

request.setAttribute("it", bookStoreObj)

我假设您使用MVC,因此在选择JSP之前,控制器的工作就是将其放入作用域中。

您知道的JSP被编译成servlet。JSP中定义的变量将进入已编译的servlet类。
您应该检查正在使用的服务器的文档,并查看已编译的servlet类。如果是.class文件,您可以反编译并检查。

使用标记在JSP中声明变量可能会导致问题,因为它们不是线程安全的。您的JSP被转换为一个在客户端之间共享的Servlet,并且该声明不会在_jspService()中创建局部变量,而是在Servlet对象中创建一个字段。是的,在标记中声明变量是一种不好的做法。您能举个例子吗。如果我有一个类book,而stringauthor是这个类的变量,那么我如何初始化这个author来auth以用于jspI呢?我想您应该提供更多细节。从你的评论和你的问题来看,不清楚你到底想做什么。把你的问题编辑得更具体一些,也许可以发布一些代码。您只想初始化某个对象的数据,以便稍后在JSP中显示它,或者您是否对应用程序的具体操作细节感兴趣?