封装简单的mvc框架

mvc 自己封装一个框架

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式

MVC把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

PHP中MVC模式也称Web MVC,从上世纪70年代进化而来。

MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

除此之外,此模式通过对复杂度的简化,使程序结构更加直观。

MVC各部分的职能:

模型Model – 管理大部分的业务逻辑所有的数据库逻辑。模型提供了连接和操作数据库的抽象层。

控制器Controller – 负责响应用户请求准备数据,以及决定如何展示数据。

视图View – 负责渲染数据,通过HTML方式呈现给用户。

一个典型的Web MVC流程:

Controller截获用户发出的请求;

Controller调用Model完成状态的读写操作;

Controller把数据传递给View;

View渲染最终结果并呈献给用户。

在开始开发前,让我们先来把项目建立好。

假设我们建立的项目为 mvc,MVC的框架命名为 mvc,那么接下来,第一步要把目录结构设置好。

├─application           应用目录

│  ├─controllers        控制器目录

│  ├─models             模块目录

│  ├─views              视图目录

├─config                配置文件目录

├─vendor               框架核心目录

├─static                静态文件目录

├─index.php             入口文件

代码规范

在目录设置好以后,我们接下来规定代码的规范:

  • MySQL的表名需小写小写加下划线,如:item,car_orders。
  • 模块名(Models)需用大驼峰命名法,即首字母大写,并在名称后添加Model,如:ItemModel,CarModel。
  • 控制器(Controllers)需用大驼峰命名法,即首字母大写,并在名称后添加Controller,如:ItemController,CarController。
  • 方法名(Action)需用小驼峰命名法,即首字母小写,如:index,indexPost。
  • 视图(Views)部署结构为控制器名/行为名,如:item/view.php,car/buy.php。

上述规则是为了程序能更好地相互调用。

重定向

重定向的目的有两个:设置根目录为project所在位置,以及将所有请求都发送给 index.php 文件。

如果是Apache服务器,在 project 目录下新建一个 .htaccess 文件,内容为:

<IfModule mod_rewrite.c>

# 打开Rerite功能

RewriteEngine On

# 如果请求的是真实存在的文件或目录,直接访问

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

# 如果访问的文件或目录不是真事存在,分发请求至 index.php

RewriteRule . index.php

</IfModule>

如果是Nginx服务器,修改配置文件,在server块中加入如下的重定向:

location / {

# 重新向所有非真是存在的请求到index.php

try_files $uri $uri/ /index.php$args;

}

这样做的主要原因是:

(1)静态文件能直接访问。

如果文件或者目录真实存在,则直接访问存在的文件/目录。

比如,静态文件static/css/main.css真实存在,就可以直接访问它。

2)程序有单一的入口

这种情况是请求地址不是真实存在的文件或目录,这样请求就会传到 index.php 上。

例如,访问地址:localhost/item/view/1,在文件系统中并不存在这样的文件或目录。

那么,Apache或Nginx服务器会把请求发给index.php,并且把域名之后的字符串赋值给REQUEST_URI变量。

这样在PHP中用$_SERVER[‘REQUEST_URI’]就能拿到/item/view/1;

(3)可以用来生成美化的URL,利于SEO

3.4 入口文件

接下来,在 project 目录下新建 index.php 入口文件,文件内容为:

<?php

// 应用目录为当前目录

define(‘APP_PATH’, __DIR__ . ‘/’);

// 开启调试模式

define(‘APP_DEBUG’, true);

// 加载框架文件

require(APP_PATH . ‘fastphp/Fastphp.php’);

// 加载配置文件

$config = require(APP_PATH . ‘config/config.php’);

// 实例化框架类

(new Fastphp($config))->run();

注意,上面的PHP代码中,并没有添加PHP结束符号?>

这么做的主要原因是:

对于只有 PHP 代码的文件,最好没有结束标志?>

PHP自身并不需要结束符号,不加结束符让程序更加安全,很大程度防止了末尾被注入额外的内容。

3.5 配置文件

在入口文件中,我们加载了config.php文件的内容,那它有何作用呢?

从名称不难看出,它的作用是保存一些常用配置。

config.php 文件内容如下,作用是定义数据库连接参数参数,以及配置默认控制器名和操作名:

