路由模式:普通、强制和混合

普通模式:

  1. //配置文件关闭路由,完全使用默认的PATH_INFO方式URL
  2. 'url_route_on' => false,

关闭路由后的普通模式任然可以通过操作方法的参数绑定、控制器和空操作等特性实现url地址的简化

强制模式:

  1. //配置文件如下配置
  2. 'url_route_on' => true,
  3. 'url_route_must' => true,
  4.  
  5. //这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
  6.  
  7. //首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!
  8. Route::get('/',function(){
  9. return 'Hello,world!';
  10. });

混合模式:

  1. //开启路由,并使用路由定义+默认PATH_INFO方式的混合
  2. //配置如下
  3. 'url_route_on' => true,
  4. 'url_route_must'=> false,
  5. //该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL

动态注册和路由配置两种方式

由于检测机制问题,动态注册的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候。

动态注册:

路由定义采用\think\Route类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是

  1. Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    请求类型不指定的话默认为任何请求类型包含(GETPOSTPUTDELETE、*表示任何其他请求)
  1. 单个注册:
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

  2. 批量注册:
    Route::rule(
  3. [
  4. '路由规则1'=>'路由地址和参数',
  5. '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)']
  6. ],
  7. '',
  8. '请求类型',
  9. '匹配参数(数组)',
  10. '变量规则'
  11. );
  12.  
  13. Route::rule(
  14. [
  15. 'new/:id' => 'News/read',
  16. 'blog/:id' => ['Blog/update',['ext'=>'shtml'],['id'=>'\d{4}']
  17. ],
  18. ],
  19. '',
  20. 'GET',
  21. ['ext'=>'html'],
  22. ['id'=>'\d+']
  23. );
  24.  
  25. 路由地址:
  1. // 路由到默认或者绑定模块
  2. 'blog/:id'=>'blog/read',
  3. // 路由到index模块
  4. 'blog/:id'=>'index/blog/read',
    //多级控制
  1. 'blog/:id'=>'index/group.blog/read',//路由到index/controller/group/Blog
  1.  
  1. Route::rule(
  2. 'theme/:id/[:name]',
  3. 'home/Goods/theme',
  4. 'GET',
  5. [
  6. 'method'=>'POST|GET|PUT',//请求类型检测
  7. 'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
  8. 'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
  9. 'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
  10. 'https'=>true,//检测是否https请求
  11. 'before_behavior'=>'\app\index\behavior\UserCheck',//前置行为(检测)
  12. 'after_behavior'=>'\app\index\behavior\ReadInfo',//后置行为(执行)
  13. 'callback'=>'my_check_fun',//自定义检测方法
  14. 'merge_extra_vars'=>true,//合并额外参数
  15. 'cache'=>3600,//请求缓存V5.0.1+
  16. 'bind_model'=>['User','name'],//绑定模型V5.0.1+
  17. 'param_depr'=>'',//路由参数分隔符V5.0.2+
  18. 'ajax'=>true,//V5.0.2+
  19. 'pjax'=>true,//V5.0.2+
  20.  
  21. ],
  22. ['name'=>'\w+','id'=>'\d+']
  23. );

规则表达式

通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

  1. Route::rule('/', 'index'); // 首页访问路由
  2. Route::rule('my', 'Member/myinfo'); // 静态地址路由
  3. Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合
  4. Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合
  5. Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址

当控制器文件不再controler文件夹下而是在controller子文件夹下时我们定义路由地址格式为[子文件名.  控制器名]

如:

  1. //controller/v1/Banner.php 访问为:http://www.localhost/api/v1/banner/1
  2. Route::get("api/v1/banner/:id","api/v1.Banner/getBanner");
  3.  
  4. //下面是动态调用(如不同版本)
  5. Route::get("api/:version/banner/:id","api/:version.Banner/getBanner");
  6. //当前新品
  7. Route::get("api/:version/product/recent","api/:version.Product/getRecent");

ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。

application/route.php注册   然后访问变成http://serverName/new/5

  1. use think\Route;
  2. // 注册路由到index模块的News控制器的read操作
  3. Route::rule('new/:id','index/News/read');

