关于jsp:set/getProperty底层实现的探究
今天上课讲到<jsp:useBean>时涉及到了<jsp:setProperty>和<jsp:getProperty>两个标签。使用它俩可以获取和修改JavaBean中Java类的属性值,后面例子中又给出了直接调用Java类方法获取和修改属性值的方法,我们发现二者结果是一样的,旁边的hyx给出了关键性的问题,setP和getP实现机制和类方法调用一致吗?我心生疑问。
我们来一探究竟:
1. 起初我先注释掉*.Java文件中setXXX()和getXXX()方法,然后运行jsp,看会发生什么。
发现会在setProperty()以及getProperty()那里报错。
我感觉setP()和getP()底层实现应该会是调用了Java类中的方法,但依水老师持不同观点,她认为setP()和getP()应该另有一套机制。
2. 查找资料后发现,Servlet会为jsp生成Java文件,我们去找找答案。
来到eclipse-workplace(你自己的eclipse-workplace目录)
->.metadata->.plugins->org.eclipse.wst.server.core->tmp0->work->Catalina->localhost->first->org->apache->jsp->yourfilename_jsp.java
我们来比较一下
*.Jsp
我们可以看出,具体实现的时候,是用pageContext的findAttribute方法找对应类,然后调用该类方法来实现的setProperty()和getProperty()。
3. 我们再来对比一下直接调用类方法和getP()
在生成Java代码时,直接调用类方法……清爽整洁,而setP()和getP()……存在即合理吧!
总结:
1. jsp:set/getProperty在代码生成的时候是经由pageContext找到类(对象)然后调用其类方法实现的。而不是有其他什么magic 操作!
2. 速度上来讲,看的出来(jsp标签手续繁多)比直接调用类方法慢的多!!!
参考资料:
[1]如何找到Servlet编译jsp生成的*.java文件
https://blog.csdn.net/qq_39021393/article/details/81108916
[2]点子的来源