服务器端mvc框架是怎样接收请求的?

问题:服务器端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。

<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。一切早已就绪,静静的,只是等待用户请求的到来。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值