考虑这行jsp代码:
function clearCart(){
cartForm.action="cart_clear?method=clear";
cartForm.submit();
}
显然,它试图在后端调用一个方法来清除购物车。我的问题是服务(Tomcat最有可能,如果我错了,请纠正我)如何托管这个包含这段代码的网站知道如何以及在哪里找到这个方法,它如何用字符串值“索引”它等等。在我的java文件中,clear方法定义为:
public String clear( )
{
this.request = ServletActionContext.getRequest();
this.session = this.request.getSession();
logger.info("Cart is clearing...");
Cart cart = ( Cart ) this.session.getAttribute(Constants.SESSION_CART );
cart.clear();
for( Long id : cart.getCartItems().keySet() )
{
Item it = cart.getCartItems().get(id);
System.out.println( it.getProduct().getName() + " " + it.getNumber()
);
}
return "cart";
}
Tomcat通过哪个模块/什么机制知道如何精确定位该方法?通过复制在线教程和教科书,我知道如何编写这些代码,但我想更接近底部,或者至少是非常基本的东西。
这是我受过教育的(或者不是那么多)猜测:因为我的整个项目基于struts,hibernate和spring,所以我无意中/总是以这样的方式配置构建路径和依赖关系,当我点击“编译“按钮,所有”关联“和”导航“都是由这些框架完成的,换句话说,只要我正确配置项目并获得弹簧等”参与“(抱歉,我想不出那个技术术语)这是我的舌尖),只要我继承一个类或实现一个接口,在编译时,编译器会将这些java方法暴露给jsp脚本 - 这是编译器完成的工作,部分工作由组成春天框架的人。或者,使用一个非常糟糕的类比,考虑一个C ++项目,你使用第三方库,它是以编译的二进制形式,你所要做的就是做正确的包含(.h / .hpp文件)并调用正确的函数并且在调用这些函数时你会在运行时获得该函数 - 注意这实际上是一个非常糟糕的类比。
它是如何完成的,还是我过度思考它?例如,它全部由Tomcat处理?
抱歉所有的冗长。当你需要表达稍微复杂和细微差别的想法时,事情会变得冗长。另外 - 请深入去低级别不要太深,我的意思是你可以自由地讲授如何休眠和弹簧等工作,它的代码如何在服务器上运行,但尽量不要触摸java美德机器,字节码和C ++指针等,除非当然有用。
提前致谢!
答案 0 :(得分:0)
除了遵守Servlet规范之外,Tomcat没有做太多工作。 Spring告诉Tomcat所有对http://myserver.com/
的请求都应该指向Spring的DispatcherServlet
,这是主要的切入点。
然后由Spring进一步将这些请求引导到处理它们的代码。将特定URL映射到处理请求的代码有不同的策略,但它不是一成不变的,您可以轻松创建自己的策略,允许您使用您想要的任何类型的URL。对于一个简单(和愚蠢)的例子,你可以让http://myserver.com/1
在一个大规模的处理程序类中执行第一个方法,http://myserver.com/2
将执行第二个,等等。
示例是Spring,但它与其他框架的概念相同。您有一个将URL映射到处理程序代码的映射器。
现在它们全都隐藏在抽象层之下,因此您不必关心映射的细节,可以快速开发并专注于业务代码。