JSP内のクエリパラメータにアクセスしようとしています。 request.getParameter()
を直接使用すると動作しませんが、pageContext.request.getParameter()
を使用すると期待どおり動作します。これは暗黙のrequest
オブジェクトは、ドキュメントが示唆しているものの、直接利用可能ではないようです。JSPで「request」オブジェクトにアクセスすることはできません。ただし、pageContext.requestとして修飾する必要はありませんか?
私はこれを回避することができますが、これが期待どおりに機能しない理由を知りたいと思います。
<!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>
そしてhttp://localhost:8080/jsp_fun/test.jsp?username=roy
のURLを使用して、次のように負荷の結果は、このページには、次のとおりです。次のように
私のJSPコードです。あなたが生成されたHTMLをよく見るとJSPと比較した場合
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test.jsp</title>
</head>
<body>
param.username=roy
<br/>
pageContext.request.getParameter("username")=roy
<br/>
request.getParameter("username")=
<br/>
request is empty!
<br/>
Using a scriptlet, request.getParameter("username")=roy
<br/>
Using a "jsp:expression" tag, request.getParameter("username")=roy
<br/>
</body>
</html>
、あなたはrequest.getParameter()
が動作しないことがわかりますが、pageContext.request.getParameter()
はありません。同様に、リクエストが空であるかどうかを確認することは、それが空/ヌルであることを示します。結果の残りの部分は一貫しています(間違っていてIMHOの場合)。
と参照のため、私のコードは、Tomcatを8.0.32に展開されており、私はMavenを経由して、次のJSTLのlibを使用しています:
Tomcatの仕事/カタリナディレクトリで生成されたJavaコードを見てみると<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>
を、私はJSP私のソースに応じて、リクエスト・オブジェクトが参照されていることをさまざまな方法を示し、次のコード興味深いの行を参照してください。予想通り、私は直接request
オブジェクトを参照することができない理由について
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"));
任意の考え?
要求オブジェクトはスクリプトレットから直接アクセスできますが、式言語式ではアクセスできません。 –