初始化
init.smarty.php
<?php define("ROOT", "."); //解决问题:Warning: strftime() [function.strftime]: date_default_timezone_set("Asia/Shanghai"); include ROOT."/libs/Smarty.class.php"; $tpl = new Smarty(); //smarty初始化 $tpl->template_dir=ROOT."/templates/"; $tpl->compile_dir=ROOT."/templates_c/"; //配置文件位置 $tpl->config_dir=ROOT."/configs/"; $tpl->left_delimiter="<!--{"; $tpl->right_delimiter="}-->"; ?>
一:在php文件中定义函数和块的使用
mysmarty.php
<?php /** * * 以下所有使用变量都要基于设定的前缀和后缀<!--{}--> * 函数使用 * * 1.在Smarty中是以自定义标记(类似于html标记)的使用形式,来使用函数 * * 2.使用smarty函数 * 2.1单行标记 * php中 * //smarty2的方式 * $tpl->register_function("hello","say"); * //smarty3的方式 * $tpl->registerPlugin("function","hello","say"); * 模板中调用 * <!--{hello size=5 color="green" content="22222" num=5 }--> * 2.2块标记 * php中 * //smarty2的方式 * $tpl->register_block("world","test"); * //smarty3的方式 * $tpl->registerPlugin("block","world","test"); * 模板中调用 * <!--{world size=8 color="red" num=4 }--> * world<!--{$title}--><br> * <!--{/world}--> * 3.传值 * php * $tpl->assign("title",$title); * $tpl->assign("color","pink"); * $tpl->assign("content","content"); * 模板(如果是关联数组需要使用1旁边的反引号来·来讲关联变量包含来进行先解析) * 可以在页面中使用$color和$content * <!--{hello size=5 color=$color content="$content" num=5 }--> * <!--{hello size=5 color=$color content="`$arr.one`" num=5 }--> * * */ //如果文件加载失败require会停止继续解析php;而include则会继续向下执行 require 'init.smarty.php'; $title="这是一个文字标题"; $tpl->assign("title",$title); $tpl->assign("color","pink"); $tpl->assign("content","content"); $tpl->assign("arr",array("one"=>"arr")); //注册单行函数 //smarty2的方式 // $tpl->register_function("hello","say"); // $tpl->register_block("world","test"); //smarty3的方式 $tpl->registerPlugin("function","hello","say"); //注册块 $tpl->registerPlugin("block","world","test"); /** * 定义函数,参数为数组放置标签的属性 * @param 传递参数 $args */ function say($args){ $html=""; for ($i=0;$i<$args["num"];$i++){ $html.='<font size=">'.$args["size"].'" color="'.$args["color"].'">'.$args["content"]."</font><br>"; } return $html; } /** * 定义块,参数为数组放置标签的属性 * @param 传递参数 $args * @param 传递内容 $content * @param 预留引用变量 $a * @param 预留引用变量 $b */ function test($args,$content,&$a,&$b){ $html=""; for ($i=0;$i<$args["num"];$i++){ $html.='<font size=">'.$args["size"].'" color="'.$args["color"].'">'.$content."</font><br>"; } return $html; } //模板文件名可以随便定义:比如:mysmarty.tpl只有内容是html就可以了 $tpl->display("mysmarty.html"); ?>
mysmarty.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><!--{$title}--></title> </head> <body> <!--{hello size=5 color=$color content="$content" num=5 }--> <!--{hello size=5 color=$color content="`$arr.one`" num=5 }--> <!--{world size=8 color="red" num=4 }--> world<!--{$title}--><br> <!--{/world}--> </body> </html>
二:在smarty插件文件夹plugins中加入新文件定义函数和块
mysmarty.php
<?php /** * * 以下所有使用变量都要基于设定的前缀和后缀<!--{}--> * 函数使用 * * 插件形式写函数 * 在plugins文件夹来定义 * 以function开头的表示函数:function.hello.php的函数名smarty_function_hello($args,$smarty) * 以block开头的表示块:block.world.php的函数名smarty_block_world($args,$content,&$smarty) * * */ //如果文件加载失败require会停止继续解析php;而include则会继续向下执行 require 'init.smarty.php'; $title="这是一个文字标题"; $tpl->assign("title",$title); $tpl->assign("color","pink"); $tpl->assign("content","content"); $tpl->assign("arr",array("one"=>"arr")); //模板文件名可以随便定义:比如:mysmarty2.tpl只有内容是html就可以了 $tpl->display("mysmarty2.html"); ?>
mysmarty.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><!--{$title}--></title> </head> <body> <!-- smarty插件文件夹中的自定义函数 --> <!--{html_select_date start_year="1980" end_year="2020"}--> <br> <!--{hello size=5 color=$color content="$content" num=5 }--> <!--{hello size=5 color=$color content="`$arr.one`" num=5 }--> <!--{world size=8 color="red" num=4 }--> world<!--{$title}--><br> <!--{/world}--> </body> </html>
在smarty插件文件夹plugins下的:
function.hello.php(注意命名规则)
<?php /** * 定义函数,参数为数组放置标签的属性 * @param 传递参数 $args */ function smarty_function_hello($args,&$smarty){ $html=""; for ($i=0;$i<$args["num"];$i++){ $html.='<font size=">'.$args["size"].'" color="'.$args["color"].'">'.$args["content"]."</font><br>"; } return $html; } ?>
block.world.php(注意命名规则)
<?php /** * 定义块,参数为数组放置标签的属性 * @param 传递参数 $args * @param 传递内容 $content * @param 预留引用变量 $a * @param 预留引用变量 $b */ function smarty_block_world($args,$content,&$smarty){ $html=""; for ($i=0;$i<$args["num"];$i++){ $html.='<font size=">'.$args["size"].'" color="'.$args["color"].'">'.$content."</font><br>"; } return $html; } ?>
gpio_set_value(port_num,0/1) 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了!
而gpio_direction_output (port_num,0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式。
因此,有人也许就会建议,把gpio_set_value这个函数直接去掉不用,是否可以,显然是可以的。
一般某个端口设置好了输入与输出模式后,最好不要经常变动。
首先要调用gpio_direction_output(),以后要设置高低电平时,直接使用gpio_set_value()就可以了,这样可以省却再次调用设置输出模式的操作,从而提高运行效率!
1、 新命令生成不同包结构的代码。用-p指定包名。命令如下
d: //进入D盘
mkdir WsTest /建立WsTest目录
cd WsTest //进入WsTest目录
wsimport -s . –p cn.itcast.zhanglei http://192.168.1.103:8888/hello?wsdl //指定包名
2、 根据博客1中得方法简单阐述理解wsdl文件,截图如下:
解析wsdl文件:以下解析属于我自己理解的文本。并非专业术语
说明:“由于WSDL文件是自下而上的倒叙方式。所以我们从下往上看”
1、<servicename="HelloWorldService"> :
从service切入,这是client端调用代码得到调用对象语句决定的:
//得到调用服务器端类对象
HelloWorld hw =
new HelloWorldService().getHelloWorldPort();
2、<portname="HelloWorldPort" binding="tns:HelloWorldPortBinding">
Protname是上面得到服务器之后的get方法名称。后面绑定的对象更是对该类的详细阐述包括方法等。继续往上看
3、<bindingname="HelloWorldPortBinding" type="tns:HelloWorld">
找到绑定的对象,看type属性继续追踪
4、<portTypename="HelloWorld">
找到表示该类的portype元素。看其子元素<operationname="SayHello">。Operation指定的也就是我们的方法。Sayhello的子元素中分别有
<inputwsam:Action="http://webservice.zhanglei.cn/HelloWorld/SayHelloRequest" message="tns:SayHello" />
<output wsam:Action="http://webservice.zhanglei.cn/HelloWorld/SayHelloResponse" message="tns:SayHelloResponse" />
此处表示SayHello方法的参数。继续追踪
5、<part name="parameters" element="tns:SayHello" />和<part name="parameters" element="tns:SayHelloResponse" />
参数的详细解析如上
6、<xsd:import namespace="http://webservice.zhanglei.cn/" schemaLocation="http://192.168.1.103:8888/hello?xsd=1" />
头部声明的namespace为服务器包得名称倒叙。加上http://也就是cn.zhanglei.webservice加上http://并且倒叙变为http://webservice.zhanglei.cn/
3、 上面解析wsdl文件完成之后。下一步通过注解去更改这个文档。因为很多时候我们并不想要客户端通过阅读文档知道我们真是的方法名、类名、参数名等
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService(serviceName="myService", name="myHello", targetNamespace="http://cn.zhanglei") public class HelloWorld { //服务器端方法 @WebMethod(operationName="sayGood") @WebResult(name="helloResult") public void SayHello(@WebParam(name="inputName")String name){ System.out.println("hello"+name); } public static void main(String[] args) { //Endpoint方法发布一个服务 //@Params address,new 服务类 Endpoint.publish("http://192.168.1.103:8888/hello", new HelloWorld()); System.out.println("发布了一个服务....."); } }
注解后的WSDL文档截图:
大家看看标黑的部分即明白上面的注解了。
方法详情url:http://192.168.1.103:8888/hello?xsd=1
开始—cmd运用wsimport命令生成对象的java文件拷贝到客户端。调用代码如下:
MyHello mh = new MyService().getMyHelloPort(); mh.sayGood("zhanglei");