(jsp)脚本什么时候运行(Java)代码?

(jsp)脚本什么时候运行(Java)代码?,java,jsp,scriptlet,Java,Jsp,Scriptlet,我正在处理如下代码中的空指针异常: <% SessionData session = getSessionData(request); Webpage webPage = null; if (session!= null) { webPage = session.getWebPage(); } %> <script type="text/javascript"> //NullPointer happens here, webPage is null when

我正在处理如下代码中的空指针异常:

<%
SessionData session = getSessionData(request);
Webpage webPage = null;
if (session!= null) {
    webPage = session.getWebPage();
}
%>

<script type="text/javascript"> 

//NullPointer happens here, webPage is null when the session is lost
<tags:ComboBox
    comboBox="<%=webPage.getComboBox()%>" />

</script>
括号内的
组合框
标记的scriptlet是否不再运行?我认为它仍然会尝试将组合框从网页上删除,最终仍然会得到一个空指针。我认为Scriptlet在实际运行代码之前都会得到它们的值,这是错误的吗


(我只是想提一下,有一个包含的脚本,如果没有会话,它会重定向页面。我在第一段代码中得到一个空指针,在第二段代码中正确重定向)

简言之,您对标记库和scriptlet的处理顺序不正确;JSP编译器首先识别JSP指令,然后解析和呈现标记库输出,然后将scriptlet中没有的所有内容转换为写入页面的一组静态字符串,然后围绕现有scriptlet代码将生成的Java文件缝合在一起,如下所示:

// start of class and _jspService method declaration omitted for brevity

    out.write("<html>\n");
    out.write("\t<head>\n");
    out.write("\t<title>Example Static HTML</title>\n");

// comment inside a scriptlet block
int x = request.getParameter("x");
pageContext.setParameter("x", x);

    out.write("\t</head>\n");
//为了简洁起见,省略了类的开始和_jspService方法声明
输出。写入(“\n”);
out.write(“\t\n”);
out.write(“\t示例静态HTML\n”);
//scriptlet块中的注释
intx=request.getParameter(“x”);
设置参数(“x”,x);
out.write(“\t\n”);
这里的问题源于这样一个事实:首先要解决标记库,并且隔离和计算它们的代码不关心scriptlet块或DOM。在您的例子中,
标记只认为scriptlet是一个常规字符串

您应该做的是将scriptlet中的值公开给标记库使用的可访问范围;例如,对于JSTL,您需要通过
pageContext.setAttribute(“varName”,value)
将其添加到页面上下文中


查看更多详细信息。

servlet容器会动态地将JSP编译为servlet

这个编译实际上是一种简单的反转:

TEXT1
文本2
文本3
这是为了:

out.print(“TEXT1”);
java代码
打印(“文本2”);
打印(java表达式);
打印(“文本3”);
所以当你说:

TEXT1
文本2
文本3
你会得到:

out.print(“TEXT1”);
如果(真){
打印(“文本2”);
}
打印(“文本3”);
为了清晰起见,对上述示例进行了简化,例如忽略换行符,不包括样板servlet设置,也不包括标记库执行的复杂性

// start of class and _jspService method declaration omitted for brevity

    out.write("<html>\n");
    out.write("\t<head>\n");
    out.write("\t<title>Example Static HTML</title>\n");

// comment inside a scriptlet block
int x = request.getParameter("x");
pageContext.setParameter("x", x);

    out.write("\t</head>\n");