站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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编译”引起的,明白了!


↑返回目录
前一篇: 超简单问题,有关自动生成id号返回问题
后一篇: 需要你们的帮助(java)