vivoy66l卡刷包手机的相机能检测到红外线么

3329人阅读
web 开发(9)
Protocol Buffers(3)
本文适用于了解spring框架,同时想在spring项目中使用Protocol Buffers(以下简称PB)的读者。
本文标题为《spring 项目中集成 Protocol Buffers 示例》,意思当然是教读者如何将PB配置到spring项目中去,但事实上在spring项目中使用PB无需任何配置,命该题目的用意也是让正在苦苦寻找配置方式的朋友在此止步,因为当初我也是这样。
什么是PB?以下为PB官网的描述。
译为:PB是一种高效的且可扩展的结构化数据编码方案。Google将其用在内部的几乎所有的RPC协议和文件格式。
通俗的讲PB是一个不错的序列化和反序列化方案,其采用二进制编码方案,效率比xml、json高。将PB用在文件存储、网络传输都是不错的选择。为什么这么说?
比如我们需要在服务器与客户端之间传输一些结构化的数据(对象、结构体),我们怎么去序列化和反序列化呢?你可能想到了以下方案:
1.使用Java Serialization。但这是依赖于java语言的,客户端和服务器采用不同的语言实现时就不好办了,而且Java Serialization公认的有一些问题。
2.定义自己的格式,比如约定“第几个字节表示内容长度”、“第几个字节表示数据类型”、“某某符号表示分隔符”等等,很明显这只能适用于一些数据格式很简单的场合。
3.使用xml或者json。首先xml的臃肿是大家都诟病的。另外xml和json的树形结构使用起来也是比较繁琐的,肯定是不及类使用起来简单。不过他们还是有一个PB不具备的优点,那就是数据的自描述性。如果这一点是你看重的,那么xml和json还是可以成为被选择的理由。
说了这么多,到底PB怎么用呢?下面我将以在springMVC项目中使用PB为示例介绍其基本用法。其实PB不依赖于任何平台或框架,原则上只要语言支持就可以,目前支持Java、C++、Python。
去下载编译器。
去搜索并下载PB的jar包。
二、定义.proto文件
约定数据格式,然后用PB的语法将其定义为.proto文件。这里使用官网的例子。
//这里声明输出的java的包名
option java_package = &com.example.tutorial&;
//这里声明输出的java的类名
option java_outer_classname = &AddressBookProtos&;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
repeated PhoneNumber phone = 4;
message AddressBook {
repeated Person person = 1;
1.上面的例子是定义一个电话薄,电话薄AddressBook包含多个Person,一个Person有name等属性,还有多个PhoneNumber,一个PhoneNumber有PhoneType枚举……
2.可以看出.proto文件中除了可以定义基本的数据类型,比如int32、string,还可以嵌套使用自定义的类型,比如AddressBook中使用Person类型。
3.属性声明前的required、optional、repeated分别表示必须赋值、可为空、集合。
使用之前下载的编译器编译.proto文件,命令格式为:
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
如果将编译器protoc.exe放到和.proto文件一起,输出目录为当前路径的话编译命令可以简化为:
protoc.exe --java_out=. addressbook.proto
输出路径参数“.”表示当前目录。
编译完成后当前目录下生成了com\example\tutorial\AddressBookProtos.java文件。然后我们就可以直接使用这个代码文件了。
四、server端使用
在springMVC项目中加入PB的jar包,除此之外没有任何的配置。
将生产的代码文件AddressBookProtos.java拷到项目中,包名要一致。
在controller层中通过request拿到inputstream对象,然后通过PB对象的静态方法parseFrom()就可从输入流中反序列化出PB实例。
如果向客户端返回PB对象,则通过PB实例的writeTo()方法,参数为OutputStream。
例子代码:
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import com.example.tutorial.AddressBookProtos.AddressB
import com.example.tutorial.AddressBookProtos.P
&* @author shannon
@Controller
@RequestMapping(&/pbtest&)
public class TestController {
&& &@RequestMapping(&upload&)
&& &public void upload(HttpServletRequest request, HttpServletResponse response) throws IOException {
&& &&& &InputStream inputStream = request.getInputStream();
&& &&& &AddressBook addressBook = AddressBook.parseFrom(inputStream);
&& &&& &inputStream.close();
&& &&& &System.out.println(addressBook);
&& &@RequestMapping(&download&)
&& &public void download(HttpServletResponse response) throws IOException{
&& &&& &Person john = Person.newBuilder()
&& &&& &&& &&&& .setId(1234)
&& &&& &&& &&&& .setName(&John Doe&)
&& &&& &&& &&&& .setEmail(&&)
&& &&& &&& &&&& .addPhone(
&& &&& &&& &&&&&& Person.PhoneNumber.newBuilder()
&& &&& &&& &&&&&&&& .setNumber(&555-4321&)
&& &&& &&& &&&&&&&& .setType(Person.PhoneType.HOME))
&& &&& &&& &&&& .build();
&& &&& &AddressBook addressBook = AddressBook.newBuilder().addPerson(john).build();
&& &&& &response.setContentType(&application/x-protobuf&);
&& &&& &OutputStream outputStream = response.getOutputStream();
&& &&& &addressBook.writeTo(outputStream);
&& &&& &outputStream.flush();
&& &&& &outputStream.close();
说明:upload接口和download接口分别是上传和下载电话薄。
五、client端使用
在客户端工程中加入PB的jar包,拷入代码文件AddressBookProtos.java。
下面的例子模拟客户端向服务器发送和接收电话薄。
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.net.HttpURLC
import java.net.URL;
import com.example.tutorial.AddressBookProtos.AddressB
import com.example.tutorial.AddressBookProtos.P
&* @author shannon
public class PBClientTest {
&& &public static void main(String[] args) throws IOException {
&& &&& &String url = &/pbtest/upload.pb&;
&& &&& &upload(url);
&& &&& &String url2 = &/pbtest/download.pb&;
&& &&& &download(url2);
&& &public static void upload(String url) throws IOException {
&& &&& &Person john = Person.newBuilder()
&& &&&& .setId(1234)
&& &&&& .setName(&John Doe&)
&& &&&& .setEmail(&&)
&& &&&& .addPhone(
&& &&&&&& Person.PhoneNumber.newBuilder()
&& &&&&&&&& .setNumber(&555-4321&)
&& &&&&&&&& .setType(Person.PhoneType.HOME))
&& &&&& .build();
&& &&& &AddressBook addressBook = AddressBook.newBuilder().addPerson(john).build();
&& &&& &byte[] content = addressBook.toByteArray();
&& &&& &URL targetUrl = new URL(url);
&& &&& &HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
&& &&& &connection.setDoOutput(true);
&& &&& &connection.setDoInput(true);
&& &&& &connection.setRequestProperty(&Content-Type&, &application/x-protobuf&);
&& &&& &connection.setRequestProperty(&Accept&, &application/x-protobuf&);
&& &&& &connection.setRequestMethod(&POST&);
&& &&& &connection.setRequestProperty(&Connect-Length&, Integer.toString(content.length));
&& &&& &connection.setFixedLengthStreamingMode(content.length);
&& &&& &OutputStream outputStream = connection.getOutputStream();
&& &&& &outputStream.write(content);
&& &&& &outputStream.flush();
&& &&& &outputStream.close();
&& &public static void download(String url) throws IOException {&& &&& &
&& &&& &URL target = new URL(url);
&& &&& &HttpURLConnection conn = (HttpURLConnection) target.openConnection();
&& &&& &conn.setDoOutput(true);
&& &&& &conn.setDoInput(true);
&& &&& &conn.setRequestMethod(&GET&);
&& &&& &conn.setRequestProperty(&Content-Type&, &application/x-protobuf&);
&& &&& &conn.setRequestProperty(&Accept&, &application/x-protobuf&);
&& &&& &conn.connect();
&& &&& &// check response code
&& &&& &int code = conn.getResponseCode();
&& &&& &System.out.println(&code:& + code);
&& &&& &System.out.println(conn.getContent());
&& &&& &boolean success = (code &= 200) && (code & 300);
&& &&& &InputStream in = success ? conn.getInputStream() : conn.getErrorStream();
&& &&& &AddressBook addressBook = AddressBook.parseFrom(in);
&& &&& &in.close();
&& &&& &System.out.println(addressBook);
1.客户端为普通的java project就可以了。
2.我这里的url的后缀为.pb,这要依照server端的web.xml配置,可以配置为其他的,比如.html
上面的例子演示了如何序列化和反序列PB对象,其实就是调用PB对象自身提供的方法,比如parseFrom、writeTo。可以看出PB的使用的确是很方便的。通过一个方法就可以将二进制数据转为对象。
什么?你连转换对象的方法都不想调?那就参考客吧!
:/p/protobuf/
:http://search.maven.org/
:http://blog.csdn.net/fangzhangsc2006/article/details/8687415
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:112479次
积分:1466
积分:1466
排名:千里之外
原创:35篇
评论:36条
(2)(1)(3)(2)(4)(3)(3)(6)(7)(5)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于Flex和J2EE架构CMS系统设计和实现.pdf56页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:200 &&
你可能关注的文档:
··········
··········
llllUUIIlll IIIIIIIIIII[1lll Y座机电话号码 in ADissertation ComputerApplicationTechnology and ofCMS Basedon ImplementationSystem
Design FI, xeldna andJ2―15EJZE Candidate: Guanglei Cheng Supervisor: Prof.MengXiangrui Schoolof Scienceand Computer Engineering Scienceand AnHui
of University Technology No.1 1,P.R.CHINA Road,Huainan,23200 68,Shungeng 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作
及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方 以外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含
为获得 塞邀堡王态堂
或其他教育机构的学位或证书而使用过
的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中
作了明确的说明并表示谢意。
学位论文作者签名:
鱼该 日期:翌生年』月旦日 学位论文版权使用授权书 本学位论文作者完全了解塞邀堡三太堂有保留、使用学位论 文的规定,即:研究生在校攻读学位期间论文工作的知识产权单位 属于塞邀堡王太堂。学校有权保留并向国家有关部门或机构送交 论文的复印件和磁盘,允许论文被查阅和借阅。本人授权 安徽 理工大学
可以将学位论文的全部或部分内容编入有关数据库进 行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论 文。 保密的学位论文在解密后适用本授权书 学位论文作者签名:钽嵇磊 签字日期:Ⅺ仁年6月“日
导师签名:壶i军玮 签字日期:乙ol乙年5月“日 摘
要 摘 要 随着互联网的快速发展,以及网站用户的不断增加,有很多公司、部门、学
校等机构已经建立了自己的网站。当前互联网在不断发展和变化着,这些网站也
渐渐成为我们生活中不可分割的一部分,与此同时,互联网
正在加载中,请稍后...1690人阅读
通常我们在做B/S系统时会涉及到需要控制页面上按钮的权限,也就是不同的用户登录系统,在页面上看到的按钮不一样,针对这种需求,一般会采用硬编码的方式实现,其实可以通过一种简单的方式来实现页面按钮权限的控制:自定义Freemarker标签。下面看最终效果代码片段:
& & & & & &&div class=&btn-group billheader&&
& & &@auth paddingtext=&&&& &
&a class=&btn& id=&submit& href=&#&&&i class=&icon-plus&&&/i&提交&/a&
&a class=&btn& id=&audit& href=&#&&&i class=&icon-lock&&&/i&审核&/a&
&a class=&btn& id=&remove& href=&#&&&i class=&icon-remove&&&/i&作废&/a&
&a class=&btn& id=&print& href=&#&&&i class=&icon-print&&&/i&打印&/a&
&a class=&btn& id=&refresh& href=&#&&&i class=&icon-refresh&&&/i&刷新&/a&
FreeMarket标签实现代码:
&* Description: TODO {页面控件授权标签}&br/&
&* @author Administrator
&* @date: 日 上午9:34:38
&* @version 1.0
&* @since JDK 1.7
public class AuthDirective implements TemplateDirectiveModel {
& & Logger logger = Logger.getLogger(AuthDirective.class);
& & private MenuInfoService menuInfoServiceI
& & public void execute(Environment env, @SuppressWarnings(&rawtypes&) Map params, TemplateModel[] loopVars,
& & & & & & TemplateDirectiveBody body) throws TemplateException, IOException {
& & & & String spacetext = &&;
& & & & if (params.get(&paddingtext&) != null) {
& & & & & & spacetext = ((SimpleScalar) params.get(&paddingtext&)).getAsString();
& & & & HttpServletRequest request = this.getRequest();
& & & & String url = request.getServletPath();
& & & & // 获取用户登录信息
& & & & UserInfo userInfo = this.getLoginUserInfo(request);
& & & & if (userInfo != null) {
& & & & & & // 获取用户菜单页面
& & & & & & MenuInfo menuInfo = this.menuInfoServiceImpl.getMenuInfo(url, userInfo.getRoleList());
& & & & & & if (menuInfo != null) {
& & & & & & & & (JSON.toJSONString(menuInfo));
& & & & & & & & // 输出授权后html内容到页面
& & & & & & & & body.render(new authFilterWriter(env.getOut(), menuInfo, spacetext));
& & & & & & } else {
& & & & & & & & env.getOut().write(&&);
& & & & & & }
& & & & } else {
& & & & & & env.getOut().write(&&);
& & private HttpServletRequest getRequest() {
& & & & ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
& & & & HttpServletRequest request = attr.getRequest();
& & private UserInfo getLoginUserInfo(HttpServletRequest request) {
& & & & if (request != null && request.getAttribute(&userInfo&) != null) {
& & & & & & UserInfo userInfo = (UserInfo) request.getAttribute(&userInfo&);
& & & & & & return userI
& & & & } else {
& & & & & &
& & private String parseHtml(String html, MenuInfo menuInfo, String spacetext) {
& & & & StringBuilder sBuilder = new StringBuilder();
& & & & List&CtrlInfo& ctrlInfos = menuInfo.getCtrlInfos();
& & & & for (CtrlInfo ctrlInfo : ctrlInfos) {
& & & & & & String autHtml = this.getAutHtml(ctrlInfo.getSelector(), html);
& & & & & & sBuilder.append(autHtml.toLowerCase());
& & & & & & sBuilder.append(spacetext);
& & & & return sBuilder.toString();
& & private String getAutHtml(String ctrlId, String html) {
& & & & Parser parser = Parser.createParser(html, &UTF-8&);
& & & & NodeFilter filter = new HasAttributeFilter(&id&, ctrlId.toUpperCase());
& & & & try {
& & & & & & NodeList nodes = parser.extractAllNodesThatMatch(filter);
& & & & & & if (nodes.size() & 0) {
& & & & & & & & Node node = nodes.elementAt(0);
& & & & & & & & return node.toHtml();
& & & & & & } else {
& & & & & & & & return &&;
& & & & & & }
& & & & } catch (ParserException e) {
& & & & & & e.printStackTrace();
& & & & & & return &&;
& & public MenuInfoService getMenuInfoServiceImpl() {
& & & & return menuInfoServiceI
& & public void setMenuInfoServiceImpl(MenuInfoService menuInfoServiceImpl) {
& & & & this.menuInfoServiceImpl = menuInfoServiceI
& & &* 输出流的包装器(转换大写字母)
& & private class authFilterWriter extends Writer {
& & & & private final W
& & & & private MenuInfo menuI
& & & & private S
& & & & authFilterWriter(Writer out, MenuInfo menuInfo, String spacetext) {
& & & & & & this.out =
& & & & & & this.menuInfo = menuI
& & & & & & this.spacetext =
& & & & public void write(char[] cbuf, int off, int len) throws IOException {
& & & & & & char[] transformedCbuf = new char[len];
& & & & & & for (int i = 0; i & i++) {
& & & & & & & & transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
& & & & & & }
& & & & & & String noAuthHtml = new String(transformedCbuf);
& & & & & & (&授权前的html------ && + noAuthHtml);
& & & & & & // 通过解析标签中html内容,接口后台的权限配置数据过滤出授权后台html内容
& & & & & & String rtnHtml = parseHtml(noAuthHtml, menuInfo, spacetext);
& & & & & & (&授权后的html------ && + rtnHtml);
& & & & & & out.write(rtnHtml.toCharArray());
& & & & public void flush() throws IOException {
& & & & & & out.flush();
& & & & public void close() throws IOException {
& & & & & & out.close();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17283次
排名:千里之外
原创:11篇
(2)(1)(8)(1)(1)}

我要回帖

更多关于 vivoy66l是全网通吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信