服务器端mvc框架是怎样接收请求的?
2014-04-10 18:20
218 查看
问题:服务器端mvc框架是怎么接收请求的?
即:客户端浏览器发出request请求,服务器收到请求,并将请求交给应用程序处理,之后把处理结果返回给客户端作为应答。
当我们输入:192.168.0.100:8080/csdn/index.do时,ip地址定位到服务器所在的主机,8080端口定位到服务器(类似apache的软件服务器),而csdn指向当前服务器下部署的某一应用,index.do则是具体的路由到哪个控制器。问题出在服务器到控制器间,也就是上图A阶段末期,应用程序怎么才能接收到请求,并将具体请求分发路由到具体控制器让它来解决并应答呢?
服务器有很多应用程序,通过url定位请求。每一个app中的mvc框架都会最终接收请求并分发到具体的控制器去执行。感觉像是对url一层一层的剥离,这样符合网络5层协议的精神!
所以,需要解答mvc怎么样将控制器映射起来,接受请求后又是怎么样找到它的这个问题。
php模式
在php中最简单的方式是:直接定位处理请求的某个php,比如192.168.0.100:8080/csdn/doRequest.php?name=z&age=10,然后在该php文件中通过$_GET['name']获取参数,进一步处理,最后返回结果。
在thinkPHP等框架中,有一个文件作为集中请求分发的入口,然后每次发送请求时都需要指向该入口。thinkPHP一般是根目录下的index.php,则没有隐藏它的时候每次发送请求都需要带上它作为url一部分,比如192.168.0.100:8080/csdn/index.php/Login/login。该url指向Login模块的login方法,入口是index.php,必须由他初始化加载thinkphp来解析url找到Login的login。
这种模式下,我们的url也清晰地指出了入口,指明由它处理,很好理解。
java模式
java中以spring为例,tomcat等启动时加载环境,并根据web.xml初始化部署在其下的所有web应用,而spring也就是在这时候初始化的,负责调度的是一个叫做DispatcherServlet的Servlet。
假如有一个请求192.168.0.100:8080/csdn/hello.do,会由这个servlet来负责解析并调度hello.do,好像它就代表了csdn一样,而我们的url并没有它,它是如何接收请求的呢?
最开始用java编写web是使用servlet,在web.xml配置如下:
服务器启动时加载该文件,自然会初始化注册该servlet,当请求192.168.0.100:8080/csdn/hello时就指向com.csdn.Hello类来处理。spring和原生servlet相似,不过原生servlet编程需在web.xml配置每一个servlet实现类及其映射,而spring把DispatcherServlet作为总入口servlet,凡是符合它映射规则的请求都交由它处理。所以192.168.0.100:8080/csdn/hello.do会交给它,因为符合“*.do”规则。在DispatcherServlet内部会对各种参数进行组合,然后再具体匹配“hello.do”实现类,由该实现类处理实际请求并返回结果。由此,java中的servlet及其url-pattern是在tomcat启动时注册好了的,8080端口由tomcat监听,它负责找到csdn应用并通过url-pattern找到该应用下处理请求的servlet。一切早已就绪,静静的,只是等待用户请求的到来。
即:客户端浏览器发出request请求,服务器收到请求,并将请求交给应用程序处理,之后把处理结果返回给客户端作为应答。
当我们输入:192.168.0.100:8080/csdn/index.do时,ip地址定位到服务器所在的主机,8080端口定位到服务器(类似apache的软件服务器),而csdn指向当前服务器下部署的某一应用,index.do则是具体的路由到哪个控制器。问题出在服务器到控制器间,也就是上图A阶段末期,应用程序怎么才能接收到请求,并将具体请求分发路由到具体控制器让它来解决并应答呢?
服务器有很多应用程序,通过url定位请求。每一个app中的mvc框架都会最终接收请求并分发到具体的控制器去执行。感觉像是对url一层一层的剥离,这样符合网络5层协议的精神!
所以,需要解答mvc怎么样将控制器映射起来,接受请求后又是怎么样找到它的这个问题。
php模式
在php中最简单的方式是:直接定位处理请求的某个php,比如192.168.0.100:8080/csdn/doRequest.php?name=z&age=10,然后在该php文件中通过$_GET['name']获取参数,进一步处理,最后返回结果。
在thinkPHP等框架中,有一个文件作为集中请求分发的入口,然后每次发送请求时都需要指向该入口。thinkPHP一般是根目录下的index.php,则没有隐藏它的时候每次发送请求都需要带上它作为url一部分,比如192.168.0.100:8080/csdn/index.php/Login/login。该url指向Login模块的login方法,入口是index.php,必须由他初始化加载thinkphp来解析url找到Login的login。
这种模式下,我们的url也清晰地指出了入口,指明由它处理,很好理解。
java模式
java中以spring为例,tomcat等启动时加载环境,并根据web.xml初始化部署在其下的所有web应用,而spring也就是在这时候初始化的,负责调度的是一个叫做DispatcherServlet的Servlet。
<web-app> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
假如有一个请求192.168.0.100:8080/csdn/hello.do,会由这个servlet来负责解析并调度hello.do,好像它就代表了csdn一样,而我们的url并没有它,它是如何接收请求的呢?
最开始用java编写web是使用servlet,在web.xml配置如下:
<web-app> ... // servlet注册 <servlet> <servlet-name>nameToRegister</servlet-name> <servlet-class>com.csdn.Hello</servlet-class> </servlet> //servlet映射 <servlet-mapping> <servlet-name>nameToRegister</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> ... </web-app>
服务器启动时加载该文件,自然会初始化注册该servlet,当请求192.168.0.100:8080/csdn/hello时就指向com.csdn.Hello类来处理。spring和原生servlet相似,不过原生servlet编程需在web.xml配置每一个servlet实现类及其映射,而spring把DispatcherServlet作为总入口servlet,凡是符合它映射规则的请求都交由它处理。所以192.168.0.100:8080/csdn/hello.do会交给它,因为符合“*.do”规则。在DispatcherServlet内部会对各种参数进行组合,然后再具体匹配“hello.do”实现类,由该实现类处理实际请求并返回结果。由此,java中的servlet及其url-pattern是在tomcat启动时注册好了的,8080端口由tomcat监听,它负责找到csdn应用并通过url-pattern找到该应用下处理请求的servlet。一切早已就绪,静静的,只是等待用户请求的到来。
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- Zend的MVC机制使用分析(二)
- ASP.NET MVC 4 捆绑和缩小实例介绍
- ASP.NET MVC小结之基础篇(一)
- Flex中最好的MVC框架Mate框架
- ASP.NET MVC学习笔记
- 关于php mvc开发模式的感想
- php打造属于自己的MVC框架
- 使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码
- mvc下,3种窗口弹出设置的方法
- ASP.NET MVC运行出现Uncaught TypeError: Cannot set property __MVC_FormValidation of null的解决方法
- PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
- Zend的MVC机制使用分析(一)
- ASP.NET MVC 中实现基于角色的权限控制的处理方法
- .NET Web开发之.NET MVC框架介绍
- Coolite Cool Study 3 MVC + Coolite 的实现代码
- 一个基于Asp.Net MVC的权限方案
- ASP.NET MVC使用Ajax的辅助的解决方法
- PHP MVC模式在网站架构中的实现分析
- Spring MVC中基于自定义Editor的表单数据处理技巧分享