MVC是一种目前广为流传的经典设计模式,具体是模型(Model)—视图(View)—控制(Control)三方面结合起来的设计模式。这样设计的目的是:实现Web系统的职能分工。在实际的开发过程中,一个团队可以进行模块分工,分工开发完毕之后,再将模块组合起来合成一个项目。
这里先介绍介绍下每个模块:
1.View模块,就是用户可以看到的界面,如网页。用jsp,html编写,可以向控制(Control)模块发送请求。
2.Control模块,是一个ControlServlet类,作为服务器处理请求,每个请求都要经过该模块。是连接View模块和Model模块之间沟通的桥梁。
3.Model模块,实现服务器中的业务逻辑,通常可以用JavaBean(dao,pojo等)实现。如 LoginAction中验证用户名密码是否正确 之类。并将处理后的结果(url)返回给Control模块。
下面再从代码实现方面介绍MVC设计模式:
1.用jsp,html代码实现视图功能。
代码示例:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
<form action="LoginAction.ldy" method="post">
用户名:<input type="text" name="userName"><br>
密 码:<input type="text" name="pwd"><br>
<input type="submit" name="login" value="登陆" >
</form>
</body>
</html>
这里必须先说明web.xml中的配置:
代码示例如下:
<servlet> <servlet-name>ControlServlet</servlet-name> <servlet-class>cn.java.controlservlet.ControlServlet</servlet-class> <!-- 处理登陆请求的Action实现 --> <init-param> <param-name>LoginAction</param-name> <param-value>cn.java.action.ActionLogin</param-value> </init-param> <!-- 处理注册请求的Action实现 --> <init-param> <param-name>RegUserAction</param-name> <param-value>cn.netjava.action.RegUserAction</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ControlServlet</servlet-name> <url-pattern>*.ldy</url-pattern> </servlet-mapping>
在 <init-param>标签中用模糊匹配 * 来配置请求路径。这样的结果是,所有以.ldy结尾的请求路径都经过控制模块,即cn.java.controlservlet.ControlServlet类。然后是<init-param>标签,对应的是Action的实现类,如cn.java.action.ActionLogin类。
2.ControlServlet类,即接受所有请求的控制模块,就是配置文件web.xml中的 cn.java.controlservlet.ControlServlet类。
实现的功能:
首先取得请求的路径(*.ldy),再解析出请求路径中*指代的字符串(如LoginAction), 然后取得web.xml中配置的Action实现类名字(cn.java.action.ActionLogin),之后通过Factory类(随后介绍)创建取得Action实现类的对象,经过Action实现类处后,最后取得响应的url.
代码示例:
public class ControlServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response){
try {
//取得请求路径LoginAction.ldy
String reqPath = request.getServletPath();
//取得*指代的字符串LoginAction
String actionName = reqPath.substring(1, reqPath.lastIndexOf(".ldy"));
/**根据请求ActionName取得servlet中配置的Action实现类的名字
* cn.java.action.ActionLogin
*/
String acionClassName = this.getInitParameter(actionName);
//在Factory类中创建Action对象(Factory类在下面介绍)
Action action = ActionFactory.getIns().getAction(acionClassName);
//从实现Action类中取得响应发送的url
String url = action.execute(request, response);
if(null!=url){
this.getServletContext().getRequestDispatcher(url).forward(request, response);
}else{
this.getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.Action接口,被Action实现类实现。
代码示例
public interface Action {
public String execute(HttpServletRequest request,
HttpServletResponse response);
}
4.ActionFactory类,批量生产Action实现类对象。
代码示例:
public class ActionFactory extends HttpServlet{
private static ActionFactory ac=null;
private ActionFactory(){};//构造器私有化
public static ActionFactory getIns(){
if(null==ac){
ac = new ActionFactory();
}
return ac;
}
//在工程中批量生产Action类型的对象
public Action getAction(String actionClass){
Action actionInstance = null;
try{
actionInstance = (Action)Class.forName(actionClass).newInstance();
}catch(Exception ef){
ef.printStackTrace();
}
return actionInstance;
}
}
5.Action实现类,继承Action接口。处理各种业务逻辑,包过调用数据库。处理信息等等。
代码示例:
public String execute(HttpServletRequest request,
HttpServletResponse response) {
String name = request.getParameter("userName");
String pwd = request.getParameter("pwd");
UserInfo user=MemoDBAccess.hasUser(userName, pwd);
if(null!= user){
request.getSession().setAttribute("user", user);
return "/mainPage.jsp";
}else{
request.setAttribute("error_msg", "您输入的账号或密码有误");
return "/login.jsp";
}
}
}
MVC的这5步实现中没有涉及pojo和dao类,但是Model模块是必须包过pojo和dao类的。有兴趣的可以自己编写。
最后再介绍点MVC典型的优点吧,当然缺点也还是有的。低耦合性,视图层和业务层分离,样就允许更改视图层代码而不用重新编译模型和控制器代码。同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可,因为模型层与控制器和视图层向分离,这是可以实现的。分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。