рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди (рд╣рд┐рдорд╕реНрдЦрд▓рди - рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдврд╛рдВрдЪрд╛)
"рд╣рд┐рдорд╕реНрдЦрд▓рди - рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░реВрдкрд░реЗрдЦрд╛" - рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдорд┐рдЯрд╛рддреЗ рд╣реБрдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕реНрдерд╛рдиреАрдп рдФрд░ рджреВрд░рд╕реНрде рдХреЛрдб рдХреЙрд▓ред рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛, рдорд╛рдкрдиреАрдпрддрд╛,
рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛, рдирд┐рд░рдВрддрд░ рдЙрдкрд▓рдмреНрдзрддрд╛ рдЕрдЪреНрдЫреЗ рдмреЛрдирд╕ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдореЗрдВ рдЖрддреА рд╣реИред
рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИрдВред
рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдВрджреЗрд╢ред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ
"рд╣рд┐рдорд╕реНрдЦрд▓рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ - рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ", рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╣реЛрддрд╛ рд╣реИ
рд╕рдорд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕реНрд░реЛрдд рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ
рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджреЛ рд╡рд░реНрдЧреЛрдВ (рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдлрд╝рдВрдХреНрд╢рди рдПрдбрд╛рдкреНрдЯрд░) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреЗрдПрд╕рдкреА рдкреГрд╖реНрдаред рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛
рдЖрд╡реЗрджрди рдЯреЙрдордХреИрдЯ рдХреЗ рддрд╣рдд рдЪрд▓реЗрдЧрд╛ред
рдлрдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - рдбреЗрдореЛрдлрдВрдХреНрд╢рди
рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рд╣реИред рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ
рдлрд╝рдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрд▓рд╛рд╕ рдХрд░рдиреЗ рджреЗрдВ
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ: рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреАрдЖрдИрдбреА тАЛтАЛрдФрд░ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд╛рдо;
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕реНрдХрд░рдг; рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдирд╛рдоред
рдХрдХреНрд╖рд╛ рдХреЛрдб DemoFunction.java
package ru.funsys.demo.avalanche;
import java.lang.management.ManagementFactory;
import java.util.Hashtable;
public class DemoFunction {
/**
* .<br>
* <br>
* <br>
* <b>os.name</b> - ,<br>
* <b>os.version</b> - <br>
* <b>PID@name</b> -
*
* @return
*/
public Hashtable<String, String> getInfo() {
Hashtable<String, String> result = new Hashtable<String, String>();
result.put("os.name", System.getProperty("os.name"));
result.put("os.version", System.getProperty("os.version"));
result.put("PID@name", ManagementFactory.getRuntimeMXBean().getName());
return result;
}
}
тАФ DemoAdapter
Java, тАФ ,
,
. DemoFunction
DemoAdapter.java
package ru.funsys.demo.avalanche;
import java.util.Hashtable;
import ru.funsys.avalanche.AvalancheRemote;
public interface DemoAdapter {
public Hashtable<String, String> getInfo() throws AvalancheRemote;
}
, DemoAdapter
AvalancheRemote.
RMI Java,
:
- ( тАФ DemoFunction)
( тАФ DemoAdapter) - ( тАФ DemoAdapter)
(, DemoFunction), ,
.
, .
тАФ DemoApplication
DemoApplication тАФ getInfo() DemoFunction
DemoAdapter. DemoApplication
getInfo() TXT HTML.
DemoApplication.java
package ru.funsys.demo.avalanche;
import java.util.Enumeration;
import java.util.Hashtable;
import ru.funsys.avalanche.Application;
import ru.funsys.avalanche.AvalancheRemote;
public class DemoApplication extends Application {
/**
*
*/
private DemoAdapter info;
/**
*
* HTML .
*
* @param html true, HTML, false
*
* @return HTML
*/
public String getInfo(boolean html) {
StringBuilder builder = new StringBuilder();
if (html) {
builder.append("<table border=\"1\">");
builder.append("<tr><th>key</th><th>value</th></tr>");
}
try {
//
Hashtable<String, String> result = info.getInfo();
for (Enumeration<String> enumeration = result.keys(); enumeration.hasMoreElements(); ) {
String key = enumeration.nextElement();
String value = result.get(key);
if (html) {
builder.append("<tr><td>").append(key).append("</td><td>").append(value).append("</td></tr>");
} else {
builder.append(key).append(": ").append(value).append("\r\n");
}
}
} catch (AvalancheRemote e) {
if (html) {
builder.append("<tr><td>").append("error").append("</td><td>").append(e.getLocalizedMessage()).append("</td></tr>");
} else {
builder.append("error").append(": ").append(e.getLocalizedMessage()).append("\r\n");
}
}
if (html) builder.append("</table>");
return builder.toString();
}
}
: ru.funsys.avalanche.Application.
info , , getAdapter(String name) ru.funsys.avalanche.Application. . .
JSP тАФ first.jsp
JSP . DemoApplication getInfo c true.
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
</head>
<body>
<h1> </h1>
<jsp:useBean id='DemoApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>
<%= DemoApp.getInfo(true) %>
<br>
</body>
</html>
. .
web.xml
web.xml AvalancheServlet, log4j. AvalancheServlet avalanche-config.xml.
<?xml version="1.0" encoding="UTF-8"?>
<!--
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Demo Avalanche</display-name>
<description>
framework Avalanche
</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>AvalancheServlet</display-name>
<servlet-name>AvalancheServlet</servlet-name>
<servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class>
<init-param>
<param-name>avalanche.config</param-name>
<param-value>${catalina.base}/conf/avalanche-config.xml</param-value>
</init-param>
<init-param>
<param-name>avalanche.log4j</param-name>
<param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
avalanche-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<avalanche name="Demo Application">
<function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description=" " />
<application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
</application>
</avalanche>
<function> <application>. <application> <adapter>, uri (. name <function>).
name <application>, DemoApp id DemoApplication JSP .
DemoFunction
, , REST, SOAP .
"Avalanche тАФ application framework for Java" DemoFunction. .
avalanche-config.xml :
- <interface>,
- <connector>, .
RMI
RMI
<interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />
:
- localhost
- 23000 RMI Remote Server
- rmi-connector
<connector>
<connector class="RMIConnector" name="rmi-connector" port="23000" >
<publish name="info" function="info-function" />
</connector>
:
- rmi-connector
- 23000 RMI Remote Server
- <publish> info-function , info-function info
HTTP
HTTP
<interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
:
- localhost
- 8080 HTTP Server
- demo
- connector AvalancheServlet
- http-connector
<connector>
<connector class="HTTPConnector" name="http-connector" >
<publish name="info" function="info-function" />
</connector>
:
- http-connector
- <publish> info-function , info-function info
! HTTP , HTTP (Tomcat).
<multipart-config> AvalancheServlet <servlet-mapping> URI web.xml.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Demo Avalanche</display-name>
<description>
framework Avalanche
</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>AvalancheServlet</display-name>
<servlet-name>AvalancheServlet</servlet-name>
<servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class>
<init-param>
<param-name>avalanche.config</param-name>
<param-value>${catalina.base}/conf/avalanche-config.xml</param-value>
</init-param>
<init-param>
<param-name>avalanche.log4j</param-name>
<param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!-- 50MB max -->
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>AvalancheServlet</servlet-name>
<url-pattern>/connector/*</url-pattern>
</servlet-mapping>
</web-app>
, <application> RMIApp HTTPApp. uri <adapter> -/- , .. rmi-interface/info http-interface/info.
avalanche-config.xml RMI HTTP
<?xml version="1.0" encoding="UTF-8"?>
<avalanche name="Demo Application">
<interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />
<interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
<function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description=" " />
<application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
</application>
<application class="ru.funsys.demo.avalanche.DemoApplication" name="RMIApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="rmi-interface/info" />
</application>
<application class="ru.funsys.demo.avalanche.DemoApplication" name="HTTPApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="http-interface/info" />
</application>
<connector class="RMIConnector" name="rmi-connector" port="23000" >
<publish name="info" function="info-function" />
</connector>
<connector class="HTTPConnector" name="http-connector" >
<publish name="info" function="info-function" />
</connector>
</avalanche>
JSP first.jsp RMI HTTP, id RMIApp HTTPApp .
rmi.jsp
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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> - RMI</title>
</head>
<body>
<h1> - RMI</h1>
<p>
- RMI
</p>
<jsp:useBean id='RMIApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>
<%= RMIApp.getInfo(true) %>
</body>
</html>
http.jsp
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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> - HTTP</title>
</head>
<body>
<h1> - HTTP</h1>
<p>
- HTTP
</p>
<jsp:useBean id='HTTPApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>
<%= HTTPApp.getInfo(true) %>
</body>
</html>
, localhost <interface> avalanche-config.xml, .
, .
, , GitHub