自研php的仿java的ssh框架

栏目: Java · 发布时间: 6年前

内容简介:自研php的仿java的ssh框架

简介

前段时间写javaweb,发现ssh框架里的s标签很好用,但 java 代码写起来太慢了,入口和配置文件都过于繁琐,而且s标签只有固定的那几种。于是想用 php 模拟一下javaweb的ssh框架,顺便加些轮子比如文本编辑器,验证码,防xss攻击等进去,减少代码量而又不失可读性。

版权

辽宁工程技术大学新起点工作室版权所有,项目地址: https://github.com/similing4/php-ssh 转载请注明版权与出处!

框架流程

本框架入口文件为index.php,调用过程如图:
自研php的仿java的ssh框架

使用方法

调用mod:

index.php?mod=Mod名称
Mod文件格式:放在Mod文件夹下,文件名要求大写并能表名Mod功能

<?php
  /*    作者:       XXX
  *     创作时间:   XXXX.XX.XX
  *     Mod名:     名称
  */
  if(!isset($indexMod))//防止其他文件调用。
    die();
  Controller::doAction("Action名","Action方法名",要传给Action的唯一参数);
  ...多个Action为一个Mod提供服务
  Controller::showView("加载View中指定名称的view");//如果Controller指定了就不用
?>

调用Action

Controller::doAction(“Action类名”,”Action方法名”,封装后的参数);
Controller.php?action=Action类名&method=Action方法名
注:调用Action限定只在mod或URL中调用,您可以将URL调用关闭,关闭方法:将Controller.php中

if(isset($_GET['action'])&&isset($_GET['method'])){
    Controller::init();
    Controller::doAction($_GET['action'],$_GET['method']);
  }

段注释掉
Action文件格式:Action是一个静态类,类名要求规则与Mod相同。不过Action要求放在Action文件夹下且Action名与类名要求一致:

<?php
    //Action/Action名.php
    class Action名{
      public static function 方法名($param){
        if(Filter::拦截器方法名(拦截器参数))//调用Filter.php内的方法判断是否执行Service
          Controller::doService("Service名","Service方法名",要传给Service的唯一参数);
        ...多个Service为一个Action提供服务
        return 1;//返回1表示根据Mod决定前台文件,返回其它值则根据Controller的$action属性决定跳转到的Mod。
      }
    }
  ?>

调用Service

Controller::doService(“Service类名”,”Service方法名”,封装后的参数);
注:调用Service限定只在Action中调用
Service文件格式:Service同Action一样也是一个静态类,类名要求规则与Action相同。不过Service要求放在Service文件夹下:

<?php
    //Service/Service名.php
    class Service名{
      public static function 方法名($param){
        /*
          可对$GLOBALS变量操作,最后前台可以通过s标签获取$GLOBALS内的内容
          可引入Dao文件夹下的自定义的任何DaoObj类,类命名方式与Action一致,不过这里的类可以是动态类或静态类。
          调用方法:import("Dao.类名");,详见DB类解释
          可以在本类内任意方法内对业务逻辑进行处理。
        */
        return 1;//返回内容给Action使用
      }
    }
  ?>

DB类

本类主要用于调用数据库。
在Dao文件夹中创建任意DaoObj类,命名要求与Action相同(同Java,类名需与文件名一致),方便在Service中import(“Dao.”.类名);调用。
调用方法:

import("Dao.类名");
    $变量=new 类名();
    $变量返回=$变量->方法名();
    $变量->close();

DaoObj定义类结构如下:

<?php
        class 类名{
            private $db;
            function __construct(){
                  $this->db=new DB();
            }
            function close(){
                  $this->db->close();
            }
            function 方法名(参数列表){//正常定义普通方法
                  $返回值=$this->db->DB类的方法(参数);
                  //各种处理
                  return $返回值;
            }
        }
    ?>

DB类使用方法如下

DB类设置

属性:
h o s t = l o c a l h o s t ;

name=”数据库用户”;
p a s s = ; table=”数据库名”;
$ut=’utf8’;

query($sql);

参数:
s l s l

this->db->fetch_array()的参数,否则返回是否成功。
提示:
除该方法需对参数进行防注入处理外其余增删改查方法已对单引号替换,不需要防注入。

fetch_array($query);

参数:
u e r

this->db->query($sql)的返回值
返回值:
如果查询结果为空或全部查完了返回false,否则返回查询的一行数据。
使用方法:
$sql="select * from users";
    $query=$this->db->query($sql);
    while($row=$this->db->fetch_array($query)){
    //...这里写处理
    }

select_arr( n a m e , req = array(),$like=false);

参数:
n a m e

req 条件数组
$like 条件是否用like
返回值:
返回查询结果数组。
使用方法:
$result=$this->db->select_arr("users");
    foreach($result as $row){
        //这里写处理,$row为每一行的数据,如$row['username']为改行username列的值。
        //注意,$row中除了有列名为主键的之外还有数组下标为主键的值,因此需要处理后才可以json_encode
    }

select_first( n a m e , req);

参数:
n a m e

req 条件数组
返回值:
返回查询结果的第一条,没有则返回false。
使用方法:
$result=$this->db->select_first("users",array(
        "uid"=>1
    ));//查询uid为1的记录
    if($result)
        ;//有查询结果的情况

update( t a b l e , list,$tiao);

参数:
t a b l e

list 要更改的值
$tiao 条件数组
返回值:
query结果
使用方法:
$this->db->update("users",array(
        "password"=>md5("admin")
    ),array(
        "uid"=>1,
        "username"=>"admin"
    ));//更新uid为1且username为admin的用户的password列为md5("admin");

fn_del( t a b l e , c);

参数:
t a b l e