不同的请求类型定义路由规则的简化方法:请求类型参数必须大写

  1. Route::get('new/:id','News/read'); // 定义GET请求路由规则
  2. Route::post('new/:id','News/update'); // 定义POST请求路由规则
  3. Route::put('new/:id','News/update'); // 定义PUT请求路由规则
  4. Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
  5. Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
  1. //如果要定义get和post请求支持的路由规则,也可以用:
  2. Route::rule('new/:id','News/read','GET|POST');

参数可选定义

  1. Route::get('blog/:year/[:month]','Blog/archive'); //变量用 [ ] 包含起来后就表示该变量是路由匹配的可选变量
  2.  
  3. 下面的URL访问地址都可以被正确的路由匹配:
  4. http://serverName/index.php/blog/2015
  5. http://serverName/index.php/blog/2015/12

路由标志:设置一个唯一的用于url生成的字符

  1. // 注册路由到index模块的News控制器的read操作
  2. Route::name('new_read')->rule('new/:id','index/News/read');
  3. //生成路由地址的时候就可以使用
  4. url('new_read',['id'=>10]);
  5. //如果不定义路由标识的话,使用下面的方式生成
  6. url('index/News/read',['id'=>10]);
  7.  
  8. V5.1.6+ 版本开始,路由标识的用法调整,原来的用法:
  9. // 注册路由到index模块的News控制器的read操作
  10. Route::name('new_read')->rule('new/:id','index/News/read');
  11. 需要改为:
  12. // 注册路由到index模块的News控制器的read操作
  13. Route::rule('new/:id','index/News/read')->name('new_read');
  14. 因为后者更符合语义。

