面向请求的MVC框架的实现原理

1)简单过程:WEB客户端发送HTTP请求到WEB Server(tomcat)上,WEB Server分析这个请求,并负责找到请求要找的servlet。在servlet里处理这个请求。处理请求就是通过HTTP request,获取表单上的数据,并调用业务逻辑,在业务逻辑里的方法中处理,处理完之后,返回相应的结果到这个servlet上,并把结果设置到request中,servlet还要负责转向,选择视图(JSP),先转向到WEB Server,WEB Server负责找到相应的视图。在视图里,取得相应的数据,数据已经被放在request中,获取数据之后,生成response给WEB Server,最中WEB Server把数据给浏览器即JSP页面。

2)分层,最重要的一点就是分离了数据和显示。MVC就是一种分层思想。M(model,模型):对应着业务逻辑层(action);V(view,视图):对应着JSP页面,负责显示;C(controler,控制器):对应着servlet,负责得到表单数据,调用业务逻辑,负责转向。MVC就是通过一个类(通常是servlet)统一来截获所有的请求,再调用业务逻辑进行处理,处理结束之后返回结果给这个类,这个类再负责转向到显示页面。MVC有2种实现方式:面向请求驱动(struts,webwork)和面向事件驱动(JSF)。MVC是80年代末提出来的。

3)详细过程:面向请求的MVC有一个控制器(servlet),叫中央控制器,负责把页面中提交的请求截到,截获的方式如下:

servlet的配置是在web.xml中,servlet可以截获的url请求是通过 <url-pattern>/servlet/TestServlet</url-pattern>来配置的,/servlet/TestServlet这样的配置只能截获这一次的url,要想截获所有的url,可以修改这里的匹配模式来实现。例如修改为*.do(这个可以自由选择,只要匹配就可以),这样所有.do的请求都可以被截获到。当我们前台web页面的form里action="*.do"样式的请求,都会被这个servlet截获。例如我们的action="addUser.do",这个请求会被servlet截获,截获的方式如下:

String currentURI=request.getRequestURI();//获取当前的全部URI
 System.out.println(currentURI);//打印当前的URI
 String path=currentURI.substring(currentURI.indexOf("/", 1));//截取*.do

 System.out.println(path);//打印当前的URI
 path=path.substring(0,path.indexOf("."));//截取*
  System.out.println(path);//打印当前的URI
  输出的结果为:

/test_servlet/user/addUser.do

/user/addUser.do
/user/addUser

最后得到的“*“是我们需要的。业务逻辑层将根据这个决定调用那个函数进行处理。

截获之后分发到相应的处理类(action)上,处理类是一个实现了统一接口的类,并重写他的execute方法,在方法里根据不通的URL分别实现不通的功能。

servlet将根据配置文件找到相应的处理类,配置方式如下:

<action-config>

<action  path="/user/addUser" class="对应这个action的详细地址例如:com.liu.struts.UserAddAction"  success="add_success.jsp"/>//success="/add_success.jsp"表示添加成功了转向到哪个页面

</action-config>

这样当请求被截取之后,就到这个配置文件里找相应的action,并处理。当有新的业务时,只需要写action,然后在配置文件里配置就可以了。

 

 

 4)struts对MVC的实现:

当一个请求过来的时候,到达ActionServlet,通过struts-config.xml找到相应的Action,同时把表单上的所有数据放到ActionForm里,调用Action时,把ActionForm也传过去,在Action里调用Model层进行处理,调用完之后,返回一个ActionForward对象,返回给ActionServlet,ActionServlet解析ActionForward,根据ActionForward中的信息完成转向。

 

 

posted @ 2009-03-06 14:37  刘阳  阅读(800)  评论(0)    收藏  举报