Jsp Can';t访问“;“请求”;对象,除非我将其限定为pageContext.request?
我正在尝试访问JSP中的查询参数。直接使用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"
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"));