<?php

// 数据库配置

define(‘DB_NAME’, ‘project’);

define(‘DB_USER’, ‘root’);

define(‘DB_PASSWORD’, ‘123456’);

define(‘DB_HOST’, ‘localhost’);

// 默认控制器和操作名

$config[‘defaultController’] = ‘Item’;

$config[‘defaultAction’] = ‘index’;

return $config;

入口中的$config变量接收到配置参数后,再传给框架的核心类,也就是Fastphp类。

 

3.6 框架核心类

入口文件对框架类做了两步操作:实例化,调用run()方法。

实例化操作接受$config参数配置,并保存到类属性中。

run()方法则调用用类自身方法,完成:自动加载类文件、监测开发环境、过滤敏感字符、移除全局变量的老用法、和处理路由。

<?php

/**

* fastphp框架核心

*/

class Fastphp

{

protected $_config = [];

public function __construct($config)

{

$this->_config = $config;

}

// 运行程序

public function run()

{

spl_autoload_register(array($this, ‘loadClass’));

$this->setReporting();

$this->removeMagicQuotes();

$this->unregisterGlobals();

$this->setDbConfig();

$this->route();

}

// 路由处理

public function route()

{

$controllerName = $this->_config[‘defaultController’];

$actionName = $this->_config[‘defaultAction’];

$param = array();

$url = $_SERVER[‘REQUEST_URI’];

// 清除?之后的内容

$position = strpos($url, ‘?’);

$url = $position === false ? $url : substr($url, 0, $position);

// 删除前后的“/”

$url = trim($url, ‘/’);

if ($url) {

// 使用“/”分割字符串,并保存在数组中

$urlArray = explode(‘/’, $url);

// 删除空的数组元素

$urlArray = array_filter($urlArray);

// 获取控制器名

$controllerName = ucfirst($urlArray[0]);

// 获取动作名

array_shift($urlArray);

$actionName = $urlArray ? $urlArray[0] : $actionName;

// 获取URL参数

array_shift($urlArray);

$param = $urlArray ? $urlArray : array();

}

// 判断控制器和操作是否存在

$controller = $controllerName . ‘Controller’;

if (!class_exists($controller)) {

exit($controller . ‘控制器不存在‘);

}

if (!method_exists($controller, $actionName)) {

exit($actionName . ‘方法不存在‘);

}

// 如果控制器和操作名存在,则实例化控制器,因为控制器对象里面

// 还会用到控制器名和操作名,所以实例化的时候把他们俩的名称也

// 传进去。结合Controller基类一起看

$dispatch = new $controller($controllerName, $actionName);

// $dispatch保存控制器实例化后的对象,我们就可以调用它的方法,

// 也可以像方法中传入参数,以下等同于:$dispatch->$actionName($param)

call_user_func_array(array($dispatch, $actionName), $param);

}

// 检测开发环境

public function setReporting()

{

if (APP_DEBUG === true) {

error_reporting(E_ALL);

ini_set(‘display_errors’,’On’);

} else {

error_reporting(E_ALL);

ini_set(‘display_errors’,’Off’);

ini_set(‘log_errors’, ‘On’);

}

}

// 删除敏感字符

public function stripSlashesDeep($value)

{

$value = is_array($value) ? array_map(array($this, ‘stripSlashesDeep’), $value) : stripslashes($value);

return $value;

}

// 检测敏感字符并删除

public function removeMagicQuotes()

{

if (get_magic_quotes_gpc()) {

$_GET = isset($_GET) ? $this->stripSlashesDeep($_GET ) : ”;

$_POST = isset($_POST) ? $this->stripSlashesDeep($_POST ) : ”;

$_COOKIE = isset($_COOKIE) ? $this->stripSlashesDeep($_COOKIE) : ”;

$_SESSION = isset($_SESSION) ? $this->stripSlashesDeep($_SESSION) : ”;

}

}

// 检测自定义全局变量并移除。因为 register_globals 已经弃用,如果

// 已经弃用的 register_globals 指令被设置为 on,那么局部变量也将

// 在脚本的全局作用域中可用。 例如, $_POST[‘foo’] 也将以 $foo 的

// 形式存在,这样写是不好的实现,会影响代码中的其他变量。 相关信息,

// 参考: http://php.net/manual/zh/faq.using.php#faq.register-globals

public function unregisterGlobals()

{

if (ini_get(‘register_globals’)) {

$array = array(‘_SESSION’, ‘_POST’, ‘_GET’, ‘_COOKIE’, ‘_REQUEST’, ‘_SERVER’, ‘_ENV’, ‘_FILES’);

foreach ($array as $value) {

foreach ($GLOBALS[$value] as $key => $var) {

if ($var === $GLOBALS[$key]) {

unset($GLOBALS[$key]);

}

}

}

}

}

// 配置数据库信息

public function setDbConfig()

{

if ($this->_config[‘db’]) {

Model::$dbConfig = $this->_config[‘db’];

}

}

// 自动加载控制器和模型类

public static function loadClass($class)

{

$frameworks = __DIR__ . ‘/’ . $class . ‘.php’;

$controllers = APP_PATH . ‘application/controllers/’ . $class . ‘.php’;

$models = APP_PATH . ‘application/models/’ . $class . ‘.php’;

if (file_exists($frameworks)) {

// 加载框架核心类

include $frameworks;

} elseif (file_exists($controllers)) {

// 加载应用控制器类

include $controllers;

} elseif (file_exists($models)) {

//加载应用模型类

include $models;4

} else {

// 错误代码

}

}

}

