MVC是三个单词的缩写:M,Model(模型);V,View( 视图 ),C,Control(控制)。html
MVC模式的目的就是实现Web系统的职能分工,java
Model层:实现系统的业务逻辑,即javaBean部分程序员
View层:负责与用户交互,即在界面上展现数据对象给用户,即html,jspweb
Control层:Model与View之间沟通的桥梁,它能够分派用户的请求并选择恰当的视图以用于显示,同时它也能够解释用户的输入并将它们映射为模型层可执行的操做,固然就是Servlet的职责了设计模式
下面咱们用MVC设计模式来实现 简单的用户登陆过程服务器
一、控制器Servlet的实现app
系统中只有一个servlet即ControlServlet,全部页面发起的以" *.do "的请求,都被web.xml配置给ControlServlet进行处理,在ControlServlet中根据‘ * ’的字符串(即解析用户请求的路径),调用ActionFactory生成的制定Action对象,在将处理后的URL转发给用户。jsp
ControlServlet.javapost
- 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;
-
- public class ControlServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
- String pathName =request.getServletPath();
-
- System.out.println("pathName:"+pathName);
-
- int index = pathName.indexOf(".");
- String ActionName = pathName.substring(1, index);
- System.out.println(ActionName);
-
- String ActionClassName = this.getInitParameter(ActionName);
-
- Action action = ActionFactory.getActionFactory().getAction(ActionClassName);
-
- String url = action.execute(request, response);
- if(url==null){
- request.getRequestDispatcher("error.jsp").forward(request, response);
- }else{
- request.getRequestDispatcher(url).forward(request, response);
- }
- }
-
- }
二、Action对象工厂类实现:ui
ActionFactory是一个单实例类(整个系统只须要使用其一个对象),它只提供一个Action对象,经过getAction(String ActionClassName) 的方法调用建立一个Action对象。这个方法在Control中被调用。代码以下:
- package cn.netjava.action;
- public class ActionFactory {
-
-
- private ActionFactory(){
- }
-
- public static ActionFactory getActionFactory(){
- if(af == null){
- af = new ActionFactory();
- }
- return af;
- }
-
- public Action getAction(String ActionClassName){
- Action action = null;
- try{
- action = (Action) Class.forName(ActionClassName).newInstance();
- }catch(Exception e){
- e.printStackTrace();
- }
- return action;
- }
-
- private static ActionFactory af;
-
-
- }
三、Action接口类定义:
全部的事件处理(即Action)类都必须实现这个接口
- package cn.netjava.action;
-
- public interface Action {
-
- public String execute(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response);
-
- }
四、web.xml中配置请求发送给控制器Servlet
最后,咱们只须要在wex.xml中对MVC结构的配置:
视图页面中的请求都是以<动做名字>.do结尾,当这个请求到达web服务器后,会被服务器转向给控制器处理,控制器在根据解析出的动做名,调用对应的Action对象,处理结果,并输出结果页面,因此web.xml中必须有以下配置:
- <servlet>
- <servlet-name>controlServlet</servlet-name>
- <servlet-class>cn.netjava.servlet.ControlServlet</servlet-class>
- <init-param>
- <param-name>loginAction</param-name>
- <param-value>cn.netjava.action.LoginAction</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>controlServlet</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
四、具体的Action类实现(即对登陆动做进行处理的类)
- package cn.netjava.action;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- public class LoginAction implements Action {
-
- public String execute(HttpServletRequest request,
- HttpServletResponse response) {
-
- String userName = request.getParameter("userName");
- String userPwd = request.getParameter("userPwd");
- if (userName.equals("netjava") && userPwd.equals("netjava")) {
- request.setAttribute("userName", userName);
- return "main.jsp";
- } else {
- return "login.jsp";
- }
- }
-
- }
若是登陆成功,跳转到 main.jsp页面,不然,返回login,jsp页面
如下是main.jsp和login.jsp页面:
main.jsp
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>Insert title here</title>
- </head>
- <body>
- <h1 style="color:red"><%=request.getAttribute("userName") %>登陆成功</h1>
- </body>
- </html>
login.jsp
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>用户登陆</title>
- </head>
- <body>
- <form action="loginAction.do" method="post">
- 用户名:<input type="text" name="userName" id="userName"><br>
- 密码:<input type="password" name="userPwd" id="userPwd"><br>
- <input type="submit" value="登陆"/>
- </form>
- </body>
- </html>
最后作个总结吧:之前咱们与服务器进行交互,可能jsp页面和servlet中都将html和java代码参杂在一块儿,这会致使系统的系统维护困难、分工不清;例如在加有jsp代码段的网页中,程序员与美工之间的配合就很是困难!MVC结构的系统会从根本上强制咱们将web系统中的数据对象、业务逻辑、用户界面三者分离,使得程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
出处:http://blog.csdn.net/liupeng900605/article/details/6985344