在我们学习jsp的过程中,随着我们做的项目中功能的逐渐增多我们可以发现修改一个功能时我们需要更改许多的代码,这样在一定程度上影响了我们的效率。为了提高我们的开发效率,我们所以学了MVC模式。
它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。分层概念。
视图:
视图是与用户进行交互的页面,视图可以有html元素或者jsp构成,视图用来输入或者输出我们的数据。
控制器:
控制器就是接受用户输入的请求,并且决定用那个类型来处理业务,同时决定之返回那个视图页面的数据。
模型:
模型表示的业务的规则,主要是编写我们实现业务的属性和方法。
在java的web开发过程中,经历了两个时代。Model1和model2。
Model1 模型就是jsp大行其道的时代,在整个过程中我们都用到了jsp来处理所有的业务,有jsp接受处理客户端的请求,对请求处理后的结果进行跳转,用少量的javabean来实现数据库的操作model1的处理流程如下:
Model2 的模型已是基于MVC框架的设计模式,Servlet作为前端节后客户端的请求,在servlet中只要业务逻辑和和简单的控制处理,然后通过javabaean来实现具体实际的业务操作,最后在转发到相应的jsp页面上显示逻辑.model2工作流程如图
我们可以发现jsp不在承担处理的责任,只是用来接受和显示逻辑信息,实现月servlet的交互,Servlet作为作为控制器,负责与后台的javabean进行通信,而javabean来实现数据的操作。
MVC是一种思想,它不仅仅是java的思想,它是面对对象编程的设计都要遵守的规范。
MVC中M是model(模型),view(视图)Controll(控制)。
MVC中MVC的含义:
M-Model(模型),处理业务逻辑
V-View(视图)展示数据和获取客户端的输入
C-Controllor(控制器)用来接受客户端的参数,调用业务逻辑代码(M),返回数据到视图(v)
MVC模式有如下优点:
第一:多个视图对应一个模型,。按照MVC模式,一个模式对应多个视图,这样可以减少代码的复制和重复性,同时以方便修改。
第二:模型的返回类型和数据被分开。模型数据可以应用任何数据的显示技术。
第三:应用被分成三层,降低了各部分的耦合度,利于程序的扩展。
第四:MVC更符合软件工程化的管理,每一层的组件处理不同的功能,这样更有利于通过工程化和工具化管理程序代码
第五:控制层的概念很有效。它把不同的模型和不同的视图组合在一起,完成不同的请求。
我们了解了MVC的工作流程和优点后,那么我们通过MVC模式实现一个加法器。我们必须自定义MVC框架来实现。加法器的流程如图:
从图中我们可以发现实现加法器的流程我们只要根据相应的步骤开发出来就可以了。我们首先来开发add.jsp页面和add_result.jsp页面,在result中显示结果,在这里我就不写了。在add.jsp页面中我们定义表单来实现加法器的代码。代码如下:
<form action="add.action" method="post">
<table align="center">
<tr>
<td>第一个数字;</td>
<td><input type="text" name="firstNub"/></td>
</tr>
<tr>
<td>第二个数字</td>
<td><input type="text" name="secondNub"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="+" name="add"/>
<input type="submit" value="-" name="multiply"/>
<input type="submit" value="*" name="multiply"/>
<input type="submit" value="/" name="eliminate"/>
</td>
</tr>
</table>
</form>
开发add.jsp页面之后我们来开发Calcutor类,在这个类里面我们来实现数据的具体操作
public class Calcutor {
public double add(double num1,double num2){
return num1+num2;
}
}
开发了calcutor类实现数据的具体操作,我们需要开发来开发Action接口和AddAction类调用它的方法。由于我们提倡面向接口编程,这样有利于我们程序的扩展。Actin接口的代码如下
public interface Action {
public String execute(HttpServletRequest request, HttpServletResponse respoonse);
}
AddAction类的主要作用是接受参数并且调用Calcutor类的操作,并且返回值为跳转的页面的名称。代码如下:
public class AddAction implements Action{
public String execute(HttpServletRequest request,
HttpServletResponse respoonse) {
// TODO Auto-generated method stub
String num1 = request.getParameter("firstNub");
String num2 = request.getParameter("secondNub");
double n1 = Double.parseDouble(num1) ;
double n2 = Double.parseDouble(num2);
Calcutor c = new Calcutor();
double num = c.add(n1, n2);
request.setAttribute("num", num);
return "result.jsp";
}
}
最后我们编写Controllor控制器类,Controll作为一个控制器,它根据用户的路径来判断我们要执行那一个action的操作,调用相应的业务操作,跳转相应的页面。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
Action action = null;
String path2 = null;
String realpath = request.getRequestURI();
String actionname = realpath.substring(realpath.lastIndexOf("/") + 1,
realpath.lastIndexOf("."));
if ("add".equals(actionname)) {
action = new AddAction();
path2 = action.execute(request, response);
System.out.println(path2);
} else if (......) {
........... }
request.getRequestDispatcher(path2).forward(request, response);
}
在这里只写一个add方法,剩余的除,乘,减操作与加的思路是一样的在这里就不写。我们知道Controllor是一个servlet所以我们必须在web.xml中配置
<servlet>
<servlet-name>Controll</servlet-name>
<servlet-class>cn.mvc.servlet.Controll</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Controll</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
这样我们就完成了我们的第一个自定义的MVC框架,在MVC框架中学习中我们需要了解每一个层都是的含义,实现什么功能的。特别需要注意的是在开发Controllor时我们需要配置web.xml文件,保持servlet的配置与类名一致。