<%
String fname=request.getParameter("fname");
String username=getVal("lname");
%>
<%!
private String getVal(String param){
return request.getParameter("fname");
}
%>
/*
--err
org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP
PWC6197: An error occurred at line: 5 in the jsp file: /register.jsp
PWC6199: Generated servlet error:
string:///register_jsp.java:12: cannot find symbol
symbol : variable request
location: class org.apache.jsp.register_jsp
/*
答案 0 :(得分:22)
JSP通过JSP编译器将JSP页面转换为servlet,自动生成java代码。
JSP指令指示JSP编译器放置什么。 <% %>
内的所有内容(称为 JSP scriptlet )都将放在生成的servlet的service()
方法中。 <%! %>
内的所有内容(称为 JSP声明)都将成为生成的servlet的实际类的一部分,因此getVal()将成为实例方法。
标准request
(以及session
和pageContext
等)对象实例在service()
方法中定义,因此它们实际上只在JSP scriptlet部分中可用
例如,如果您在Tomcat上运行,那么如果查看Tomcat安装中的“work”目录,可以查看JSP页面的实际生成的Java代码。可能会很有趣,如果没有更好地了解“引擎盖下”正在发生的事情。
答案 1 :(得分:14)
请求可以在scriptlet表达式中访问,因为它是评估这些表达式的方法的参数(_jspService
)。但是如果你想让它在你自己的方法中可用,你必须将它声明为一个参数:
<%
String fname = request.getParameter("fname");
String username = getVal("lname", request);
%>
<%!
private String getVal(String param, HttpServletRequest request) {
return request.getParameter("fname");
}
%>
请注意,您不应该首先使用scriptlet并在JSP中获取请求参数。应该使用JSP来生成标记。在servlet / action中进行处理,通过在请求范围中创建和填充bean来准备JSP显示的数据,然后分派给JSP,JSP应该专门使用JSP EL,JSTL和其他自定义标记。