如何在jsp中的函数中使用“request”对象

时间:2011-08-24 06:49:30

标签: jsp

    <%
    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
/*

2 个答案:

答案 0 :(得分:22)

JSP通过JSP编译器将JSP页面转换为servlet,自动生成java代码。

JSP指令指示JSP编译器放置什么。 <% %>内的所有内容(称为 JSP scriptlet )都将放在生成的servlet的service()方法中。 <%! %>内的所有内容(称为 JSP声明)都将成为生成的servlet的实际类的一部分,因此getVal()将成为实例方法。

标准request(以及sessionpageContext等)对象实例在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和其他自定义标记。