Hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速。官网地址:http://hessian.caucho.com/
先上个效果图,在客户端界面通过ID查询后调用后台的Hession服务获取用户数据。
工程分为三个部分,一个WEB工程,一个公共接口工程,一个客户端工程,WEB工程跟客户端工程通过Maven依赖于公共接口工程。
1.通过Maven新建一个名称为HessianInterfaces的工程,Archetype选择maven-archetype-quickstart。
其pom.xml如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | < project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> < modelVersion >4.0.0</ modelVersion > < groupId >com.ken.mv</ groupId > < artifactId >HessianInterfaces</ artifactId > < version >0.0.1-SNAPSHOT</ version > < packaging >jar</ packaging > < name >HessianInterfaces</ name > < url >http://maven.apache.org</ url > < properties > < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding > </ properties > < dependencies > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >3.8.1</ version > < scope >test</ scope > </ dependency > </ dependencies > </ project > |
在工程内创建一个User的实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package com.ken.entity; public class User implements java.io.Serializable { public User(){} public User(int id,String userName,String sex){ this.id = id; this.userName = userName; this.sex = sex; } private int id; private String userName; private String sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } |
接着在工程内创建一个接口文件:
1 2 3 4 5 6 7 8 9 | package com.ken.service; import com.ken.entity.User; public interface IHessianService { public User getUserById(int id); //通过id查询用户 } |
至此接口工程就制作完成了。
2.建立WEB工程,其pom.xml内依赖于hessian、spring、接口工程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | < project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> < modelVersion >4.0.0</ modelVersion > < groupId >com.ken.mv</ groupId > < artifactId >KenMaven</ artifactId > < packaging >war</ packaging > < version >0.0.1-SNAPSHOT</ version > < name >KenMaven Maven Webapp</ name > < url >http://maven.apache.org</ url > < repositories > < repository > < id >maven-net-cn</ id > < name >aliyu-Maven</ name > < url >http://maven.aliyun.com/nexus/content/groups/public/</ url > < releases > < enabled >true</ enabled > </ releases > < snapshots > < enabled >false</ enabled > </ snapshots > </ repository > </ repositories > < dependencies >< br > <!--接口工程--> < dependency > < groupId >com.ken.mv</ groupId > < artifactId >HessianInterfaces</ artifactId > < version >0.0.1-SNAPSHOT</ version > </ dependency > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >3.8.1</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >com.caucho</ groupId > < artifactId >hessian</ artifactId > < version >4.0.7</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-core</ artifactId > < version >4.3.8.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-web</ artifactId > < version >4.3.8.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-webmvc</ artifactId > < version >4.3.8.RELEASE</ version > </ dependency > </ dependencies > < build > < finalName >KenMaven</ finalName > </ build > </ project > |
创建接口的实现类,并简单的初始化一些数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.ken.service.impl; import com.ken.service.IHessianService; import java.util.ArrayList; import java.util.List; import com.ken.entity.User; public class HessianServiceImpl implements IHessianService { static List< User > list = new ArrayList< User >(); static { list.add(new User(1, "Ken", "Male")); list.add(new User(2, "Jack", "Male")); list.add(new User(3, "Lucy", "Male")); list.add(new User(4, "Michael", "Male")); list.add(new User(5, "Pearl", "Female")); } public User getUserById(int id) { for (User u : list) { if (u.getId() == id) { return u; } } return null; } } |
在resources文件夹内添加hession-context.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <? xml version="1.0" encoding="UTF-8"?> < beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- BeanNameUrlHandlerMapping的作用是,当<bean>的name属性以/开头的时候,映射为url请求。 --> <!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> --> < bean id="hessianServiceImpl" class="com.ken.service.impl.HessianServiceImpl" /> <!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务 --> < bean name="/ihessian.service" class="org.springframework.remoting.caucho.HessianServiceExporter"> < property name="service" ref="hessianServiceImpl" /> <!-- Hessian服务的接口 --> < property name="serviceInterface" value="com.ken.service.IHessianService" /> </ bean > </ beans > |
web.xml如下,用spring拦截.service结尾的hession服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | < ?xml version= "1.0" encoding= "UTF-8" ?> <web-app xmlns= "http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schema Location = "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version= "3.1" > <display-name> Archetype Created Web Application </display-name> <!-- spring mvc--> <servlet> <servlet-name>dispather Servlet </servlet-name> <servlet-class>org.springframework.web.servlet. DispatcherServlet </servlet-class> <init-param> <param-name>context ConfigLocation </param-name> <param-value> classpath:spring -context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispather Servlet </servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--hessian--> <servlet> <servlet-name>hessian Servlet </servlet-name> <servlet-class>org.springframework.web.servlet. DispatcherServlet </servlet-class> <init-param> <param-name>context ConfigLocation </param-name> <param-value> classpath:hessian -context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hessian Servlet </servlet-name> <url-pattern>*.service</url-pattern> </servlet-mapping> </web-app> |
此时在Tomcate内发布工web工程。访问hession服务,出现如下错误表示配置成功。
3.跟第一步一样创建一个普通的Maven工程。
pom.xml文件如下,也需要添加接口工程的依赖。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schema Location = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <model Version >4.0.0</model Version > <group Id >com.ken.mv</group Id > <artifact Id > Client </artifact Id > <version>0.0.1- SNAPSHOT </version> <packaging>jar</packaging> <name> Client </name> <url>http://maven.apache.org</url> <properties> <project.build.source Encoding > UTF -8</project.build.source Encoding > </properties> <repositories> <repository> <id>maven-net-cn</id> <name>aliyu- Maven </name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <dependencies> <dependency> <group Id >junit</group Id > <artifact Id >junit</artifact Id > <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <group Id >com.caucho</group Id > <artifact Id >hessian</artifact Id > <version>4.0.7</version> </dependency> <dependency> <group Id >com.ken.mv</group Id > <artifact Id > HessianInterfaces </artifact Id > <version>0.0.1- SNAPSHOT </version> </dependency> <dependency> <group Id >org.springframework</group Id > <artifact Id >spring-core</artifact Id > <version>4.3.8. RELEASE </version> </dependency> <dependency> <group Id >org.springframework</group Id > <artifact Id >spring-web</artifact Id > <version>4.3.8. RELEASE </version> </dependency> <dependency> <group Id >org.eclipse.swt</group Id > <artifact Id >org.eclipse.swt.win32.win32.x86</artifact Id > <version>4.3</version> </dependency> </dependencies> </project> |
创建hessian-client.xml文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | < ?xml version= "1.0" encoding= "UTF-8" ?> <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xsi:schema Location ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id= "hessianService" class= "org.springframework.remoting.caucho.HessianProxyFactoryBean" > <property name= "serviceUrl" > <value>http:// localhost:8080 / WebApp /ihessian.service</value> </property> <property name= "serviceInterface" > <value>com.ken.service. IHessianService </value> </property> </bean> </beans> |
窗体(SWT绘制)实现及调用服务如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | package com.ken.mv. Client ; import org.eclipse.swt. SWT ; import org.eclipse.swt.events. MouseEvent ; import org.eclipse.swt.events. MouseListener ; import org.eclipse.swt.layout. FormLayout ; import org.eclipse.swt.layout. GridData ; import org.eclipse.swt.widgets. Button ; import org.eclipse.swt.widgets. Display ; import org.eclipse.swt.widgets. Group ; import org.eclipse.swt.widgets. Label ; import org.eclipse.swt.widgets. MessageBox ; import org.eclipse.swt.widgets. Shell ; import org.eclipse.swt.widgets. Text ; import org.springframework.context. ApplicationContext ; import org.springframework.context.support. ClassPathXmlApplicationContext ; import com.ken.entity. User ; import com.ken.service. IHessianService ; public class App { public static void main( String [] args ) { Display display = new Display (); final Shell shell = new Shell (display, SWT . SHELL_TRIM ); shell.set Size (300, 300); shell.set Text ( "Hessian" ); shell.set Layout (new FormLayout ()); final Group group = new Group (shell, SWT . SHADOW_ETCHED_IN ); group.set Text ( "用户查询" ); final GridData gd_group = new GridData ( SWT . FILL , SWT . FILL ,true,true); gd_group.height Hint = 100; //group.set Data (gd_group); org.eclipse.swt.layout. GridLayout grid Layout = new org.eclipse.swt.layout. GridLayout (2, true); grid Layout .vertical Spacing = 5; grid Layout .horizontal Spacing = 5; grid Layout .margin Left = 10; grid Layout .margin Right = 10; grid Layout .margin Top = 10; group.set Layout (grid Layout ); final Label id Label = new Label (group, SWT . NONE ); final GridData gd_id Label = new GridData ( SWT . LEFT , SWT . CENTER ,false,false); id Label .set Text ( "ID:" ); id Label .set Data (gd_id Label ); final Text id Text = new Text (group, SWT . BORDER ); final GridData gd_id Text = new GridData ( SWT . LEFT , SWT . CENTER ,false,false); gd_id Text .width Hint = 100; id Text .set Data (gd_id Text ); final Label user NameLabel = new Label (group, SWT . NONE ); final GridData gd_user NameLabel = new GridData ( SWT . LEFT , SWT . CENTER ,false,false); user NameLabel .set Text ( "UserName:" ); user NameLabel .set Data (gd_user NameLabel ); final Text user NameText = new Text (group, SWT . BORDER ); final GridData gd_user NameText = new GridData ( SWT . LEFT , SWT . CENTER ,false,false); gd_user NameText .width Hint = 100; user NameText .set Data (gd_user NameText ); final Label sex Label = new Label (group, SWT . NONE ); final GridData gd_sex Label = new GridData ( SWT . LEFT , SWT . CENTER ,false,false); sex Label .set Text ( "Sex" ); sex Label .set Data (gd_sex Label ); final Text sex Text = new Text (group, SWT . BORDER ); final GridData gd_sex Text = new GridData ( SWT . LEFT , SWT . CENTER ,false,false); gd_sex Text .width Hint = 100; sex Text .set Data (gd_sex Text ); Button search Button = new Button (group, SWT . NONE ); final GridData gd_search Button = new GridData ( SWT . CENTER , SWT . CENTER ,false,false); search Button .set Data (gd_search Button ); search Button .set Text ( "Search" ); search Button .add MouseListener (new MouseListener (){ public void mouse DoubleClick ( MouseEvent e) { } public void mouse Down ( MouseEvent e) { //调用hessian服务,获取数据 ApplicationContext context = new ClassPathXmlApplicationContext ( "hessian-client.xml" ); IHessianService service = ( IHessianService )context.get Bean ( "hessianService" ); String value = id Text .get Text (); int id = Integer .parse Int (value); User user = service.get UserById (id); if (null!=user){ user NameText .set Text (user.get UserName ()); sex Text .set Text (user.get Sex ()); } else { MessageBox box = new MessageBox (shell); box.set Text ( "Tip" ); box.set Message ( "User Not Found" ); box.open(); } } public void mouse Up ( MouseEvent e) { } }); shell.open(); while(!shell.is Disposed ()){ if (!display.read AndDispatch ()) { display.sleep(); } } display.dispose(); } } |
到这里整个DEMO项目就完成了。如果输入不存在的,则提示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端