路由别名:Route::alias('别名','模型/控制器');

  1. use think\Route;
  2. Route::alias('home','index/index');
  3. Route::alias('admin','admin/index');
  4. 或者:
  5. return [
  6.  
  7. '__alias__' => [
  8. 'home' => 'index/index',
  9. 'admin'=> 'admin/index'
  10. ],
  11.  
  12. ];
  1. use think\Route;
  2. // 注册路由到index模块的News控制器的read操作
  3. Route::rule('show/:id','test/Index/index');//id必须
  4. Route::rule('show/[:id]','test/Index/index');//id可选
  5. Route::rule('new/:id','News/update','POST');//第三个参数为空则表示接受所有的请求类型的参数
  6. //完全匹配
  7. Route::rule('show/:id$','test/Index/index');//只有http://www.admindemo2.com/show/2才能访问而去掉$的话http://www.admindemo2.com/show/2/3/tom/...也能通过
  8. //全局完全匹配(开启全局完全匹配后所有的都不用再加$)
  9. //配置文件添加
  10. //'route_complete_match' => true,//开启路由定义的全局完全匹配
  11. //当开启全局完全匹配的时候,如果个别路由不需要使用完整匹配,可以添加路由参数覆盖定义:
  12. //Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]);
  13.  
  14. Route::get('routeget','test/Index/routeGet'); // 定义GET请求路由规则,同Route::rule('routeget','test/Index/routeGet','GET');//只接受get的请求
  15. Route::get('routeget/:id','test/Index/routeGet'); // 同//Route::rule('routeget/:id','test/Index/routeGet','GET');//只接受get的请求
  16. //注意: Route::get('routeget','test/Index/routeGet');与Route::get('routeget/:id','test/Index/routeGet');同时定义相当于Route::get('routeget/[:id]]','test/Index/routeGet');文档说明:注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测 所以为了避免冲突最好将优先级高的放在最前面(比如单个设置的变量规则和路由规则放前面,全局的放在最后面)
  17. Route::rule('routepost','test/Index/routePost','POST');//post的请求才能接受
  18. Route::rule('routepostorget','test/Index/routePostOrGet','POST|GET');//只接受get和post请求,其他一律不接受
  19.  
  20. // 定义new路由命名标识
  21. Route::rule(['name','routenameflag/:id'],'test/Index/routeNameFlag');
  22. //http://www.admindemo2.com/routenmeflag/1
  23. //{:url('name',['id'=>1])}
  24. Route::rule(['name2','routenameflag2/'],'test/Index/routeNameFlag2');//第二个参数有没有/都无所谓
  25. //http://www.admindemo2.com/routenmeflag2 or //http://www.admindemo2.com/routenmeflag2/
  26. //{:url('name2')}
  27. Route::rule(['name3','routenameflag3/[:id]'],'test/Index/routeNameFlag3');
  28. //http://www.admindemo2.com/routenmeflag3 or //http://www.admindemo2.com/routenmeflag3/1
  29. //{:url('name3')} or //{:url('name',['id'=>1])}
  30.  
  31. //批量注册:
  32. Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
  33. Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
  34.  
  35. /*
  36.  
  37. Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
  38.  
  39. Route::rule(
  40. [
  41. '路由规则1'=>'路由地址和参数',
  42. '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)']
  43. ],
  44. '',
  45. '请求类型',
  46. '匹配参数(数组)',
  47. '变量规则'
  48. );
  49.  
  50. */
  51.  
  52. Route::rule(
  53. [
  54. 'new/:id' => 'News/read',
  55. 'blog/:id' => ['Blog/update',['ext'=>'shtml'],['id'=>'\d{4}']],
  56. ':action/blog/:id' => 'index/blog/:action',// action变量的值作为操作方法传入
  57. ':c/:a'=> 'index/:c/:a',// 变量传入index模块的控制器和操作方法
  58. ],
  59. '',
  60. 'GET',
  61. ['ext'=>'html'],
  62. ['id'=>'\d+']
  63. );
  64.  
  65. //变量规则
  66. //1、设置单个路由全局的变量规则
  67. Route::rule('new/:tittle','News/update');
  68. // 设置tittle变量规则(采用正则定义)
  69. Route::pattern('name','\w+');
  70. //2、批量设置路由全局规则
  71. Route::rule('new/:tittle','News/update');
  72. Route::rule('banner/:id','home/Goods/banner');
  73. Route::pattern([
  74. 'tittle' => '\w+',
  75. 'id' => '\d+',
  76. ]);
  77. //3、设置局部变量规则,仅在当前路由有效
  78. Route::get('new/:name','News/read',[],['name'=>'\w+']);
  79.  
  80. //4、完整URL规则
  81. Route::get('allurl/:catergory','test/Index/allUrl',[],['__url__'=>'allurl\/[A-Za-z0-9]{1,}$']);//id必须
  82.  
  83. //组合变量
  84. //http://www.admindemo2.com/item-sb or http://www.admindemo2.com/item-sb555 or http://www.admindemo2.com/item-sb555a
  85. /*Route::get('item-<name><id?>','test/Index/product',[],['name'=>'\w+','id'=>'\d+']);*/
  86. // http://www.admindemo2.com/item-sb-555
  87. Route::get('item-<name>-<id>','test/Index/product',[],['name'=>'\w+','id'=>'\d+']);
  88.  
  89. Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
  90.  
  91. Route::rule(
  92. 'theme/:id/[:name]',
  93. 'home/Goods/theme',//路由地址
  94. 'GET',
  95. [
  96. 'method'=>'POST|GET|PUT',//请求类型检测
  97. 'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
  98. 'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
  99. 'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
  100. 'https'=>true,//检测是否https请求
  101. 'before_behavior'=>'\app\index\behavior\UserCheck',//前置行为(检测)
  102. 'after_behavior'=>'\app\index\behavior\ReadInfo',//后置行为(执行)
  103. 'callback'=>'my_check_fun',//自定义检测方法
  104. 'merge_extra_vars'=>true,//合并额外参数
  105. 'cache'=>3600,//请求缓存V5.0.1+
  106. 'bind_model'=>['User','name'],//绑定模型V5.0.1+
  107. 'param_depr'=>'',//路由参数分隔符V5.0.2+
  108. 'ajax'=>true,//V5.0.2+
  109. 'pjax'=>true,//V5.0.2+
  110.  
  111. ],
  112. ['name'=>'\w+','id'=>'\d+']
  113. );
  114.  
  115. //路由地址
  116.  
  117. //1、额外参数:
  118. Route::get('extraparams/:id','test/Index/extraParam?status=1&app_id=5');
  119. // http://www.admindemo2.com/extraparams/2/3 访问
  120. // Request::instance()->route()能获取到id、status、app_id
  121.  
  122. //2 路由到模块/控制器 [模块/控制器/]操作?参数1=值1&参数2=值2...
  123. //2.1 路由到默认或者绑定模块
  124. Route::rule('blog/:id','index/read');
  125. //2.2 路由到index模块
  126. Route::rule('blog/:id','test/index/read');
  127.  
  128. //2.3、路由到动态的模块、控制器或者操作
  129. //http://www.admindemo2.com/moviemodel/index/1 访问到的是test/Index/movieModel()
  130. Route::rule(':action/index/:id','test/Index/:action');
  131. //http://www.admindemo2.com/moviemodel/lichihua/1 访问到的是test/Index/movieModel()
  132. Route::rule(':action/lichihua/:id','test/Index/:action');
  133.  
  134. //4 路由到操作方法 @[模块/控制器/]操作
  135. //'blog/:id'=>'@index/blog/read', 系统会直接执行 Loader::action('index/blog/read');
  136. //这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块,视图的默认模板规则失效,所以这种情况下面,如果使用了视图模板渲染,则必须传入明确的参数
  137. Route::get('test/:id','@test/Index/dongTest?status=1'); //??
  138.  
  139. //路由到类的方法 路由地址的格式为(动态方法):\类的命名空间\类名@方法名 或者(静态方法):\类的命名空间\类名::方法名
  140.  
  141. //可以支持执行任何类的方法,而不仅仅是执行控制器的操作方法
  142. Route::rule('blog/:id','\app\index\service\Blog@read');//执行的是 \app\index\service\Blog类的read方法
  143. Route::rule('blog/:id','\app\index\service\Blog::read');
  144. //V5.0.4+版本开始,支持传入额外的参数作为方法的参数调用(用于参数绑定),例如:
  145. Route::rule('blog/:id','\app\index\service\Blog::read?status=1');
  146.  
  147. //路由到重定向地址 以/或者http 开头
  148. Route::rule('wolichihua/:id','/test/:id');
  149. //http://www.admindemo2.com/wolichihua/1 访问到了est/Index/dongTest即上面定义的test/:id'
  150.  
  151. //资源路由
  152. //在指向index模块的blog控制器新建index()、create($id)、save、read($id)、eidit($id)、update($id)、delete($id)方法然后动态注册(资源路由会自动注册7个路由规则分别对应这几个方法) 详情参考资源路由
  153. Route::resource('blog','index/blog');
  154. //或者路由配置
  155. return [
  156. // 定义资源路由
  157. '__rest__'=>[
  158. // 指向index模块的blog控制器
  159. 'blog'=>'index/blog',
  160. ],
  161. // 定义普通路由
  162. 'hello/:id'=>'index/hello',
  163. ];
  164.  
  165. //快捷路由 Route::controller('user','模块/控制器');
  166. // 给User控制器设置快捷路由 控制器方法为 请求类型+方法名 如getInfo()与postInfo()
  167. // get http://localhost/user/phone post http://localhost/user/info
  168. Route::controller('user','index/User');
  169.  
  170. //路由别名
  171. //我们希望使用user可以访问Home模块的User控制器的所有操作 那么我么定义别名为
  172. Route::alias('user','home/User');
  173. //或者
  174. return [
  175. '__alias__' => [
  176. 'user' => 'home/User',
  177. ],
  178. ];
  179.  
  180. //路由别名可以指向任意一个有效的路由地址,例如下面指向一个类
  181. // user 路由别名指向 User控制器类
  182. Route::alias('user','\app\index\controller\User');
  183.  
  184. //路由分组 允许把相同前缀的路由定义合并分组
  185. Route::group('blog',[
  186. ':id' => ['Blog/read', ['method' => 'get'], ['id' => '\d+']],
  187. ':name' => ['Blog/read', ['method' => 'post']],
  188. ],['ext'=>'html']);
  189.  
  190. //MISS路由:没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS路由功能, MISS路由配置后相当于开启了强制路由
  191. //全局MISS路由
  192. //Route::miss(); 放到路由的第一行才能生效,放到最后一行或者return里面不生效?????
  193. Route::miss('public/miss');//当没有匹配到所有的路由规则后,会路由到 public/miss路由地址。
  194. //分组MISS路由 分组支持独立的MISS路由
  195. //
  196. //
  197. //闭包支持:
  198. Route::get('hello/:name',function($name){
  199. return 'Hello,'.$name;
  200. });
  201. //闭包还支持模板师视图
  202. Route::get('/', function () {
  203. return view('admin@home/index');
  204. });
  205.  
  206. //路由绑定
  207. // 绑定当前的URL到 index模块
  208. Route::bind('index');
  209. // 绑定当前的URL到 index模块的blog控制器
  210. Route::bind('index/blog');//http://serverName/index/blog/read/id/5可以简化成http://serverName/read/id/5 ;如果定义了路由Route::get('index/blog/:id','index/blog/read');那么访问URL就变成了http://serverName/5
  211.  
  212. // 绑定当前的URL到 index模块的blog控制器的read操作
  213. Route::bind('index/blog/read');
  214.  
  215. // 绑定命名空间
  216. Route::bind('\app\index\controller','namespace');//通过http://serverName/blog/read/id/5就可以直接访问 \app\index\controller\Blog类的read方法。
  217.  
  218. // 绑定到类
  219. Route::bind('\app\index\controller\Blog','class');//通过http://serverName/read/id/5就可以直接访问 \app\index\controller\Blog类的read方法。
  220.  
  221. //入口文件绑定
  222. // 复制一份入口文件添加define('BIND_MODULE','admin'); 命名为demo.php 我们访问这个demo.php就访问的是admin模块
  223.  
  224. // 自动入口绑定
  225. // 配置文件开启入口文件自动绑定模块 'auto_bind_module' => true,
  226. //复制一份index.php 改名为demo.php 访问index.php是访问index模块 访问的demo.php则访问得是demo模块
  227.  
  228. //域名路由 省略