下面重点讲解主请求方法 route(),它也称路由方法,作用是:截取URL,并解析出控制器名、方法名和URL参数。

假设我们的 URL 是这样:

yoursite.com/controllerName/actionName/queryString

当浏览器访问上面的URLroute()从全局变量$_SERVER[‘REQUEST_URI’]中获取到字符串/controllerName/actionName/queryString

然后,会将这个字符串分割成三部分:controlleractionqueryString

例如,URL链接为:yoursite.com/item/view/1/hello,那么route()分割之后,

  • Controller名就是:item
  • action名就是:view
  • URL参数就是:array(1, hello)

分割完成后,再实例化控制器:itemController,并调用其中的view方法

3.7 Controller基类

接下来,就是在 fastphp 中创建MVC基类,包括控制器、模型和视图三个基类。

新建控制器基类,文件名 Controller.class.php,功能就是总调度,内容如下:

<?php

/**

* 控制器基类

*/

class Controller

{

protected $_controller;

protected $_action;

protected $_view;

// 构造函数,初始化属性,并实例化对应模型

public function __construct($controller, $action)

{

$this->_controller = $controller;

$this->_action = $action;

$this->_view = new View($controller, $action);

}

// 分配变量

public function assign($name, $value)

{

$this->_view->assign($name, $value);

}

// 渲染视图

public function render()

{

$this->_view->render();

}

}

Controller类用assign()方法实现把变量保存到View对象中。

这样,在调用$this-> render() 后视图文件就能显示这些变量。

3.8 Model基类

新建模型基类,继承自数据库操作类Sql类(因为数据库操作比较复杂)。

模型基类文件名为 Model.class.php,代码如下:

<?php

class Model extends Sql

{

protected $_model;

protected $_table;

public static $dbConfig = [];

public function __construct()

{

// 连接数据库

$this->connect(self::$dbConfig[‘host’], self::$dbConfig[‘username’], self::$dbConfig[‘password’],

self::$dbConfig[‘dbname’]);

// 获取数据库表名

if (!$this->_table) {

// 获取模型类名称

$this->_model = get_class($this);

// 删除类名最后的 Model 字符

$this->_model = substr($this->_model, 0, -5);

// 数据库表名与类名一致

$this->_table = strtolower($this->_model);

}

}

}

建立一个数据库基类 Sql.class.php,代码如下:

<?php

class Sql

{

protected $_dbHandle;

protected $_result;

private $filter = ”;

// 连接数据库

public function connect($host, $username, $password, $dbname)

{

try {

$dsn = sprintf(“mysql:host=%s;dbname=%s;charset=utf8”, $host, $dbname);

$option = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC);

$this->_dbHandle = new PDO($dsn, $username, $password, $option);

} catch (PDOException $e) {

exit(‘错误: ‘ . $e->getMessage());

}

}

// 查询条件

