当前页面: 开发资料首页 → J2EE 专题 → 找不到好答案!!getServletContext()不是一个静态方法,为什么jsp中可以直接调用呢?
找不到好答案!!getServletContext()不是一个静态方法,为什么jsp中可以直接调用呢?
摘要: 找不到好答案!!getServletContext()不是一个静态方法,为什么jsp中可以直接调用呢?
在jsp页面中可以如下调用:
String content=(String)getServletContext().getAttribute(...);
getServletContext()不是一个静态方法,为什么能直接调用呢?
此外,jsp页面中0如果写成this.getServletContext().getAttribute(...);也是对的,这里的this是什么对象啊?
一个Jsp页面会被编译成一个Servlet类,运行时响应某个用户请求的那个对象,就是该类的一个实例。
this是jsp页面对象,当然实际上执行的时候,jsp会被编译成servlet来执行,所以实际上this是一个servlet。由于你的jsp页面对象已经存在了,所以getServletContext()可以被调用。
session request怎么能直接用呢?一样的道理
这些都是JSP容器协助自动完成的,如果感兴趣的话,当然可以找一些资料来深入研究一下JSP技术。没兴趣的话知道有那么回事,知道还有别的模块会对它进行处理就行了。
其实JSP页面离一个JAVA“类”的格式差得远远的呢,想想也知道,肯定是有别的模块做了别有手脚。。
jsp会被解析为servlet的class,找到解析后java源文件看看就明白怎么回事了。
我也有过上面的考虑,jsp编译成servlet,this指servlet对象,而getContextServlet做为该对象的方法,通过this.getServletContext调用是可以的。但问题是:getContextServlet()不是静态方法,调用时为什么可以不加“对象名.”呢?
____________________________________________________________________________________
至于
jihanzhong(逍遥) ( ) 信誉:100 Blog 2006-08-30 14:33:00 得分: 0
session request怎么能直接用呢?一样的道理
那是因为session request是内建对象,当然可以直接调用,但getContextServlet是方法,没有内建方法一说,可以直接调用的方法只有静态方法,不是吗?
____________________________________________________________________________________
所以这个问题还是没问清,希望有人继续解答,谢谢。
我已经告诉你了,你看看解析成的java源码就明白了,jsp不是类,它不符合java类的所有特性。
如果你能写一个解析程序的话,完全可以不用jsp写程序,写成任何你想要得程序,只要最好解析成java源码的时候符合java类的规则就可以了。
to flyforlove:
我用tomcat,解析文件是不是在tomcat的work文件夹啊?
我看过解析后的.java文件了,不用this的调用解析如下:
String content=(String)getServletContext().getAttribute(new String("chatTopic_1"));
用this的调用解析如下:
String content=(String)this.etServletContext().getAttribute(new String("chatTopic_1"));
请问,这样说明什么问题吗?解析过的仍然用this调用,这符合java规则吗?
又或者我找到的解析文件错了?继续糊涂...
请来过路过的继续关注下,谢谢!
你找到的事对的亚,getServletContext()本来就是祖先类里的方法,这儿用不用this都一样呀,
即使你省略不用,编译成class的时候,也会帮你加上的
你所谓的不符合规则是指的问什么有this么?
是,父类方法在子类调用时,可以直接调用吗?
____________________________________________________________________________________
至于
jihanzhong(逍遥) ( ) 信誉:100 Blog 2006-08-30 14:33:00 得分: 0
session request怎么能直接用呢?一样的道理
那是因为session request是内建对象,当然可以直接调用,但getContextServlet是方法,没有内建方法一说,可以直接调用的方法只有静态方法,不是吗?
____________________________________________________________________________________
所以这个问题还是没问清,希望有人继续解答,谢谢。
好吧, 那我说getContextServlet是“内建”方法,你是不是明白了呢?
看来这不是jsp的问题,是你自己对java的继承知识还没有一个基本的认识。
父类的public方法(当然不只这一种)就可以当成自己的方法用,要不要继承做什么。
为什么你觉得用this调用就有问题呢?
上面笔误了,我认为没有this调用有问题。
抛开jsp来说,一个方法要调用不是都要由一个"对象名."来引出吗?(静态方法除外)
那么这样直接调用getServletContext方法不就有问题了吗?
问题就在于JSP页面中的语句最终相当于被整理到一个类的某个方法中,而在类的方法中调用类本身的另一个方法当然不一定要写“this”。
public class A{
public A(){
}
public void greeting(){
System.out.println("hello");
}
}
public class B extends A{
public B(){
greeting();
}
public static void main(String[] args){
new B();
}
}
c:>java B
hello
"一个方法要调用不是都要由一个"对象名."来引出吗?(静态方法除外)" ---引用楼主的话
照这种说法 在 B的构造子里面 调用greeting() 是不合法的 咯????? 因为greeting()不是static的
试试看就知道了麻
????????????????
“父类的public方法(当然不只这一种)就可以当成自己的方法用,要不要继承做什么。
”
注意这句话。
另外,didoleo(冷月无声) 也把例子给你举出来了。
一个方法要调用不是都要由一个"对象名."来引出吗?
它不是没用,而是用了,但是是隐含的用,这个对象名就是this
在类中调用这个类的方法,是隐含一个this的,也就是所有的调用实际上都是:this.方法名
我记得在JAVA编程思想一书中有说隐含this的
getServletContext()是来自父类com.caucho.jsp.JavaPage中的方法
因为每个jsp页面都继承com.caucho.jsp.JavaPage,因此继承了com.caucho.jsp.JavaPage的getServletContext()方法,
揭帖吧
好多星星(),哈哈,最近搞Delphi,过来看看,怀念啊.
我想扁人了
晕,你写的jsp不过是java的一个方法,而且是实例方法,当然可以调用其它方法了
楼主不要钻牛角尖嘛~~
是啊是啊。比如:
public class A {
public void f1() { ... }
public void f2() {
f1(); //瞧见了不?不用对象名有时也可以调用方法。:D
}
}
没必要深究这些吧,清楚了又如何,不清楚又如何呢
didoleo的代码验证了。
steedhorse(晨星) :"问题就在于JSP页面中的语句最终相当于被整理到一个类的某个方法中,而在类的方法中调用类本身的另一个方法当然不一定要写“this”。"也很有道理
还有flyforlove辛苦了。
谢谢所有人,我想这次问题就是“子类调用父类方法+jsp编译”引起的,明白了!