定义路由后参数的获取问题:

  1. Route::get('hello/:id','index/test/hello');
  2. 以下三种是获取不到值的:
  3. dump(request()->get());
  4. dump(request()->get('id'));
  5. dump(input('get.id'));
  6. 我们只有通过:下面这几个才能获取到
  7. dump(request()->param());
  8. dump(request()->param('id'));
  9. dump(request()->route());
  10. dump(request()->route('id'));
  11. 怎么才能让get获取到?
  12. 参数绑定和?后面的如:
  13. public function hello($id){
  14. dump(request()->get());
  15. dump(input('get.'));
  16. }
  17. 浏览器输入:域名/hello/10?name=123
  18. array (size=2)
  19. 'name' => string '123' (length=3)
  20. 'id' => string '10' (length=2)

路由之后这些方法的controller和action的的值与实际的不同了

  1. 11.// 调用Request对象的path方法
  2. 12.{$Request.path}
  3. 13.// 调用Request对象的module方法
  4. 14.{$Request.module}
  5. 15.// 调用Request对象的controller方法
  6. 16.{$Request.controller}
  7. 17.// 调用Request对象的action方法
  8. 18.{$Request.action}

tp5的路由的更多相关文章

  1. ThinkPHP5.0框架开发--第4章 TP5.0路由

    ThinkPHP5.0框架开发--第4章 TP5.0路由 第4章 TP5.0 路由 ================================================== 上次复习 1. ...

  2. tp5.1路由报错No input file specified.

    问题: 按照官方教安装了框架,打开首页没问题,可是安装教程路由规则打开 "http://127.0.0.1/hello/2" 时, 却报错误  "No input fil ...

  3. TP5使用路由模式报错 No input file specified.

    热烈推荐:超多IT资源,尽在798资源网 application/route.php 是设置路由的文件. 将 route.php 代码修改为 <?php use think\Route; Ro ...

  4. nigx下配置tp5.1路由

    打开宝塔面板,找到你要配置路由的网站并找到配置文件(如图1) (图1) 2.在配置文件里添加一下代码 set $root = /www/wwwroot/www.blogs.test/public; # ...

  5. TP5自定义路由,为了安全性

    1,入口文件index.php,不要指定任意模块,不然,自定义路由,就不会有任何效果哦 2,在配置文件 route.php  中引进   use think\Router  自带路由文件 3,将路由进 ...

  6. TP5动态路由配置好了但是报错was not found on this server的原因以及解决方法

    问题:The requested URL /xxxx.html was not found on this server 原因:apache的重写未开启,开启重写后,问题解决, 方法如下: apach ...

  7. thinkphp最简单路由

    thinkphp最简单路由 一.总结 1.路由应用场景(前台要,后台不要):前台所有人都可以看,所以前台的话设置路由,后台的话并不是所有人都进去,所以不需要设置路由 2.模块分离来实现路由场景应用:前 ...

  8. ThinkPHP5入门(二)----控制器篇

    一.控制器访问 1.命名空间 命名空间与目录路径对应. 如:路径位置为:application/index/controller/Index.php 其文件的命名空间应为:app\index\cont ...

  9. nginx 通过IP访问项目

    项目新需求,因为是小范围使用的网站,所以不打算配域名,直接通过IP访问当前项目. 环境: LNMP 一键集成环境 当前IP指向的目录 :/home/wwwroot/default/ 但是我的项目.需要 ...