c 条件数组
返回值:
query结果
使用方法:
$this->db->fn_del("users",array(
        "uid"=>1
    ));//删除uid为1的用户

fn_insert( t a b l e , name,$arr);

参数:
t a b l e

name 插入数据列名(可以根据该参数进行排序,如果没有可以填写”“,需要则按数组顺序填写元素,如array(“uid”,”username”))
$arr 插入行的数据
返回值:
query结果
使用方法:
$this->db->fn_insert("users","",array(
        "null",
        "admin",
        "adminp"
    ));//插入一个第一列自增的第二列为admin,第三列为adminp的行,数据库语句内的null在数组里用字符串null表示。

affected_rows();

返回值:影响行数

insert_id();

返回值:AUTO_INCREASE列插入的id

View中的S标签

简介:

View内放置的是前台的网页内容,所有资源应放置在res文件夹下供view调用。view输出在index.php入口文件下,因此相对路径就是入口文件所在位置。
View中可以嵌入

<?php
        if(!isset($indexMod))
            die();
    ?>

主要是为了防止非法访问问题。

S标签简介

我们提供了以下标签内容:

<s:iterator value="arr">
    </s:iterator>
    <s:property type="item" value="username"/>
    <s:property value="username"/>
    <s:if test="f">
    <s:else />
    </s:if>

另外您可以自定义s标签,详见plugins下的S类。
解析类详见kernel下的ParseS类。

功能介绍

s:iterator 标签

属性:
value 对应全局变量 G L O B A L p h p A r r a v a l u e = u s e r . u i

GLOBALS[‘user’][‘uid’];
您也可获取session中的内容,获取方法:value=”session.username”

s:property 标签

属性:
value 同s:iterator的value,不过要求获取的值是php的字符串或数字等可直接输出的类型。
范例:value=”user.uid” 对应 $GLOBALS[‘user’][‘uid’];
type 指定为item时,必须与s:iterator搭配,表示该iterator中的循环元素。
范例:

<s:iterator value="users">
        a
        <s:property type="item" value="user.uid" />
        b
        <s:property type="item" value="user.username" />
        c
    </s:iterator>

对应php语句为

foreach($GLOBALS['users'] as $item){
        echo "a";
        echo $item['user']['uid'];
        echo "b";
        echo $item['user']['username'];
        echo "c";
    }

如果需要对属性进行遍历则需要如下写法:

<s:iterator value="pro">
        <s:iterator value="#sheng">
            <s:property value="#sheng" />=><s:property value="" />
        </s:iterator>
    </s:iterator>

对应php语句为

foreach($GLOBALS['pro'] as $sheng=>$shi){
        echo $sheng;
        echo "=>";
        echo $shi;//当property的value为空时其值为为当前遍历key=>value里的value。
    }

s:if 标签

属性:
test 调用Test.php中Test类的静态方法,其它属性值作为参数传入(不能在属性中嵌入s标签),当前运行状态可以通过kernel.HookParse类获取
范例:

<s:if test="test" v="a">
        <s:property value="user.username" />
    <s:else />
        <s:property value="user.password" />
    </s:if>

等价于:

if(Test::test(array("test"=>"test","v"=>"a")))
        echo $GLOBALS['user']['username'];
    else
        echo $GLOBALS['user']['password'];

s:css 标签

属性:
src css文件的名字
范例:

<s:css src="m.index" />

等价于

<link href="assests/css/m/index.css"  rel="stylesheet" type="text/css" />

s:js 标签

属性:
src js文件的名字
范例:

<s:js src="m.index" />

等价于

<script src="assests/m/index.js"  type="text/javascript" />

s:img 标签

属性:
src img文件的带后缀名字(可以加其他参数)
范例:

<s:img src="m.logo.png" width="100%"/>

等价于

<img src="assests/images/m/logo.png" width="100%" />

自定义标签

S类

简介

S类为自定义s标签插件类。当遇到不认识的s标签时,parse解释器会调用S插件内的以参数命名的方法执行其功能。每要输出一条数据时,index都会调用onText或onParamText两个参数中的一个。如果是普通文本则调用onText否则是s标签生成的就调用另一个。
自研php的仿java的ssh框架

S类方法命名

<s:g a="b">XXX</s:g>

这段代码用S类拦截需要定义两个标签:

public static function g($param){//<s:g>时执行的内容,$param是属性键值对的array
    $a=$param["a"];
    //...
    return "输出内容";
}
public static function _g(){//</s:g>时执行的内容
    //...
    return "输出内容";
}

如果需要对内部的内容进行控制,则需要在onText内对文本进行处理。您可以通过设置静态变量标志判断该text是不是标签内的内容。如果需要对内容内的标签进行处理,请使用kernel.HookParse类

预定义的s标签

我们已经预写了一些s标签,如:
s:checkcode标签用于显示验证码
验证码类:Service.model.ValidateCode
服务:Service.CheckCodeService
需要验证验证码可以使用Controller::doService(“CheckCodeService”,”checkCode”,验证码);方法。返回真伪值表示验证码是否正确。
s:jquery、s:tether、s:bootstrap、s:ueditor标签用于引用各前端js与css文件
详情请见主页范例。


以上所述就是小编给大家介绍的《自研php的仿java的ssh框架》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

AI Algorithms, Data Structures, and Idioms in Prolog, Lisp, and

AI Algorithms, Data Structures, and Idioms in Prolog, Lisp, and

George F. Luger、William A Stubblefield / Addison Wesley / 2008-09-04 / USD 22.20

This book is designed for three primary purposes. The first is as a programming language component of a general class in Artificial Intelligence. From this viewpoint, the authors see as essential that......一起来看看 《AI Algorithms, Data Structures, and Idioms in Prolog, Lisp, and 》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具