Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp Can';t访问“;“请求”;对象,除非我将其限定为pageContext.request?_Jsp_El - Fatal编程技术网

Jsp Can';t访问“;“请求”;对象,除非我将其限定为pageContext.request?

Jsp Can';t访问“;“请求”;对象,除非我将其限定为pageContext.request?,jsp,el,Jsp,El,我正在尝试访问JSP中的查询参数。直接使用request.getParameter()不起作用,但使用pageContext.request.getParameter()可以正常工作。似乎隐式的请求对象并不是直接可用的,不管文档怎么说 我可以解决这个问题,如图所示,但想知道为什么这不是预期的工作 我的JSP代码如下所示: <!DOCTYPE html> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"

我正在尝试访问JSP中的查询参数。直接使用
request.getParameter()
不起作用,但使用
pageContext.request.getParameter()
可以正常工作。似乎隐式的
请求
对象并不是直接可用的,不管文档怎么说

我可以解决这个问题,如图所示,但想知道为什么这不是预期的工作

我的JSP代码如下所示:

<!DOCTYPE html>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test.jsp</title>
    </head>

    <body>
        <jsp:text>param.username=${param.username}</jsp:text>
        <br/>
        <jsp:text>pageContext.request.getParameter("username")=${pageContext.request.getParameter("username")}</jsp:text>
        <br/>
        <jsp:text>request.getParameter("username")=${request.getParameter("username")}</jsp:text>
        <br/>
        <c:choose>
            <c:when test="${empty request}">
                <jsp:text>request is empty!</jsp:text>
            </c:when>
            <c:otherwise>
                <jsp:text>request is NOT empty!</jsp:text>
            </c:otherwise>
        </c:choose>
        <br/>
        Using a scriptlet, request.getParameter("username")=<%= request.getParameter("username") %>
        <br/>
        Using a "jsp:expression" tag, request.getParameter("username")=<jsp:expression>request.getParameter("username")</jsp:expression>
        <br/>
    </body>
</html>
如果仔细查看生成的HTML并将其与JSP进行比较,可以看到
request.getParameter()
不起作用,但
pageContext.request.getParameter()
起作用。此外,检查请求是否为空表示它为空/null,因此其余结果是一致的(如果错误且令人讨厌,则为IMHO)

作为参考,我的代码部署到Tomcat 8.0.32,我通过Maven使用以下JSTL库:

    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-spec</artifactId>
        <version>1.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-impl</artifactId>
        <version>1.2.5</version>
    </dependency>

org.apache.taglibs
taglibs标准规范
1.2.5
org.apache.taglibs
taglibs标准impl
1.2.5
查看Tomcat的work/Catalina dir中生成的java代码,我看到了以下有趣的代码行,根据我的源JSP显示了引用请求对象的不同方式:

  out.write("        param.username=");
  out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${param.username}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        pageContext.request.getParameter(\"username\")=");
  out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${pageContext.request.getParameter(\"username\")}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        request.getParameter(\"username\")=");
  out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${request.getParameter(\"username\")}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        ");
  if (_jspx_meth_c_005fchoose_005f0(_jspx_page_context))
    return;
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        Using a scriptlet, request.getParameter(\"username\")=");
  out.print( request.getParameter("username") );
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        Using a \"jsp:expression\" tag, request.getParameter(\"username\")=");
  out.print(request.getParameter("username"));
out.write(“param.username=”);
out.write((java.lang.String)org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(${param.username}),java.lang.String.class,(javax.servlet.jsp.PageContext)jspxpagecontext,null));
输出。写入(“\n”);
out.write(“
\n”); out.write(“pageContext.request.getParameter(\“username\”)=”); out.write((java.lang.String)org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluation(${pageContext.request.getParameter(\'username\')),java.lang.String.class,(javax.servlet.jsp.pageContext)\'jspx\'page\'context,null)); 输出。写入(“\n”); out.write(“
\n”); out.write(“request.getParameter(\“username\””); out.write((java.lang.String)org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluation(${request.getParameter(\'username\')),java.lang.String.class,(javax.servlet.jsp.PageContext)\u jspx\u page\u context,null)); 输出。写入(“\n”); out.write(“
\n”); 请写出(“”); 如果(_jspx_meth_c_005fchoose_005f0(_jspx_page_context)) 返回; 输出。写入(“\n”); out.write(“
\n”); out.write(“使用scriptlet,request.getParameter(\“username\”)=”); 打印(request.getParameter(“用户名”); 输出。写入(“\n”); out.write(“
\n”); write(“使用\“jsp:expression\”标记,request.getParameter(\“username\””); 打印(request.getParameter(“用户名”);

有没有想过为什么我不能像预期的那样直接引用
请求
对象?

没关系——看看真实的文档,请求对象不应该直接可用——它应该是pageContext对象的子对象。我刚才看到的教程都错误地指出请求对象是可以直接访问的。

没关系——看看真实的文档,请求对象不应该直接可用——它应该是pageContext对象的子对象。我看到的教程都错误地指出请求对象可以直接访问。

请求对象可以直接从Scriptlet访问,但不能在表达式语言表达式中访问。请求对象可以直接从Scriptlet访问,但不能在表达式语言表达式中访问。
  out.write("        param.username=");
  out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${param.username}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        pageContext.request.getParameter(\"username\")=");
  out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${pageContext.request.getParameter(\"username\")}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        request.getParameter(\"username\")=");
  out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${request.getParameter(\"username\")}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        ");
  if (_jspx_meth_c_005fchoose_005f0(_jspx_page_context))
    return;
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        Using a scriptlet, request.getParameter(\"username\")=");
  out.print( request.getParameter("username") );
  out.write("\n");
  out.write("        <br/>\n");
  out.write("        Using a \"jsp:expression\" tag, request.getParameter(\"username\")=");
  out.print(request.getParameter("username"));