MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:
- (控制器Controller)- 负责转发请求,对请求进行处理。控制器可以是一个servlet。
- (视图View) - 界面设计人员进行图形界面设计。例如:jsp html css ajax。只是接收由session request application传来的参数。
- (模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。例如:db pojo dao,都是用javabean实现的。模型主要掌管的是
(模式如图所示)
下面的是控制器(Controller)的一种实现方法:
package cn.netjava.servlet;
import java.io.IOException;
import javax.servlet.*;
import cn.netjava.action.Action;
import cn.netjava.action.ActionFactory;
/**
*@author www.NetJava.cn
*系统控制器实现
*功能:1.解析请求中的命令名
* 2.根据请求的命令名调用工厂对象创建命令处理对象
* 3.调用命令对象处理请求和应答对象,返回目标路径名
* 4.本控制器将请求和应答转发至目标路径名
*/
public class ControlServlet extends HttpServlet {
//主控servlet分发用户请求的入口
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
//得到请求的命令名字:解析出*.netjava请求中*所指代的字符串,即动作名字
String actionName= getActionName(request);
System.out.println(" request action is: "+actionName);
//根据请求的动作名,得到控制器servlet中配置的Action实现类名字
String actionClassName=this.getInitParameter(actionName);
System.out.println("actionClassName is: "+actionClassName);
//通过工厂类创建命令对象
Action action = ActionFactory.getIns().getAction(actionClassName);
//使用动作对像处理动作,返回结果为处理后要输出的目标页面
String url = action.execute(request, response);
if (url != null){
//输出目标页面
System.out.println("dest url is: "+url);
getServletContext().getRequestDispatcher(url).forward(request, response);
}
}catch(Exception ef){
ef.printStackTrace();
//出错时,输出到错误页面
getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);
}
}
//解析得到请求中的"命令"字
//如请求路径为loginAction.netjava解析得到loginAction
protected String getActionName(HttpServletRequest request) {
String path = request.getServletPath();
return path.substring(1, path.lastIndexOf("."));
}
}
package cn.netjava.action;
/**
*命令对象工厂类实现
*根据命令名字,创建命令对象
*/
public class ActionFactory {
//单实例访问方法
public static ActionFactory getIns(){
if(null==ac){
ac=new ActionFactory();
}
return ac;
}
/**
* 根据具体的Action类名字创建Action对象
* @param actionName:具体的Action类全名
* @return :Action类型对象
*/
public Action getAction(String actionClass) {
Action actionInstance = null;
try {
Class c=Class.forName(actionClass);
actionInstance = (Action) c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return actionInstance;
}
//不需要创建对象
private ActionFactory() { }
private static ActionFactory ac=null;
}
package cn.netjava.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*系统中的命令处理器接口定义
*/
public interface Action {
/**
* 所有的具体Action实现这个接口
* @param request:请求对象
* @param response:应答对象
* @return :结果页面
*/
public String execute(HttpServletRequest request, HttpServletResponse response);
}
需要在web.xml中配置请求发送给控制器Servlet
<description>控制器servlet</description> <display-name>控制器servlet</display-name> <servlet-name>ControlActionServlet</servlet-name> <servlet-class>cn.netjava.control.ControlActionServlet</servlet-class> <!-- 将具体Action名字和全类名配置到Servlet参数中 --> <init-param> <param-name>ActionName</param-name> <param-value>cn.netjava.action.TheActionImpClassName</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ControlActionServlet</servlet-name> <url-pattern>*.netjava</url-pattern> </servlet-mapping>
然后通过接口实现具体的Action比如登录注册提交问题什么的。
View和Model那些可以按照自己的喜好所设置。一个控制界面,一个控制数据的操作等。