public function where($where = array())

{

if (isset($where)) {

$this->filter .= ‘ WHERE ‘;

$this->filter .= implode(‘ ‘, $where);

}

return $this;

}

// 排序条件

public function order($order = array())

{

if(isset($order)) {

$this->filter .= ‘ ORDER BY ‘;

$this->filter .= implode(‘,’, $order);

}

return $this;

}

// 查询所有

public function selectAll()

{

$sql = sprintf(“select * from `%s` %s”, $this->_table, $this->filter);

$sth = $this->_dbHandle->prepare($sql);

$sth->execute();

return $sth->fetchAll();

}

// 根据条件 (id) 查询

public function select($id)

{

$sql = sprintf(“select * from `%s` where `id` = ‘%s‘”, $this->_table, $id);

$sth = $this->_dbHandle->prepare($sql);

$sth->execute();

return $sth->fetch();

}

// 根据条件 (id) 删除

public function delete($id)

{

$sql = sprintf(“delete from `%s` where `id` = ‘%s‘”, $this->_table, $id);

$sth = $this->_dbHandle->prepare($sql);

$sth->execute();

return $sth->rowCount();

}

// 自定义SQL查询,返回影响的行数

public function query($sql)

{

$sth = $this->_dbHandle->prepare($sql);

$sth->execute();

return $sth->rowCount();

}

// 新增数据

public function add($data)

{

$sql = sprintf(“insert into `%s` %s”, $this->_table, $this->formatInsert($data));

return $this->query($sql);

}

// 修改数据

public function update($id, $data)

{

$sql = sprintf(“update `%s` set %s where `id` = ‘%s‘”, $this->_table, $this->formatUpdate($data), $id);

return $this->query($sql);

}

// 将数组转换成插入格式的sql语句

private function formatInsert($data)

{

$fields = array();

$values = array();

foreach ($data as $key => $value) {

$fields[] = sprintf(“`%s`”, $key);

$values[] = sprintf(“‘%s‘”, $value);

}

$field = implode(‘,’, $fields);

$value = implode(‘,’, $values);

return sprintf(“(%s) values (%s)”, $field, $value);

}

// 将数组转换成更新格式的sql语句

private function formatUpdate($data)

{

$fields = array();

foreach ($data as $key => $value) {

$fields[] = sprintf(“`%s` = ‘%s‘”, $key, $value);

}

return implode(‘,’, $fields);

}

}

应该说,Sql.class.php 是框架的核心部分。为什么?

因为通过它,我们创建了一个 SQL 抽象层,可以大大减少了数据库的编程工作。

虽然 PDO 接口本来已经很简洁,但是抽象之后框架的可灵活性更高。

这里的数据库句柄$this->_dbHandle还能用单例模式返回,让数据读写更高效,这部分可自行实现。

3.9 View基类

视图基类 View.class.php 内容如下:

<?php

/**

* 视图基类

*/

class View

{

protected $variables = array();

protected $_controller;

protected $_action;

function __construct($controller, $action)

{

$this->_controller = strtolower($controller);

$this->_action = strtolower($action);

}

// 分配变量

public function assign($name, $value)

{

$this->variables[$name] = $value;

}

// 渲染显示

public function render()

{

extract($this->variables);

$defaultHeader = APP_PATH . ‘application/views/header.php’;

$defaultFooter = APP_PATH . ‘application/views/footer.php’;

$controllerHeader = APP_PATH . ‘application/views/’ . $this->_controller . ‘/header.php’;

$controllerFooter = APP_PATH . ‘application/views/’ . $this->_controller . ‘/footer.php’;

$controllerLayout = APP_PATH . ‘application/views/’ . $this->_controller . ‘/’ . $this->_action . ‘.php’;

// 页头文件

if (file_exists($controllerHeader)) {

include ($controllerHeader);

} else {

include ($defaultHeader);

}

include ($controllerLayout);

// 页脚文件

if (file_exists($controllerFooter)) {

include ($controllerFooter);

} else {

include ($defaultFooter);

}

}

}

这样,核心的PHP MVC框架核心就完成了。

下面我们编写应用来测试框架功能。

4 应用

4.1 数据库部署

SQL 中新建一个 project 数据库,增加一个item 表、并插入两条记录,命令如下:

CREATE DATABASE `project` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `project`;

CREATE TABLE `item` (

`id` int(11) NOT NULL auto_increment,

`item_name` varchar(255) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `item` VALUES(1, ‘Hello World.’);

INSERT INTO `item` VALUES(2, ‘Lets go!’);

4.2 部署模型

然后,我们还需要在 models 目录中创建一个 ItemModel.php 模型,内容如下:

<?php

/**

* 用户Model

*/

class ItemModel extends Model

{

/**

* 自定义当前模型操作的数据库表名称,

* 如果不指定默认为类名称的小写字符串,

* 这里就是 item 表

* @var string

*/

public $_table = ‘item’;

/**

* 搜索功能,因为Sql父类里面没有现成的like搜索,

* 所以需要自己写SQL语句,对数据库的操作应该都放

* 在Model里面,然后提供给Controller直接调用

* @param $title string 查询的关键词

* @return array 返回的数据

*/

public function search($keyword)

{

$sql = “select * from `$this->_table` where `item_name` like ‘%$keyword%‘”;

$sth = $this->_dbHandle->prepare($sql);

$sth->execute();

return $sth->fetchAll();

}

}

因为Item模型继承了Model基类,所以它拥有Model 类的所有功能。

4.3 部署控制器

controllers 目录下创建一个 ItemController.php 控制器,内容如下:

<?php

class ItemController extends Controller

{

// 首页方法,测试框架自定义DB查询

public function index()

{

$keyword = isset($_GET[‘keyword’]) ? $_GET[‘keyword’] : ”;

if ($keyword) {

$items = (new ItemModel())->search($keyword);

} else {

$items = (new ItemModel)->selectAll();

}

$this->assign(‘title’, ‘全部条目‘);

$this->assign(‘keyword’, $keyword);

$this->assign(‘items’, $items);

$this->render();

}

// 添加记录,测试框架DB记录创建(Create)

public function add()

{

$data[‘item_name’] = $_POST[‘value’];

$count = (new ItemModel)->add($data);

$this->assign(‘title’, ‘添加成功‘);

$this->assign(‘count’, $count);

$this->render();

}

// 操作管理

public function manage($id = 0)

{

$item = array();

$postUrl = ‘/item/add’;

if ($id) {

$item = (new ItemModel)->select($id);

$postUrl = ‘/item/update’;

}

$this->assign(‘title’, ‘管理条目‘);

$this->assign(‘item’, $item);

$this->assign(‘postUrl’, $postUrl);

$this->render();

}

// 更新记录,测试框架DB记录更新(Update)

public function update()

{

$data = array(‘id’ => $_POST[‘id’], ‘item_name’ => $_POST[‘value’]);

$count = (new ItemModel)->update($data[‘id’], $data);

$this->assign(‘title’, ‘修改成功‘);

$this->assign(‘count’, $count);

$this->render();

}

// 删除记录,测试框架DB记录删除(Delete)

public function delete($id = null)

{

$count = (new ItemModel)->delete($id);

$this->assign(‘title’, ‘删除成功‘);

$this->assign(‘count’, $count);

$this->render();

}

}

4.4 部署视图

views 目录下新建 header.php footer.php 两个页头页脚模板,如下。

header.php 内容:

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<title><?php echo $title ?></title>

<link rel=”stylesheet” href=”/static/css/main.css” type=”text/css” />

</head>

<body>

<h1><?php echo $title ?></h1>

footer.php 内容:

</body>

</html>

页头文件用到了main.css样式文件,内容:

html, body {

margin: 0;

padding: 10px;

font-size: 20px;

}

input {

font-family:georgia,times;

font-size:24px;

line-height:1.2em;

}

a {

color:blue;

font-family:georgia,times;

line-height:1.2em;

text-decoration:none;

}

a:hover {

text-decoration:underline;

}

h1 {

color:#000000;

font-size:41px;

border-bottom:1px dotted #cccccc;

}

td {padding: 1px 30px 1px 0;}

然后,在 views/item 创建以下几个视图文件。

index.php,浏览数据库内item表的所有记录,内容:

<form action=”” method=”get”>

<input type=”text” value=”<?php echo $keyword ?>” name=”keyword”>

<input type=”submit” value=”搜索“>

</form>

<p><a href=”/item/manage”>新建</a></p>

<table>

<tr>

<th>ID</th>

<th>内容</th>

<th>操作</th>

</tr>

<?php foreach ($items as $item): ?>

<tr>

<td><?php echo $item[‘id’] ?></td>

<td><?php echo $item[‘item_name’] ?></td>

<td>

<a href=”/item/manage/<?php echo $item[‘id’] ?>”>编辑</a>

<a href=”/item/delete/<?php echo $item[‘id’] ?>”>删除</a>

</td>

</tr>

<?php endforeach ?>

</table>

add.php,添加记录后的提示,内容:

<a class=”big” href=”/item/index”>成功添加<?php echo $count ?>条记录,点击返回</a>

manage.php,管理记录,内容:

<form action=”<?php echo $postUrl; ?>” method=”post”>

<?php if (isset($item[‘id’])): ?>

<input type=”hidden” name=”id” value=”<?php echo $item[‘id’] ?>”>

<?php endif; ?>

<input type=”text” name=”value” value=”<?php echo isset($item[‘item_name’]) ? $item[‘item_name’] : ” ?>”>

<input type=”submit” value=”提交“>

</form>

<a class=”big” href=”/item/index”>返回</a>

update.php,更改记录后的提示,内容:

<a class=”big” href=”/item/index”>成功修改<?php echo $count ?>项,点击返回</a>

delete.php,删除记录后的提示,内容:

<a href=”/item/index”>成功删除<?php echo $count ?>项,点击返回</a>

4.5 应用测试

这样,在浏览器中访问 project程序:http://localhost/item/index/,就可以看到效果了。

原文地址:https://www.cnblogs.com/miaozhihang/p/9454917.html

时间: 2024-11-05 22:34:10

封装简单的mvc框架的相关文章

PHP之简单实现MVC框架

PHP之简单实现MVC框架 1.概述 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 2.代码结构 3.代码实现 1 2 3 4 5 6 7 8 9 10 1

AsMVC:一个简单的MVC框架的Java实现

当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍springMVC的官方文档,对过去一段时间的使用做了一下总结,总结了一些MVC的使用需求,打算自己开坑写一个MVC框架,虽然是重复造轮子的过程,但也是学习提高的过程. 1.我们可能需要一个什么样的MVC框架 (1)用户一:我讨厌配置文件,最好能用注解的全用注解注解,能扫描直接扫描 (2)用户二:最好我导入一个j

自己动手写一个简单的MVC框架(第二版)

一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.Web.Routing.dll中,有一个最重要的类叫做UrlRoutingModule,它是一个实现了IHttpModule接口的类,在请求处理管道中专门针对ASP.NET MVC请求进行处理.首先,我们要了解一下UrlRoutingModule是如何起作用的. (1)IIS网站的配置可以分为两个块:

一个简单的MVC框架的实现-基于注解的实现

1.@Action注解声明 package com.togogo.webtoservice.annotations; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotatio

java实现简单的MVC框架

.title { background: blue; height: 50px; line-height: 50px; border: 1px solid; color: red } 一.mvc的模式如下图所示 二.基于路径访问的控制器 控制器BaseServlet类如下 package com.wangyang.web; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import

一个简单的MVC框架的实现

1.Action接口 package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface Action { /** * 默认的执行方法 * @param request 传入处理的请求对象 * @param response 传入处理的响应对象 * @return 返回一个跳转的路

ideat使用struts2之自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

使用Intellij Idea自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

开发自己的PHP MVC框架(一)

这个教程能够使大家掌握用mvc模式开发php应用的基本概念.此教程分为三个部分.如今这篇是第一部分. 如今市面上有非常多流行的框架供大家使用.可是我们也能够自己动手开发一个mvc框架.採用mvc模式能够大大降低我们开发应用的时间,并且能够更好的组织项目源码,并且当中的某些模块还可在其他项目中使用.如今我要教大家写一个简单的mvc框架.因为这个项目非常easy,轻量.所以可能并非最佳实践,也不具备安全性.还须要大家在实际应用中完好. 所用技术:php,面向对象开发方法. 開始 首先在站点根文件夹下