随机推荐

  1. 处理:“ORA-28002: the password will expire within 7 days”的问题

    一:问题描述: 二:处理步骤 [oracle@localhost 2018_07_14]$ rlwrap sqlplus / as sysdba; SQL*Plus: Release 11.2.0.3 ...

  2. Idea-Java接入银联支付的Demo

    注:本文来源于:< Idea-Java接入银联支付的Demo > 接入银联支付的Demo,希望能给大家节约一点时间 https://github.com/wangfei0904306/un ...

  3. 1709: Fire or Retreat(zzuli)

    水题,哎,可是第一次是因为编译错了,vs不知咋了,无奈: 后面几次又因为类型用了int错了,痛苦: 题目描述 在与科技水平远胜于我们的外星人的战斗最后,我们能够用来对外星装甲造成伤害的武器只剩下了…… ...

  4. CSS3媒体查询的部分重要属性

    width:视口宽度 height:视口高度 device-width:渲染表面的宽度,就是设备屏幕的宽度 device-height:渲染表面的高度,就是设备屏幕的高度 orientation:检查 ...

  5. OAuth2 token

    1.资源服务器 package com.ruhuanxingyun.config; import com.fasterxml.jackson.databind.ObjectMapper; import ...

  6. PHP 方法,类与对象的相关函数学习

    1.function_exists function_exists(string)检测函数是否存在,string表示需要检测的函数名称(注意与property_exists,method_exists ...

  7. 性能测试四十九:ngrinder压测平台

    下载地址:https://sourceforge.net/projects/ngrinder/files/ ngrinder工作原理:这里的controller就是ngrinder平台 部署(以win ...

  8. Python判断字符串是否xx开始或结尾

    判断是否xx开始 使用startswith 示例代码: String = "12345 上山打老虎" if str(String).startswith('1'): #判断Stri ...

  9. MyBatis - 6.Spring整合MyBatis

    1.查看不同MyBatis版本整合Spring时使用的适配包: http://www.mybatis.org/spring/ 2.下载整合适配包 https://github.com/mybatis/ ...

  10. Linux(centos)系统各个目录的作用详解 推荐

    文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat ...