M_ittrue 发表于 2013-2-6 11:07:00

MVC总结报告

最近听了两节的MVC讲解,特在此做一个小小的个人总结以便日后三省。
MVC(Model-View-Control,模型—视图—控制器模式),这样一说,还是略显抽像的。因为我们是在做一个简单的Blog,所以总结自然而然也是跟它相关而谈的。简单而论吧,Model模型就是我们后台的JavaBean(例如对数据table的设定与操作(pjo与dao类)),View视图就相当于我们的游览器的Jsp页面,所以控制器Control自然就是我们的Servlet了,这样MVC就把它们进行了一个简单的分类,方便分配自己的工作。
    以上都只是一些定义罢了,真正的用处还没讲到的。我们先从我们可以看到的的地方讲起吧,JSP自然是负责生成一些从数据库抽出来后显示的动态页面。动态页面可以简单而粗略的理解为,不同的用户登陆会得到相同结构而不同容内的页面。当然们在页面进行相关操作时,可能会发出信息请求,这时请求会发送到Servlet,在MVC里面只有一个Servlet,它在Web里面是采用了通配符*去进行模糊匹配的比如:
<servlet>    <servlet-name>Constorl</servlet-name>    <servlet-class>cn.netjava.Servlet.Constorl</servlet-class>动态参数,是一对名值对<init-param>    <param-name>LoginAction</param-name>//类名    <param-value>cn.netjava.action.LoginAction</param-value>//类所在路径    </init-param></servlet><servlet-mapping>    <servlet-name>Constorl</servlet-name>    <url-pattern>*.lsk</url-pattern> 这里的*就是起模糊匹配的,其中lsk是只是一个任意认识名,像我们特定的一个页面要提交给特定的Servlet的进候,我们只要在写Servlet的地方写上类似于LoginActio.lsk这样的Servlet名字即可。

以上在Web.xml的配置都是为让所有的###.lsk Servlet找到*.lsk这个通往你自己在后台定义的Servlet做准备的。下面贴出一个我简单的Servlet代码:
package cn.netjava.Servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.netjava.action.Action;import cn.netjava.action.ActionFactory;/** * Servlet implementation class Constorl */public class Constorl extends HttpServlet {private static final long serialVersionUID = 1L;    public Constorl() {      super();    }publicvoid service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到所请求的Servlet路径,例如在这里我测试是请求的登陆Servlet那么完整路径将是:/LoginAction.lskString path = request.getServletPath();//下面的思路就是根据不同的请求Servlet路径去结取其中的动作名(像LoginAction.lsk动作名就是LoginAction,然后去一个动作工厂去生产相关的操作类,从而得到相关的实例,最后返回用户请求的页面。int index = path.indexOf(".");//取得LoginAction.lsk中间的"."的下标String name = path.substring(1, index);//结取动作名LoginActionString className = this.getInitParameter(name); //从Web.xml获取对应的类名//根据类名得到相应的Action的对象Action act = ActionFactory.getSingleObject().getAction(className);         //传入当前request,response对象,并反回用户请求页面String pagePath = act.exctue(request, response);         //传发request.getRequestDispatcher(pagePath).forward(request, response);}}
package cn.netjava.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//动作接口,其它所有动作类都必须实现的接口public interface Action {public String exctue(HttpServletRequest request,HttpServletResponse response);}
package cn.netjava.action;//动作工作类,生产相应的动作类和实例public class ActionFactory {private staticActionFactory actionFactory = null;//私有构造器,采用单实例方法private ActionFactory (){    }//定义成静态单实例方法,直接用类名调用public static ActionFactory getSingleObject(){if( null ==actionFactory){actionFactory = new ActionFactory();}return actionFactory;}//获得对应的实例public Action getAction(String className){Action act = null; try{             //反射机制,以类名,反射到一个类上面去Class cl = Class.forName(className);            //得到实例 act = (Action) cl.newInstance(); }catch(Exception ef ){ ef.printStackTrace(); } return act;}}

package cn.netjava.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//负责处理登陆的相关信息的Servletpublic class LoginAction implements Action{public String exctue(HttpServletRequest request,HttpServletResponse response) {            //简单的对用户名与密码进行匹配,如果符合则反回主页面,否则,去到错误页面String userName = request.getParameter("userName");String userPwd = request.getParameter("userPwd");if("netjava".equals(userName) && "netjava".equals(userPwd)){return "main.html";}return "error.jsp";}}

   嗯,最后再做一个简单的总结吧,其实MVC的流程并不难。打个比如吧,就相当于一下订菜到上菜的流程,JSP页面就相当于我们的菜单(可见的),而在页面的提交就相当于我们点菜,而我们的Servlet自然就相当于我们的服务员了(所有的订单都要通过这个服务员),然后这个服务员就会拿去让厨师做出相应的菜(这不就是相当于Servlet根据用户请求的路径最终得到相应的类实例么?),最后上菜了!(也就是返回的JSP页面)。这就是我对MVC的初步理解,希望大家多多指教,谢谢。
页: [1]
查看完整版本: MVC总结报告