`
M_ittrue
  • 浏览: 75225 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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();
    }

	public  void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	 //得到所请求的Servlet路径,例如在这里我测试是请求的登陆Servlet那么完整路径将是:/LoginAction.lsk
	  String path = request.getServletPath();

//下面的思路就是根据不同的请求Servlet路径去结取其中的动作名(像LoginAction.lsk动作名就是LoginAction,然后去一个动作工厂去生产相关的操作类,从而得到相关的实例,最后返回用户请求的页面。
	  int index = path.indexOf(".");//取得LoginAction.lsk中间的"."的下标
	  String name = path.substring(1, index);//结取动作名LoginAction
	  String 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 	static  ActionFactory 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;
//负责处理登陆的相关信息的Servlet
public 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的初步理解,希望大家多多指教,谢谢。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics