2011-08-24 39 views
10
<% 
    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 
/* 

回答

21

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

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

标准request(和sessionpageContext等)对象实例的service()方法内定义,以便它们在效果,仅提供JSP脚本部分的内部。

如果您在Tomcat上运行,例如,如果您查看Tomcat安装中的“work”目录,则可以查看JSP页面实际生成的Java代码。可能会很有趣,如果不能更好地了解“引擎盖下”发生的事情。

14

请求是scriptlet的表达式内访问,因为它是在这些表达式进行求值方法(_jspService)的参数。但是,如果你希望它是在自己可用的方法,你必须声明它作为一个参数:你不应该使用小脚本,并在第一时间获取JSP中请求参数

<% 
    String fname = request.getParameter("fname"); 
    String username = getVal("lname", request); 
%> 
<%! 
    private String getVal(String param, HttpServletRequest request) { 
     return request.getParameter("fname"); 
    } 
%> 

注意。应该使用JSP来生成标记。在servlet/action中执行处理,通过在请求范围中创建并填充bean准备要由JSP显示的数据,然后分派到JSP,该JSP应该仅使用JSP EL,JSTL和其他自定义标记。