??xml version="1.0" encoding="utf-8" standalone="yes"?> package test; import java.io.*; public class User implements Serializable{ /** import java.io.*; public class Example implements Serializable { /** public String aboutMe(){ } <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <jsp:useBean id="JSONRPCBridge" scope="session" <!--jsonrpc 客户端JS代码 --> </head>
<!-- 用于JSON RPC -->
<servlet>
<servlet-name>JSONRPCServlet</servlet-name>
<servlet-class>
com.metaparadigm.jsonrpc.JSONRPCServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JSONRPCServlet</servlet-name>
<url-pattern>/JSON-RPC</url-pattern>
</servlet-mapping>
Q?Q创建后台类文gQ此例中用到两个c?Examle.java,User.java
User.javac,如下Q?/p>
*
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Example.java cd下:
package test;
*
*/
private static final long serialVersionUID = 1L;
public String aboutMe(User user){
String str="您好,我是"+user.getName()+",今年"+user.getAge()+"?;
return str;
}
String str="您好,我是张三,今年30?;
return str;
}
Q?Q创建前台访问JSP文gQƈ~写相应的JS代码Qjsonrpc.jsp
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
class="com.metaparadigm.jsonrpc.JSONRPCBridge" />
<jsp:useBean id="example" scope="session"
class="test.Example" />
<%
JSONRPCBridge.registerObject("example", example);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'jsonrpc.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="js/util/jsonrpc.js"></script>
<script type="text/javascript">
var jsonrpc=null;
function onLoad(){
jsonrpc=new JSONRpcClient("JSON-RPC");
}
function aboutme_1(){
var str1=jsonrpc.example.aboutMe();
alert(str1);
}
function aboutme_2(name,age){
var user={"javaclass":"test.User","name":name,"age":age};
var str2=jsonrpc.example.aboutMe(user);
alert(str2);
}
</script>
<body onload="onLoad()">
JSON RPC 试,通过JS异步获取q程服务器后C息,在IE上显C?br />
<br>
<br>
异步调用后台数据Q在前台昄
<input type=button id="aboutme_1" value=" show aboutme" onclick="aboutme_1()"><br><br>
通过客户端传入的信息Q构造一个对象,传到后台Q再在前台显C?br />
<input type=button id="aboutme_2" value=" show aboutme" onclick="aboutme_2('李四','32')">
</body>
</html>
在JSP面文g中,有几点,本h以ؓ是比较重要的Q?br />
Q?Q通过useBeanQ蝲入JSONRPCBridge实例Qƈ用同L方式Q蝲入业务处理类实例example.
<jsp:useBean id="JSONRPCBridge" scope="session"
class="com.metaparadigm.jsonrpc.JSONRPCBridge" />
<jsp:useBean id="example" scope="session"
class="test.Example" />
Q?Q将前面加裁的example注册到JSONRPCBridge
<%
JSONRPCBridge.registerObject("example", example);
%>
Q?Q引入Jsonrpc 的js <script type="text/javascript" src="js/util/jsonrpc.js"></script>
Q?Q在面加蝲时new一个JSON RPC 客户端,q一步不可少
var jsonrpc=new JSONRpcClient("JSON-RPC");
Q?Q以上准备好后,在客L可以与服务器进行异步通讯?br />
]]>
以下为简单的代码实现Q首先我们要实现三个子系l(Wheel?/span>Engine?/span>BodyQ:
internal class Engine
{
public string EngineWork()
{
return "BMW's Engine is Working";
}
public string EngineStop()
{
return "BMW's Engine is stoped";
}
}
internal class Wheel
{
public string WheelCircumrotate()
{
return "BMW's Wheel is Circumrotating";
}
public string WheelStop()
{
return "BMW's Wheel is stoped";
}
}
internal class Body
{
public Wheel[] wheels = new Wheel[4];
public Engine engine = new Engine();
public Body()
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i] = new Wheel();
}
}
}
然后Q我们再来实现汽车的Facade
class CarFacade
{
Body body = new Body();
public void Run()
{
Console.WriteLine(body.engine.EngineWork());
for(int i = 0; i < body.wheels.Length; i++)
{
Console.WriteLine(body.wheels[i].WheelCircumrotate());
}
}
public void Stop()
{
Console.WriteLine(body.engine.EngineStop());
for (int i = 0; i < body.wheels.Length; i++)
{
Console.WriteLine(body.wheels[i].WheelStop());
}
}
}
现在我们来用客LE序验证一下,代码如下Q?span lang="EN-US">
class Program
{
static void
{
CarFacade car = new CarFacade();
car.Run();
car.Stop();
Console.Read();
}
}
执行l果如下Q?/span>
BMW's Engine is Working
BMW's Wheel is Circumrotating
BMW's Wheel is Circumrotating
BMW's Wheel is Circumrotating
BMW's Wheel is Circumrotating
BMW's Engine is stoped
BMW's Wheel is stoped
BMW's Wheel is stoped
BMW's Wheel is stoped
BMW's Wheel is stoped
正如上面所_客户端代码(ProgramQ不需要关心子pȝQ它只需要关?/span>CarFacade所留下来的和外部交互的接口Q而子pȝ是在CarFacade中聚合?/span>
Façade模式的几个要点:
1、从客户E序的角度看Q?/span>Facade模式不仅化了整个lgpȝ的接口,同时对于lg内部与外部客L序来_从某U程度上也达C一U?#8220;解?#8221;的效果——内部子pȝ的Q何变化不会媄响到Facade接口的变化?/span>
2?/span>Facade设计模式更注重从架构的层ơ去看整个系l,而不是单个类的层ơ?/span>Facade很多时候更是一U架构设计模式?/span>