2.HTML Viewer
通过cl_gui_html_viewer类显示url链接或者显示HTML页面。
1.创建cl_gui_html_viewer类对象,调用show_url显示url对应网页;
2.调用load_html_document方法加载Tcode:SMW0的html;
上传html文檔:
<HTML>
<HEAD>
<TITLE>SAP HTML Page</TITLE>
</HEAD>
<BODY>
<H1>
<IMG SRC=SAPLOGO.GIF ALIGN=MIDDLE> SAP HTML Header
</H1>
<P>
<H2>SAP HTML Post Form</H2>
<FORM method=post action=SAPEVENT:POST>
<INPUT TYPE=text NAME=FirstName VALUE=John>
<INPUT TYPE=submit VALUE="Submit input using POST method">
</FORM>
</P>
<P>
<H2>SAP HTML Get Form</H2>
<FORM method=get action="SAPEVENT:GET">
<INPUT TYPE=text NAME=FirstName VALUE=king>
<INPUT TYPE=submit VALUE="Submit input using GET method">
</FORM>
</P>
</BODY>
</HTML>
Tcode:SMW0,上传html文件
示例1:ABAP显示html获取post,get表单信息
"html viewer事件
CLASS c1_event DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:m_sapevent FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action frame getdata postdata query_table.
ENDCLASS.
CLASS c1_event IMPLEMENTATION.
METHOD m_sapevent.
DATA:lv_str TYPE string.
DATA:lt_postdata TYPE cnht_post_data_tab.
DATA:ls_postdata LIKE LINE OF lt_postdata.
DATA:lt_edquery TYPE cnht_query_table.
DATA:ls_edquery LIKE LINE OF lt_edquery.
lv_str = 'action:' && action
&& ';frame' && frame
&& ';getdata' && getdata.
lt_postdata = postdata.
lt_edquery = query_table.
IF lt_postdata IS NOT INITIAL.
READ TABLE lt_postdata INTO ls_postdata INDEX 1.
ENDIF.
lv_str = lv_str && ';' && ls_postdata.
LOOP AT lt_edquery INTO ls_edquery.
lv_str = lv_str && ';name='
&& ls_edquery-name
&& '-'
&& ls_edquery-value.
ENDLOOP.
MESSAGE lv_str TYPE 'I'.
ENDMETHOD.
ENDCLASS.
"cl_gui_html_viewer
"html显示
CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA:lo_html_viewer TYPE REF TO cl_gui_html_viewer.
METHODS:m_html_init.
METHODS:m_html_viewer IMPORTING iv_url TYPE string.
METHODS:m_html_load.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD m_html_init.
DATA:lt_events TYPE cntl_simple_events.
DATA:ls_events LIKE LINE OF lt_events.
CREATE OBJECT lo_html_viewer
EXPORTING
parent = cl_gui_container=>default_screen.
"设置event
ls_events-eventid = lo_html_viewer->m_id_sapevent.
ls_events-appl_event = 'X'.
APPEND ls_events TO lt_events.
lo_html_viewer->set_registered_events( events = lt_events ).
SET HANDLER c1_event=>m_sapevent FOR lo_html_viewer.
ENDMETHOD.
METHOD m_html_viewer.
DATA:lv_url TYPE C LENGTH 200.
lv_url = iv_url.
CREATE OBJECT lo_html_viewer
EXPORTING
parent = cl_gui_container=>default_screen.
"使用GUI显示html
lo_html_viewer->show_url( url = lv_url ).
"使用默认浏览器打开url
"lo_html_viewer->detach_url_in_browser( url = lv_url ).
"lo_html_viewer->show_url_in_browser( url = lv_url ).
ENDMETHOD.
"加载html,Tcode:smw0,文檔
METHOD m_html_load.
DATA:lv_url TYPE C LENGTH 200.
"加载图片
lo_html_viewer->load_mime_object(
EXPORTING
object_id = 'HTMLCNTL_TESTHTM2_SAPLOGO'
object_url = 'SAPLOGO.GIF'
).
"加载html
lo_html_viewer->load_html_document(
EXPORTING
document_id = 'ZTOM_HTML'
IMPORTING
assigned_url = lv_url
).
lo_html_viewer->show_url( url = lv_url ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
PERFORM f_show_html.
FORM f_show_html.
DATA:lv_url TYPE string VALUE 'https://www.runoob.com/'.
DATA:lo_c1 TYPE REF TO c1.
"生成一个默认屏幕
WRITE:/ '1'.
CREATE OBJECT lo_c1.
lo_c1->m_html_init( ).
"lo_c1->m_html_viewer( iv_url = lv_url ).
lo_c1->m_html_load( ).
ENDFORM.
示例2:html多个页面切换
"html viewer事件
CLASS c1_event DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:m_sapevent FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action frame getdata postdata query_table.
ENDCLASS.
CLASS c1_event IMPLEMENTATION.
METHOD m_sapevent.
DATA:lv_str TYPE string.
DATA:lt_postdata TYPE cnht_post_data_tab.
DATA:ls_postdata LIKE LINE OF lt_postdata.
DATA:lt_edquery TYPE cnht_query_table.
DATA:ls_edquery LIKE LINE OF lt_edquery.
lv_str = 'action:' && action
&& ';frame' && frame
&& ';getdata' && getdata.
lt_postdata = postdata.
lt_edquery = query_table.
IF lt_postdata IS NOT INITIAL.
READ TABLE lt_postdata INTO ls_postdata INDEX 1.
ENDIF.
LOOP AT lt_edquery INTO ls_edquery.
lv_str = 'name:' && ls_edquery-name
&& 'value:' && ls_edquery-value && ';'.
ENDLOOP.
MESSAGE lv_str TYPE 'I'.
ENDMETHOD.
ENDCLASS.
"cl_gui_html_viewer
"html显示
CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA:lo_html_viewer TYPE REF TO cl_gui_html_viewer.
METHODS:m_html_init.
METHODS:m_html_viewer IMPORTING iv_url TYPE string.
METHODS:m_html_load.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD m_html_init.
DATA:lt_events TYPE cntl_simple_events.
DATA:ls_events LIKE LINE OF lt_events.
CREATE OBJECT lo_html_viewer
EXPORTING
parent = cl_gui_container=>default_screen.
"设置event
ls_events-eventid = lo_html_viewer->m_id_sapevent.
ls_events-appl_event = 'X'.
APPEND ls_events TO lt_events.
lo_html_viewer->set_registered_events( events = lt_events ).
SET HANDLER c1_event=>m_sapevent FOR lo_html_viewer.
ENDMETHOD.
METHOD m_html_viewer.
DATA:lv_url TYPE C LENGTH 200.
lv_url = iv_url.
"使用GUI显示html
lo_html_viewer->show_url( url = lv_url ).
"使用默认浏览器打开url
"lo_html_viewer->detach_url_in_browser( url = lv_url ).
"lo_html_viewer->show_url_in_browser( url = lv_url ).
ENDMETHOD.
"加载html,Tcode:smw0,文檔
METHOD m_html_load.
DATA:lv_url TYPE C LENGTH 200.
"加载图片资源
lo_html_viewer->load_mime_object(
EXPORTING
object_id = 'HTMLCNTL_TESTHTM2_SAPLOGO'
object_url = 'SAPLOGO.GIF'
).
"加载页面资源
lo_html_viewer->load_html_document(
EXPORTING
document_id = 'ZTOM_HTML1'
document_url = 'ZTOM_HTML1.htm'
).
"加载页面资源
lo_html_viewer->load_html_document(
EXPORTING
document_id = 'ZTOM_HTML2'
document_url = 'ZTOM_HTML2.htm'
).
"获取页面url
lo_html_viewer->load_html_document(
EXPORTING
document_id = 'ZTOM_HTML1'
IMPORTING
assigned_url = lv_url
).
lo_html_viewer->show_url( url = lv_url ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
PERFORM f_show_html.
FORM f_show_html.
DATA:lv_url TYPE string VALUE 'https://www.runoob.com/'.
DATA:lo_c1 TYPE REF TO c1.
"生成一个默认屏幕
WRITE:/ '1'.
CREATE OBJECT lo_c1.
lo_c1->m_html_init( ).
"显示url对应页面
"lo_c1->m_html_viewer( iv_url = lv_url ).
"加载多个页面
lo_c1->m_html_load( ).
ENDFORM.
html页面源代码:
ztom_html1.html页面代码,其中link到page3,page4下一个例子有使用到实现。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<div class="container">
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link active" href="ztom_html1.htm">首頁</a>
</li>
<li class="nav-item">
<a class="nav-link" href="ztom_html2.htm">Page2</a>
</li>
<li class="nav-item">
<a class="nav-link" href="ztom_html3.htm">Page3</a>
</li>
<li class = "nav-item">
<a class="nav-link" href = "ztom_html4.htm">Page4</a>
</li>
</ul>
</div>
<div class="container">
<h2>POST表#</h2>
<form method=POST action="SAPEVENT:POST_FORM">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" class="form-control" placeholder="Enter email" name = "email">
</div>
<div class="form-group">
<label for="pwd">Password:</label>
<input type="password" class="form-control" placeholder="Enter password" name = "pwd">
</div>
<button type="submit" class="btn btn-primary">Submit Post</button>
</form>
<h2>GET表#</h2>
<form method=GET action="SAPEVENT:GET_FORM">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" class="form-control" name="email" placeholder="Enter email">
</div>
<div class="form-group">
<label for="pwd">Password:</label>
<input type="password" class="form-control" name="pwd" placeholder="Enter password">
</div>
<button type="submit" class="btn btn-primary">Submit Get</button>
</form>
<h2>POST Parameter表#</h2>
<form method=POST action="SAPEVENT:POST_FORM?MY_PARAMETER">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" class="form-control" name="email" placeholder="Enter email">
</div>
<div class="form-group">
<label for="pwd">Password:</label>
<input type="password" class="form-control" name="pwd" placeholder="Enter password">
</div>
<button type="submit" class="btn btn-primary">Submit PARAMETER</button>
</form>
</div>
</body>
</html>
显示效果:通过Submit Post提交,触发sapevent事件
ztom_html2.htm页面代码,其中可以通过script,Ajax调用系统提供service,获取数据然后渲染动态显示。
Tcode:SICF,创建一个Service,获取spfli数据。
选择Maintain Services页面,点击执行。
选择Create Service
设置Service名,ZTOM_TEST
输入clien,user,password。表示Service仅对当前user生效。其余配置请参考Service的配置说明文件。
最主要的是Handler List,这里函数提供Service返回数据逻辑。
这里ZCL_TOM_TEST_POST类处理逻辑
创建Class:ZCL_TOM_TEST_POST,实现接口IF_HTTP_EXTENSION
实现接口方法HANDLE_REQUEST
代码示例:
* DATA: lo_json_ser TYPE REF TO cl_trex_json_serializer,
* lo_json_des TYPE REF TO cl_trex_json_deserializer.
DATA: lv_json_string TYPE string.
DATA: lt_spfli TYPE TABLE OF spfli.
DATA: lv_input_json TYPE string .
DATA: lt_header TYPE TIHTTPNVP.
DATA: ls_header TYPE IHTTPNVP.
DATA: lo_json_writer TYPE REF TO cl_sxml_string_writer.
DATA:lv_json_x TYPE xstring.
"跨域訪問header
ls_header-name = 'Access-Control-Allow-Origin'.
ls_header-value = '*'.
APPEND ls_header TO lt_header.
ls_header-name = 'Access-Control-Allow-Methods'.
ls_header-value = 'POST'.
APPEND ls_header TO lt_header.
ls_header-name = 'Access-Control-Allow-Headers'.
ls_header-value = 'x-requested-with,content-type'.
APPEND ls_header TO lt_header.
"获取传入的json 内容
lv_input_json = server->request->if_http_entity~get_cdata( )."獲取傳入內容
"设置返回数据格式
CALL METHOD server->response->if_http_entity~set_content_type
EXPORTING
content_type = 'application/json'.
"查询数据
SELECT * INTO TABLE lt_spfli FROM spfli UP TO 20 ROWS.
lo_json_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION ID
SOURCE
detail = lt_spfli
RESULT XML lo_json_writer.
lv_json_x = lo_json_writer->get_output( ).
"abap to json
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
im_xstring = lv_json_x
im_encoding = 'UTF-8'
IMPORTING
ex_string = lv_json_string.
* "将数据转换为json格式
* CREATE OBJECT lo_json_ser
* EXPORTING
* data = lt_spfli[].
*
* "固定写法
* CALL METHOD lo_json_ser->serialize.
*
* "获得转换后数据并输出
* CALL METHOD lo_json_ser->get_data
* RECEIVING
* rval = lv_json_string.
server->response->set_header_fields(
fields = lt_header
).
server->response->set_cdata(
EXPORTING
data = lv_json_string " Character data
).
当Service创建完成后,选择创建的Service,右键->Test Service,可以获取链接。根据提示输入账号密码,测试是否能够获取到spfli表数据。
可以获取到url链接格式:http(s)://<host.domain>:<port>/sap/ztom_test?client=xxx
Html2页面源码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<OBJECT data=data.htm height=1 id=data width=1></OBJECT>
<div class="container">
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link" href="ztom_html1.htm">首頁</a>
</li>
<li class="nav-item">
<a id="page2" class="nav-link active" href="ztom_html2.htm" data-toggle="tooltip" title="提示page2">Page2</a>
</li>
</ul>
</div>
<div class="container">
<h2>表格1</h2>
<table class="table table-hover">
<thead>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<tr>
<td id="Firstname" DATASRC=#data DATAFLD="Firstname"></td>
<td id="Lastname" DATASRC=#data DATAFLD="Lastname"></td>
<td id="Email" DATASRC=#data DATAFLD="Email"></td>
</tr>
</tbody>
</table>
</div>
<div class="container">
<button id="btn1" type="button" class="btn btn-primary">Search</button>
<table class="table table-hover">
<thead>
<tr>
<th>Carrid</th>
<th>Connid</th>
<th>出發國家</th>
<th>出發城市</th>
<th>到達國家</th>
<th>到達城市</th>
</tr>
</thead>
<tbody id="table">
</tbody>
</table>
<div class="container" id="con1">
<button id="btn2" type="button" class="btn btn-primary">Show</button>
<div>
<script>
$(document).ready(function(){
$('[data-toggle="tooltip"]').tooltip();
});
$("#btn1").click(function(){
$('#btn1').text("clicked!");
$.ajax({
url:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
data:"",
Type:"post",
dataType:"json",
success:function(res){
$.each(res.DETAIL,function(key,item){
var lv_html = "<tr>";
lv_html = lv_html + "<td>" + item.CARRID + "</td>";
lv_html = lv_html + "<td>" + item.CONNID + "</td>";
lv_html = lv_html + "<td>" + item.COUNTRYFR + "</td>";
lv_html = lv_html + "<td>" + item.CITYFROM + "</td>";
lv_html = lv_html + "<td>" + item.COUNTRYTO + "</td>";
lv_html = lv_html + "<td>" + item.CITYTO + "</td>";
lv_html = lv_html + "</tr>";
$("#table").append(lv_html);
});
},
error:function(err){
alert("error");
}
})
});
$("#btn2").click(function(){
$('#btn2').text("clicked!");
$.get("ztom_html3.htm",function(data){
$('#con1').html(data);
})
});
</script>
</body>
</html>
显示效果:点击按钮,触发Ajax调用Service查询Spfli获取数据显示,注意:js中btn2点击加载ztom_html3.htm页面失败了。
示例3:ABAP生成HTML页面显示
"cl_gui_html_viewer
"html显示
CLASS c1 DEFINITION INHERITING FROM cl_gui_html_viewer.
PUBLIC SECTION.
METHODS:constructor IMPORTING VALUE(parent) TYPE REF TO cl_gui_container.
METHODS:m_set_script IMPORTING VALUE(script) TYPE STANDARD TABLE.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD:constructor.
CALL METHOD super->constructor
EXPORTING
parent = parent
saphtmlp = 'X'
uiflag = cl_gui_html_viewer=>uiflag_noiemenu.
ENDMETHOD.
METHOD:m_set_script.
CALL METHOD me->set_script
EXPORTING
script = script.
CALL METHOD me->execute_script.
ENDMETHOD.
ENDCLASS.
DATA:lo_c1 TYPE REF TO c1.
TYPES:s_html_line TYPE C LENGTH 255.
DATA:lt_datasrc TYPE TABLE OF s_html_line.
DATA:ls_datasrc TYPE s_html_line.
DATA:lv_doc_url TYPE sbdst_url.
"html viewer事件
CLASS c1_event DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:m_sapevent FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action frame getdata postdata query_table.
CLASS-METHODS:m_ctxmenu_request FOR EVENT ctxmenu_request OF cl_gui_html_viewer.
CLASS-METHODS:m_ctxmenu_selected FOR EVENT ctxmenu_selected OF cl_gui_html_viewer
IMPORTING fcode.
ENDCLASS.
CLASS c1_event IMPLEMENTATION.
"窗体事件
METHOD m_sapevent.
DATA:lv_str TYPE string.
DATA:lt_postdata TYPE cnht_post_data_tab.
DATA:ls_postdata LIKE LINE OF lt_postdata.
DATA:lt_edquery TYPE cnht_query_table.
DATA:ls_edquery LIKE LINE OF lt_edquery.
lv_str = 'action:' && action
&& ';frame' && frame
&& ';getdata' && getdata.
lt_postdata = postdata.
lt_edquery = query_table.
IF lt_postdata IS NOT INITIAL.
READ TABLE lt_postdata INTO ls_postdata INDEX 1.
ENDIF.
LOOP AT lt_edquery INTO ls_edquery.
lv_str = lv_str && 'name:' && ls_edquery-name
&& 'value:' && ls_edquery-value && ';'.
ENDLOOP.
MESSAGE lv_str TYPE 'I'.
ENDMETHOD.
"右键菜单
METHOD m_ctxmenu_request.
DATA:my_ctxmenu TYPE REF TO cl_ctmenu.
CREATE OBJECT my_ctxmenu.
my_ctxmenu->add_function(
EXPORTING
fcode = 'script'
text = 'excute script' ).
my_ctxmenu->add_function(
EXPORTING
fcode = 'back'
text = 'back' ).
my_ctxmenu->add_function(
EXPORTING
fcode = 'forward'
text = 'forward' ).
lo_c1->track_context_menu(
EXPORTING
ctxmenu = my_ctxmenu
).
ENDMETHOD.
METHOD m_ctxmenu_selected.
IF fcode = 'script'.
"设置field
TYPES:BEGIN OF s_tab,
field_name TYPE C LENGTH 30,
field_value TYPE C LENGTH 30,
END OF s_tab.
DATA:lt_tab TYPE TABLE OF s_tab.
DATA:ls_tab LIKE LINE OF lt_tab.
ls_tab-field_name = 'Firstname'.
ls_tab-field_value = 'chai'.
APPEND ls_tab TO lt_tab.
ls_tab-field_name = 'Lastname'.
ls_tab-field_value = 'Li'.
APPEND ls_tab TO lt_tab.
ls_tab-field_name = 'Email'.
ls_tab-field_value = 'lie@222.com'.
APPEND ls_tab TO lt_tab.
CLEAR lt_datasrc[].
LOOP AT lt_tab INTO ls_tab.
ls_datasrc = ls_tab-field_name && '.innerText = "'
&& ls_tab-field_value && '";'.
APPEND ls_datasrc TO lt_datasrc.
ENDLOOP.
lo_c1->m_set_script( lt_datasrc ).
ENDIF.
IF fcode = 'back'.
lo_c1->go_back( ).
ENDIF.
IF fcode = 'forward'.
lo_c1->go_forward( ).
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS c_main DEFINITION.
PUBLIC SECTION.
METHODS:m_init_view.
METHODS:m_set_event.
METHODS:m_load_data.
METHODS:m_creat_page.
METHODS:m_creat_page1.
METHODS:m_load_page.
ENDCLASS.
CLASS c_main IMPLEMENTATION.
METHOD m_init_view.
"初始化
CREATE OBJECT lo_c1
EXPORTING parent = cl_gui_container=>default_screen.
"设置事件
me->m_set_event( ).
"加载数据
me->m_load_data( ).
"加载页面
me->m_creat_page( ).
me->m_creat_page1( ).
"加载页面显示
me->m_load_page( ).
ENDMETHOD.
"设置事件
METHOD m_set_event.
DATA:lt_events TYPE cntl_simple_events.
DATA:ls_events LIKE LINE OF lt_events.
"设置event
ls_events-eventid = lo_c1->m_id_sapevent.
ls_events-appl_event = 'X'.
APPEND ls_events TO lt_events.
ls_events-appl_event = ''.
ls_events-eventid = lo_c1->m_id_ctxmenu_request.
APPEND ls_events TO lt_events.
ls_events-eventid = lo_c1->m_id_ctxmenu_selected.
APPEND ls_events TO lt_events.
lo_c1->set_registered_events( events = lt_events ).
SET HANDLER c1_event=>m_sapevent FOR lo_c1.
SET HANDLER c1_event=>m_ctxmenu_request FOR lo_c1.
SET HANDLER c1_event=>m_ctxmenu_selected FOR lo_c1.
ENDMETHOD.
"加载数据
METHOD m_load_data.
TYPES:BEGIN OF s_tab,
field_name TYPE C LENGTH 30,
field_value TYPE C LENGTH 30,
END OF s_tab.
DATA:lt_tab TYPE TABLE OF s_tab.
DATA:ls_tab LIKE LINE OF lt_tab.
ls_tab-field_name = 'Firstname'.
ls_tab-field_value = 'tom'.
APPEND ls_tab TO lt_tab.
ls_tab-field_name = 'Lastname'.
ls_tab-field_value = 'tomas'.
APPEND ls_tab TO lt_tab.
ls_tab-field_name = 'Email'.
ls_tab-field_value = 'tomas@222.com'.
APPEND ls_tab TO lt_tab.
CLEAR lt_datasrc[].
ls_datasrc = '<HTML><HEAD>'
&& '<META NAME="data" CONTENT="DSO">'
&& '</HEAD><BODY>'.
APPEND ls_datasrc TO lt_datasrc.
LOOP AT lt_tab INTO ls_tab.
ls_datasrc = '<SPAN ID=' && ls_tab-field_name
&& '>' && ls_tab-field_value && ' </SPAN>'.
ENDLOOP.
ls_datasrc = '</BODY></HTML>'.
APPEND ls_datasrc TO lt_datasrc.
lo_c1->load_data(
EXPORTING
url = 'data.htm'
type = 'text'
subtype = 'html'
IMPORTING
assigned_url = lv_doc_url
CHANGING
data_table = lt_datasrc
).
ENDMETHOD.
METHOD m_load_page.
lo_c1->load_html_document(
EXPORTING
document_id = 'ZTOM_HTML1'
document_url = 'ztom_html1.htm'
IMPORTING
assigned_url = lv_doc_url
).
lo_c1->load_html_document(
EXPORTING
document_id = 'ZTOM_HTML2'
document_url = 'ztom_html2.htm'
).
"显示url
lo_c1->show_url( lv_doc_url ).
ENDMETHOD.
"创建ztom_html3.htm页面,显示表格
METHOD m_creat_page.
DATA:lt_scarr TYPE TABLE OF scarr.
DATA:ls_scarr LIKE LINE OF lt_scarr.
DATA:lt_html TYPE TABLE OF s_html_line.
DATA:ls_html LIKE LINE OF lt_html.
"查询数据
SELECT * INTO TABLE lt_scarr FROM scarr.
ls_html = '<!DOCTYPE html><html><head>'.
APPEND ls_html TO lt_html.
ls_html = '<meta charset="utf-8">'.
APPEND ls_html TO lt_html.
ls_html = '<meta name="viewport" content="width=device-width, initial-scale=1">'.
APPEND ls_html TO lt_html.
ls_html = '<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '</head><body>'.
APPEND ls_html TO lt_html.
ls_html = '<div class="container"><ul class="nav nav-pills">'.
APPEND ls_html TO lt_html.
ls_html = '<li class="nav-item"><a class="nav-link" href="ztom_html1.htm">首页</a></li>'.
APPEND ls_html TO lt_html.
ls_html = '<li class="nav-item"><a class="nav-link" href="ztom_html2.htm">Page2</a></li></ul></div>'.
APPEND ls_html TO lt_html.
ls_html = '<div class="container"><h2>表格1</h2>'.
APPEND ls_html TO lt_html.
ls_html = '<table class="table table-hover table-bordered"><thead class="table-primary">'.
APPEND ls_html TO lt_html.
ls_html = '<tr><th colspan = "2" style="text-align:center">合并列1</th><th colspan = "2" style="text-align:center">合并列2</th></tr>'.
APPEND ls_html TO lt_html.
ls_html = '<tr><th>Airline ID</th><th>Airline name</th>'.
APPEND ls_html TO lt_html.
ls_html = '<th>Currency</th><th>Airline URL</th></tr></thead>'.
APPEND ls_html TO lt_html.
ls_html = '<tbody>'.
APPEND ls_html TO lt_html.
LOOP AT lt_scarr INTO ls_scarr.
ls_html = '<tr><td>' && ls_scarr-carrid && '</td>'.
APPEND ls_html TO lt_html.
ls_html = '<td>' && ls_scarr-carrname && '</td>'.
APPEND ls_html TO lt_html.
ls_html = '<td>' && ls_scarr-currcode && '</td>'.
APPEND ls_html TO lt_html.
ls_html = '<td><a href="' && ls_scarr-url && '">' && ls_scarr-url && '</a></td></tr>'.
APPEND ls_html TO lt_html.
ENDLOOP.
ls_html = '</tbody></table></div>'.
APPEND ls_html TO lt_html.
ls_html = '</body></html>'.
APPEND ls_html TO lt_html.
lo_c1->load_data(
EXPORTING
url = 'ztom_html3.htm'
type = 'text'
subtype = 'html'
IMPORTING
assigned_url = lv_doc_url
CHANGING
data_table = lt_html
).
ENDMETHOD.
"创建ztom_html4.htm,使用echarts显示图表
METHOD m_creat_page1.
DATA:lt_html TYPE TABLE OF s_html_line.
DATA:ls_html LIKE LINE OF lt_html.
TYPES:BEGIN OF s_item,
name TYPE string,
number TYPE I,
END OF s_item.
DATA:lt_item_data TYPE TABLE OF s_item.
DATA:ls_item_data LIKE LINE OF lt_item_data.
"json数据
DATA:lo_json_writer TYPE REF TO cl_sxml_string_writer.
DATA:lv_json_x TYPE xstring.
DATA:lv_json TYPE string.
ls_item_data-name = '"栗子"'.
ls_item_data-number = 10.
APPEND ls_item_data TO lt_item_data.
ls_item_data-name = '"苹果"'.
ls_item_data-number = 20.
APPEND ls_item_data TO lt_item_data.
ls_item_data-name = '"李子"'.
ls_item_data-number = 13.
APPEND ls_item_data TO lt_item_data.
ls_html = '<!DOCTYPE html><html><head>'.
APPEND ls_html TO lt_html.
ls_html = '<meta charset="utf-8">'.
APPEND ls_html TO lt_html.
ls_html = '<meta name="viewport" content="width=device-width, initial-scale=1">'.
APPEND ls_html TO lt_html.
ls_html = '<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '<script src="https://cdn.staticfile.org/echarts/4.7.0/echarts.min.js"></script>'.
APPEND ls_html TO lt_html.
ls_html = '</head>'.
APPEND ls_html TO lt_html.
ls_html = '<body><div class="container"><h1>Line Chart</h1><div id="myChart" style="width:600px;height:400px;"></div></div>'.
APPEND ls_html TO lt_html.
"script部分
ls_html = '<script>$(document).ready(function(){ var container1 = document.getElementById("myChart");'.
APPEND ls_html TO lt_html.
ls_html = 'var myChart = echarts.init(container1);'.
APPEND ls_html TO lt_html.
ls_html = 'var options = {title: {text: "ECharts"},tooltip: {},'.
APPEND ls_html TO lt_html.
ls_html = 'xAxis: { data: ['.
LOOP AT lt_item_data INTO ls_item_data.
IF sy-tabix = 1.
ls_html = ls_html && ls_item_data-name.
ELSE.
ls_html = ls_html && ',' && ls_item_data-name.
ENDIF.
ENDLOOP.
ls_html = ls_html && ']},'.
APPEND ls_html TO lt_html.
ls_html = 'yAxis: {},series: [{ name:"销量",type:"bar",data: ['.
LOOP AT lt_item_data INTO ls_item_data.
IF sy-tabix = 1.
ls_html = ls_html && ls_item_data-number.
ELSE.
ls_html = ls_html && ',' && ls_item_data-number.
ENDIF.
ENDLOOP.
ls_html = ls_html && ']}]};'.
APPEND ls_html TO lt_html.
ls_html = 'myChart.setOption(options);})</script>'.
APPEND ls_html TO lt_html.
ls_html = '</body></html>'.
APPEND ls_html TO lt_html.
lo_c1->load_data(
EXPORTING
url = 'ztom_html4.htm'
type = 'text'
subtype = 'html'
IMPORTING
assigned_url = lv_doc_url
CHANGING
data_table = lt_html
).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
PERFORM f_show_html.
FORM f_show_html.
DATA:lo_main TYPE REF TO c_main.
CREATE OBJECT lo_main.
WRITE:/ '1'.
lo_main->m_init_view( ).
ENDFORM.
ztom_html3.htm页面效果:
ztom_html4.htm页面效果: