MVC框架实例构建
转自:http://www.cnblogs.com/levenyes/p/3290885.html
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法。
——《百度百科》
记得我第一次接触jsp的时候是学校里面要求我们做课程设计,我和我的小伙伴们就打算模仿一个外卖网站做一个web项目。那时候啥都不懂,什么HTML啊CSS啊统统不会,更别说JSP了。用jsp的时候也是把几乎所有的逻辑控件都放到一个jsp里面,页面里充斥着各式各样的代码,纷繁杂乱,最后项目修改起来也相当麻烦,结果如何可想而知。
后来买了本书,在这里也推荐一下,是台湾林信良老师的《Servlet&JSP学习笔记》。里面讲解深入浅出,通俗易懂的同时也不会像一些所谓实战的书籍那样流于表面,从中,我第一次了解到MVC框架,并且在之后的项目中派上用场。
闲话少说,下面开始手把手教大家如何搭建MVC框架,作为例子,展示的是一个最简单的登录流程。
第一步:创建项目
创建项目的工具我推荐MyEclipse,因为不用我们配置Tomcat之类的东西,可以省去不少的功夫,把精力集中到MVC框架的学习当中。创建项目完毕之后,我们可以立刻启动项目。
启动项目完毕之后,MyEclipse自带的浏览器会向我们展示这么一个简单到不能再简单的页面
大家可能会想,为什么项目启动后会展示这么一个页面呢?这个页面又保存在哪里呢?现在,让我给大家一一揭晓。(知道个中原因的读者请跳过,写这么一段是为了让初学者更容易理解,见谅!)
看到项目的文件结构,不难在WebRoot文件夹下找到名为index.jsp这一文件。浏览器所展示的页面,就是此文件经过处理过后的结果。点开之后,修改<body></body>之间的内容,例如改成This is My MVC project.。重新启动项目后,告诉我你看到了什么。
好了,解决完页面来源问题之后,接下来就是解答为什么会展示这么一个页面的问题了。我们点WebRoot文件夹节点,再点击WEB-INF文件夹节点,找到web.xml文件并且双击打开,然后看看里面的内容——
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="2.5"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7 <!--以上内容暂时不需要理解,如果不明白可跳过-->
8
9
10 <welcome-file-list> <!--welcome-file-list开头-->
11 <welcome-file>index.jsp</welcome-file> <!--设置欢迎页面,也就是项目启动后浏览器展示的第一个页面-->
12 </welcome-file-list> <!--welcome-file-list结尾-->
13
14 </web-app>
看到第11行的代码中的index.jsp,是不是觉得似曾相识呢?没错,它就是我们刚才一直在讨论的那个页面。这里设置的就是项目启动后浏览器展示的第一个页面,读者可以试着再WebRoot目录下添加一个HTML文件或JSP文件,然后将这里的index.jsp改成所添加的文件名,重新启动项目,你就会发现有什么东西不一样了。web.xml文件,用处还不止一点,后面再讨论。
前面已经创建完项目了,那么下面一个步骤就是逐一新建在MVC框架中负责V(视图)、C(控制器)、M(模型)的对应文件。
第一步:创建项目(已完成)
第二步:新建负责V(视图)的JSP文件
在文件夹Web-Root下新建名为MyJsp.jsp的JSP文件,代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
7 <html>
8 <head></head>
9 <!--对于初学者,上面的代码都可以暂时不必理会 -->
10 <body>
11 <form action="login.do" method="post"> <!--所提交的表单,action为"login.do",发出请求是post-->
12 <p>账号:<input type="text" name="id" /></p> <!--所输入的"账号"在提交后的标示是"id",下同 -->
13
14 <p>密码:<input type="text" name="password" />
15
16 <p><input type="submit" value="登录"> </p> <!--表单提交按钮,显示名称为"登录"-->
17 </form>
18 </body>
19 </html>
在创建完之后,记得在web.xml中,将<welcome-file-list>节点中的内容改成上面这个文件的文件名MyJsp.jsp。(建议初学者做完这个步骤之后先运行一遍项目,看看效果如何,再看看有没有出错的地方)
如果运行的效果如下图,那应该就没什么问题了。
所谓的V(视图),通俗地来讲,就是用户所看到的内容。具体到这个java web项目,就是用户所看到的页面。
第三步:新建负责C(控制器)的Servlet
首先,要在src目录下新建一个包,包名为cc.MyMVC.servlet。然后,再在该包下新建一个servlet文件,名为MyServlet,代码如下:
1 package cc.MyMVC.servlet;
2 import java.io.IOException;
3 import javax.servlet.ServletException;
4 import javax.servlet.http.HttpServlet;
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7
8 import cc.MyMVC.POJO.MyPOJO;
9
10 public class MyServlet extends HttpServlet {
11 public MyServlet() {
12 super();
13 }
14
15 public void destroy() {
16 super.destroy();
17 }
18
19 public void doGet(HttpServletRequest request, HttpServletResponse response)
20 throws ServletException, IOException {
21 }
22
23 //以下为关键代码,初学者只需看此处,其他地方都可以暂且不管
24 public void doPost(HttpServletRequest request, HttpServletResponse response)//处理post请求的方法
25 throws ServletException, IOException {
26 boolean b=false;
27 MyPOJO myPOJO=new MyPOJO();//新建MyPOJO类的对象myPOJO
28
29 //根据标示名获取JSP文件中表单所包含的参数
30 String id=request.getParameter("id");
31 String password=request.getParameter("password");
32
33 b=myPOJO.login(id,password);//使用模型对账号和密码进行验证,返回一个boolean类型的对象
34
35 if(b){ //如果验证结果为真,跳转至登录成功页面
36 response.sendRedirect("LoginSuccessful.jsp");
37 }
38 else { //如果验证结果为假,跳转至登录失败页面
39 response.sendRedirect("LoginFailed.jsp");
40 }
41
42 }
43
44 public void init() throws ServletException {
45 }
46 }
很不幸,第三步提到的模型(M)还没有创建,大家可以略过。大家可以看到,这个servlet中doGet方法里的代码都被删光光了,无法处理get请求。而这个对我们这个项目可以说是毫无影响,看到我们第二步创建的jsp文件,会发现表单提交的方式是post请求,所以,我们只需要实现doPost方法就好了,并且这个方法将处理提交的post请求。
控制器(C)的作用,就是对流程的控制,接收视图传来的参数,交由模型进行处理,再根据处理的结果决定下一步的操作。具体到本项目,servlet接收jsp传来的参数id和password,交由POJO处理,根据返回的boolean结果跳转到登录成功(失败)的页面。
第四步:修改web.xml文件,注册servlet并且建立action与servlet之间的映射。
前面说到,MyServlet.servlet会处理提交的请求,那么,为什么servlet会接收到这个请求呢?因为,我事先修改了web.xml文件,在里面添加了相应的代码。web.xml的完整代码如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="2.5"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7 <!--以上内容暂时不需要理解,如果不明白可跳过-->
8
9 <servlet>
10 <servlet-name>MyServlet</servlet-name><!--定义servlet的名称 -->
11 <servlet-class>cc.MyMVC.servlet.MyServlet</servlet-class><!--对应servlet所属的文件名 -->
12 </servlet>
13
14 <servlet-mapping> <!-- 建立servlet与action之间的映射 -->
15 <servlet-name>MyServlet</servlet-name> <!-- 映射中servlet的名称,已定义 -->
16 <url-pattern>/login.do</url-pattern> <!-- 所对应的action -->
17 </servlet-mapping>
18 <!--以上内容为新添加的代码,请重点关注-->
19
20
21 <welcome-file-list> <!--welcome-file-list开头-->
22 <welcome-file>MyJsp.jsp</welcome-file> <!--设置欢迎页面,也就是项目启动后浏览器展示的第一个页面-->
23 </welcome-file-list> <!--welcome-file-list结尾-->
24
25 </web-app>
看到关于action的那一行XML代码,是否想到了什么呢?没错,就是jsp表单中所定义的action。试着修改,看看会有什么效果?
第五步:新建M(模型)的POJO文件
POJO(Plain Ordinary Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。POJO实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便程序员使用数据库中的数据表。——《百度百科》
首先,在src文件下新建包,包名为cc.MyMVC.POJO。然后在该包下新建class文件,名为MyPOJO。
为了让读者,尤其是初学者更快地理解MVC,而不是将精力耗费在理解POJO以及数据库操作上面,我将POJO进行了尽可能的简化。代码如下:
1 package cc.MyMVC.POJO;
2
3 public class MyPOJO {
4 public boolean login(String id,String password){
5 if(id.equals("admin")&&password.equals("123456")){//判断用户名以及密码是否与设定相符
6 return true;
7 }
8 else return false;
9 }
10 }
第六步:新建V(视图)中的另外两个JSP文件
在Web-Root文件夹下新建两个jsp文件,分别命名为LoginSuccessful.jsp以及LoginFailed.jsp。代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 </head>
11 <body>
12 Login Successful. <br>
13 </body>
14 </html>
1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 </head>
11
12 <body>
13 Login Failed. <br>
14 </body>
15 </html>
第七步:跑项目,看效果
(1)输入账号:admin,密码:123456 将会跳转到页面如下:
(2)输入错误的账号或错误的密码,将会跳转到页面如下:
直到这里,示例项目已经构建和演示完毕了。为了简化说明,狠心把许多重要但是对此次说明可能有妨碍的知识点给砍掉了。例如,web.xml为什么可以决定欢迎页,为什么可以进行servlet的配置;HTTP中的post请求以及get请求又是什么样的?诸如此类,不一而足。再提一下林信良老师的《Servlet&JSP学习笔记》,里面有更加详细的讲解,强烈推荐!
MVC框架,主要是对应用的分层,在web项目中尤其流行,算是最基础的分层模式。初学者可能还不了解MVC框架的作用,甚至会觉得这样做故作高深,最后像我当初那样,把所有的代码都挤到一个或几个jsp文件当中。其实,随着项目规模的逐渐庞大以及团队成员的增加,分层的思想不仅有助于分工合作,还增加了项目的伸缩性,降低了测试和debug的工作量和难度。
MVC框架实例构建的更多相关文章
- Spring MVC框架实例
Spring MVC 背景介绍 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,能够选择是使用内置的 Spring Web 框架还是 ...
- PHP: 手把手编写自己的 MVC 框架实例教程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- Android应用程序MVC框架实例分析
问题提出:如何优雅地分离出应用程序的状态.用户交互和数据表现?如何通过框架体现工程的高性能.高灵活性.高响应性? MVC定义:model.view.controller三者的有机组合,分别表示:模型. ...
- php实现最简单的MVC框架实例教程
本文以一个实例的形式讲述了PHP实现MVC框架的过程,比较浅显易懂.现分享给大家供大家参考之用.具体分析如下: 首先,在学习一个框架之前,基本上我们都需要知道什么是mvc,即model-view-co ...
- MVC框架实例教程 【转载】
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- 手把手编写自己的PHP MVC框架实例教程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式. MVC把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contro ...
- 手把手编写PHP MVC框架实例教程
源地址:https://www.awaimai.com/128.html#comment-27466 这个不错,用php实现mvc最核心功能,代码量只有几十K. 其实,不管用那种方法,最终都是incl ...
- [读后感]spring Mvc 教程框架实例以及系统演示下载
[读后感]spring Mvc 教程框架实例以及系统演示下载 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&qu ...
- [Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用
转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之 ...
随机推荐
- ORACLE SQL 整理
1.查询字段中含有小写字母的数据 SELECT MATERIALCODE FROM RFXITEMATTENDCODE WHERE REGEXP_LIKE(MATERIALCODE,'([a-z])' ...
- Python的字符编码
Python的字符编码 1. Python字符编码简介 1. 1 ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...
- VSCode配置eslint
在Vue.js项目中,使用的是eslint检查. 而在我写完代码后,cnpm run dev运行命令...然后悲剧了,一大堆报错!╮(╯▽╰)╭ 安装插件:Vetur:这是vscode上一个vue.j ...
- 从源代码到Runtime发生的重排序
源代码和Runtime时执行的代码很可能不一样,这是因为编译器.处理器常常会为了追求性能对改变执行顺序.然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时. 从源 ...
- Docker + Jenkins 持续部署 ASP.NET Core 项目
Docker 是个好东西,特别是用它来部署 ASP.NET Core Web 项目的时候,但是仅仅的让程序运行起来远远不能满足我的需求,如果能够像 DaoCloud 提供的持续集成服务那样,检测 gi ...
- Effective Java 第三版——6. 避免创建不必要的对象
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- RUP 方法简介
1.什么是RUP: Rational Unified Process(以下简称RUP) 是一套软件工程方法,主要由 Ivar Jacobson的 The Objectory Approch 和 The ...
- Xss过滤,只json型数据过滤,图片文件不过滤,采用jsoup
package com.huaji.fes.filter; import javax.servlet.http.HttpServletRequest;import javax.servlet.http ...
- 青否云 - 小程序待办事项vue开源系统
青否云最新开源系统:小程序待办事项 vue-demo 青否云 vue demo 下载地址:https://github.com/qingful/vue-demo 官网 http://cloud.qin ...
- Ignite与Spark集成时,ClassNotFoundException问题解决
参考文章:https://apacheignite-fs.readme.io/docs/installation-deployment Spark application deployment mod ...