Re: Batch Process Calling a Web Service
If you have DB2 for z/OS installed you can use the DB2 SOAP User Defined Functions (UDFs) to invoke a Web service simply from dynamic or static SQL embedded in your COBOL program. This would not require Java programming. You can find more information in chapter 8 of the IBM Redbook SG24-7663 DB2 for z/OS:Deploying SOA Solutions (http://www.redbooks.ibm.com/abstracts/sg247663.html?Open). Regards Josef Klitsch -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Adding something like Apache Axis2 to the mix would be better, yes, agreed Kirk. However, there is merit to avoiding middleware functional duplication as well -- beyond avoiding the coding. There is maintenance burden involved with any software, whether in-house coded or not. How much burden? It depends, but it's non-zero. So if you've got the tool in the bag already, so to speak, it may be better to use that tool. Parsimony is often a good thing. Also, it's extremely likely that Web Services enablement will get used over and over again. It is important to take steps to make this capability available in common fashion and make it well known across the development teams. Anyway, the original poster may have something already up and running that provides Web Services enablement without necessarily being aware of it. CICS Transaction Server is one example in many shops, and there are other examples. I didn't want to jump to any particular conclusion right away, and hopefully the above illustrates some of the important considerations before reaching a particular decision. - - - - - Timothy Sipples IBM Consulting Enterprise Software Architect Based in Tokyo, Serving IBM Japan / Asia-Pacific E-Mail: timothy.sipp...@us.ibm.com -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Quoting: >But before everyone gets carried away with the idea that that's the "one, >best" option... I'm not so sure. Consider that Web Services are a >reasonably fast moving target and a family of specifications, and it's >probably not a good idea to go into the private business of having to >maintain your own Web Services implementation, especially as a one-off. (Is >this requirement likely to come up again? And again?) If you can omit >needless coding, you can avoid committing to burdensome maintenance. I am not talking about coding a Web Service Client in Java by hand or using a self written implementation. There is a reasonable amount of tooling available that generates a Java Client for a given WSDL (e.g. Rational Application Developer). Thats it. This generated Java Client is then wrapped by COBOL and you can call it. With mixed mode COBOL (it is not really an OO COBOL Class, its just a procedural COBOL program with a Repository) you can instanciate the Java class and run the methods of that class. This limits the interaction between the COBOL and Java people to providing the Java class. And the COBOL programmer who is aware of the mainframe interfaces can do the mapping from COBOL to Java. Denis. -Original Message- From: Timothy Sipples To: IBM-MAIN@bama.ua.edu Sent: Thu, 14 May 2009 8:44 am Subject: Re: Batch Process Calling a Web Service Yes, you could use Java and invoke Java from COBOL. But before everyone gets carried away with the idea that that's the "one, best" option... I'm not so sure. Consider that Web Services are a reasonably fast moving target and a family of specifications, and it's probably not a good idea to go into the private business of having to maintain your own Web Services implementation, especially as a one-off. (Is this requirement likely to come up again? And again?) If you can omit needless coding, you can avoid committing to burdensome maintenance. Hence my opening question about what middleware the original poster has already. The answer very well might be, "Use that." Now, there is JAX-WS support in Java 6, and presumably it'll be maintained and enhanced in reasonably timely fashion as Java evolves. That's good -- great, even. Is JAX-WS enough? "It depends." There are a lot of WS-* standards that aren't in Java Standard Edition (JSE). There are also security and performance considerations to think about (at least). "It depends" again. - - - - - Timothy Sipples IBM Consulting Enterprise Software Architect Based in Tokyo, Serving IBM Japan / Asia-Pacific E-Mail: timothy.sipp...@us.ibm.com -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Batch Process Calling a Web Service
>This is just an initial concept question. >In general, what mechanism could; > >*;a batch job, most likely an Enterprise COBOL batch program,=20 >*;connect with a web service and request information from some=20 >application the web service connects with outside of the mainframe world >*;receive a response back from said application >or if no response, be able to deal with a 404=20 >(timeout, service not available, basically no response) type situation >*;and then go about it batch processing with the returned information > >We are at the pre-pre-concept of this and just looking for ideas. You can use batch COBOL to invoke Java methods to do this (and take advantage of Java distributed access features) or use MQSeries to connect to a Web Service (and process the SOAP XML envelope directly in COBOL) or use WAS (Websphere Application Server) or use CICS services or IMS with COBOL/Java interoperability) or ... There are many IBM and non-IBM ways to do this. One possible starting point might be to see what you have already: Java programmers? COBOL programmers? MQ? WAS? CICS? IMS? DB2? Each subsystem seems to have implemented SOA and Web Services features, it is our major push here in IBM! IBM Enterprise COBOL has all of the pieces you need to do it in COBOL (interface to Java directly, XML parsing and generation, Unicode/UTF-8 character abilities) so don't assume you need a new programming language! Cheers, TomR >> COBOL is the Language of the Future! << -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Timothy - My earlier suggestion was to look at the web service client example in the JZOS cookbook. In that example, we show how to use the free/open source "Apache Axis2" web services toolkit, which removes most of the coding burden. Is that the kind of "middleware" you mean? The cookbook includes an example Eclipse project with sample code to call a SOAP web service from a batch (Java) job, and is available from the JZOS alphaworks site: http://www.alphaworks.ibm.com/tech/zosjavabatchtk Kirk Wolf Dovetailed Technologies On Thu, May 14, 2009 at 1:44 AM, Timothy Sipples wrote: > Yes, you could use Java and invoke Java from COBOL. > > But before everyone gets carried away with the idea that that's the "one, > best" option... I'm not so sure. Consider that Web Services are a > reasonably fast moving target and a family of specifications, and it's > probably not a good idea to go into the private business of having to > maintain your own Web Services implementation, especially as a one-off. (Is > this requirement likely to come up again? And again?) If you can omit > needless coding, you can avoid committing to burdensome maintenance. > > Hence my opening question about what middleware the original poster has > already. The answer very well might be, "Use that." > > Now, there is JAX-WS support in Java 6, and presumably it'll be maintained > and enhanced in reasonably timely fashion as Java evolves. That's good -- > great, even. Is JAX-WS enough? "It depends." There are a lot of WS-* > standards that aren't in Java Standard Edition (JSE). > > There are also security and performance considerations to think about (at > least). "It depends" again. > > - - - - - > Timothy Sipples > IBM Consulting Enterprise Software Architect > Based in Tokyo, Serving IBM Japan / Asia-Pacific > E-Mail: timothy.sipp...@us.ibm.com > -- > For IBM-MAIN subscribe / signoff / archive access instructions, > send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO > Search the archives at http://bama.ua.edu/archives/ibm-main.html > -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Yes, you could use Java and invoke Java from COBOL. But before everyone gets carried away with the idea that that's the "one, best" option... I'm not so sure. Consider that Web Services are a reasonably fast moving target and a family of specifications, and it's probably not a good idea to go into the private business of having to maintain your own Web Services implementation, especially as a one-off. (Is this requirement likely to come up again? And again?) If you can omit needless coding, you can avoid committing to burdensome maintenance. Hence my opening question about what middleware the original poster has already. The answer very well might be, "Use that." Now, there is JAX-WS support in Java 6, and presumably it'll be maintained and enhanced in reasonably timely fashion as Java evolves. That's good -- great, even. Is JAX-WS enough? "It depends." There are a lot of WS-* standards that aren't in Java Standard Edition (JSE). There are also security and performance considerations to think about (at least). "It depends" again. - - - - - Timothy Sipples IBM Consulting Enterprise Software Architect Based in Tokyo, Serving IBM Japan / Asia-Pacific E-Mail: timothy.sipp...@us.ibm.com -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
On 13 May 2009 14:47:41 -0700, in bit.listserv.ibm-main you wrote: > Hi Clark, > >I could only find this post: >http://groups.google.com/group/comp.lang.cobol/browse_thread/thread/285d1ccffe9ec764# > >Is that the one you were refering to? Yes and it was good to see the thread so that people can get a full flavor of the discussion. > >Thanks, Denis. > > > > > > > >-Original Message- >From: Clark Morris >To: IBM-MAIN@bama.ua.edu >Sent: Wed, 13 May 2009 5:50 pm >Subject: Re: Batch Process Calling a Web Service > > >On 12 May 2009 23:42:31 -0700, in bit.listserv.ibm-main you wrote: > >>Hi Bill, >> >>tell your Java programmers to write an Java Client for the Web Service. >>Then create a COBOL wrapper for that Java program with Enterprise COBOL. >>Call that COBOL as subroutine from your Batch COBOL. Enterprise COBOL will >create the JVM in the same address space and reuse it. > >Someone was posting about problems with doing this on comp.lang.cobol. >He could do the non-OO COBOL to OO COBOL call and the OO COBOL to Java >INVOKE but it would not work non-OO COBOL calling OO COBOL invoking >Java. Could you post details on doing it both here and on the usenet >newsgroup comp.lang.cobol. > >Thanks, Clark Morris >> >>An example on how to call a Java class from Enterprise COBOL can be found >>here: >>http://www.ims-society.org/board/viewtopic.php?t=79 >>The sample is how to do it for an IMS online program. However, its a compiler >function so you can do that in any z/OS address space! >>This way you do not have to deal with 404. In addition COBOL can also get >control when there are Java Exceptions and act accordingly (e.g. rerun the >request). >> >> >> >>Denis Gaebler. >> >> >> >> >>-Original Message- >>From: George.William >>To: IBM-MAIN@bama.ua.edu >>Sent: Tue, 12 May 2009 7:49 pm >>Subject: Batch Process Calling a Web Service >> >> >> >> >> >> >> >> >> >> >>This is just an initial concept question. >>In general, what mechanism could; >> >>* a batch job, most likely an Enterprise COBOL batch program, >>* connect with a web service and request information from some >>application the web service connects with outside of the mainframe world >>* receive a response back from said application >>or if no response, be able to deal with a 404 >>(timeout, service not available, basically no response) type situation >>* and then go about it batch processing with the returned information >> >>We are at the pre-pre-concept of this and just looking for ideas. >>Thanks >>Bill George >> -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Hi Clark, I could only find this post: http://groups.google.com/group/comp.lang.cobol/browse_thread/thread/285d1ccffe9ec764# Is that the one you were refering to? Thanks, Denis. -Original Message- From: Clark Morris To: IBM-MAIN@bama.ua.edu Sent: Wed, 13 May 2009 5:50 pm Subject: Re: Batch Process Calling a Web Service On 12 May 2009 23:42:31 -0700, in bit.listserv.ibm-main you wrote: >Hi Bill, > >tell your Java programmers to write an Java Client for the Web Service. >Then create a COBOL wrapper for that Java program with Enterprise COBOL. >Call that COBOL as subroutine from your Batch COBOL. Enterprise COBOL will create the JVM in the same address space and reuse it. Someone was posting about problems with doing this on comp.lang.cobol. He could do the non-OO COBOL to OO COBOL call and the OO COBOL to Java INVOKE but it would not work non-OO COBOL calling OO COBOL invoking Java. Could you post details on doing it both here and on the usenet newsgroup comp.lang.cobol. Thanks, Clark Morris > >An example on how to call a Java class from Enterprise COBOL can be found here: >http://www.ims-society.org/board/viewtopic.php?t=79 >The sample is how to do it for an IMS online program. However, its a compiler function so you can do that in any z/OS address space! >This way you do not have to deal with 404. In addition COBOL can also get control when there are Java Exceptions and act accordingly (e.g. rerun the request). > > > >Denis Gaebler. > > > > >-Original Message- >From: George.William >To: IBM-MAIN@bama.ua.edu >Sent: Tue, 12 May 2009 7:49 pm >Subject: Batch Process Calling a Web Service > > > > > > > > > > >This is just an initial concept question. >In general, what mechanism could; > >* a batch job, most likely an Enterprise COBOL batch program, >* connect with a web service and request information from some >application the web service connects with outside of the mainframe world >* receive a response back from said application >or if no response, be able to deal with a 404 >(timeout, service not available, basically no response) type situation >* and then go about it batch processing with the returned information > >We are at the pre-pre-concept of this and just looking for ideas. >Thanks >Bill George > >__ >CONFIDENTIALITY NOTICE: This email from the State of California is for the >sole >use of the intended recipient and may contain confidential and privileged >information. Any unauthorized review or use, including disclosure or >distribution, is prohibited. If you are not the intended recipient, please >contact the sender and destroy all copies of this email. > >-- >For IBM-MAIN subscribe / signoff / archive access instructions, >send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO >Search the archives at http://bama.ua.edu/archives/ibm-main.html > > > > > > >-- >For IBM-MAIN subscribe / signoff / archive access instructions, >send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO >Search the archives at http://bama.ua.edu/archives/ibm-main.html -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
On Tue, 12 May 2009 10:49:22 -0700, George.William wrote: >In general, what mechanism could; > >* a batch job, most likely an Enterprise COBOL batch program, >* connect with a web service and request information from some >application the web service connects with outside of the mainframe world >* receive a response back from said application > Will you need to deal with CAPTCHAs? -- gil -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
On 12 May 2009 23:42:31 -0700, in bit.listserv.ibm-main you wrote: >Hi Bill, > >tell your Java programmers to write an Java Client for the Web Service. >Then create a COBOL wrapper for that Java program with Enterprise COBOL. >Call that COBOL as subroutine from your Batch COBOL. Enterprise COBOL will >create the JVM in the same address space and reuse it. Someone was posting about problems with doing this on comp.lang.cobol. He could do the non-OO COBOL to OO COBOL call and the OO COBOL to Java INVOKE but it would not work non-OO COBOL calling OO COBOL invoking Java. Could you post details on doing it both here and on the usenet newsgroup comp.lang.cobol. Thanks, Clark Morris > >An example on how to call a Java class from Enterprise COBOL can be found here: >http://www.ims-society.org/board/viewtopic.php?t=79 >The sample is how to do it for an IMS online program. However, its a compiler >function so you can do that in any z/OS address space! >This way you do not have to deal with 404. In addition COBOL can also get >control when there are Java Exceptions and act accordingly (e.g. rerun the >request). > > > >Denis Gaebler. > > > > >-Original Message- >From: George.William >To: IBM-MAIN@bama.ua.edu >Sent: Tue, 12 May 2009 7:49 pm >Subject: Batch Process Calling a Web Service > > > > > > > > > > >This is just an initial concept question. >In general, what mechanism could; > >* a batch job, most likely an Enterprise COBOL batch program, >* connect with a web service and request information from some >application the web service connects with outside of the mainframe world >* receive a response back from said application >or if no response, be able to deal with a 404 >(timeout, service not available, basically no response) type situation >* and then go about it batch processing with the returned information > >We are at the pre-pre-concept of this and just looking for ideas. >Thanks >Bill George > >__ >CONFIDENTIALITY NOTICE: This email from the State of California is for the >sole >use of the intended recipient and may contain confidential and privileged >information. Any unauthorized review or use, including disclosure or >distribution, is prohibited. If you are not the intended recipient, please >contact the sender and destroy all copies of this email. > >-- >For IBM-MAIN subscribe / signoff / archive access instructions, >send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO >Search the archives at http://bama.ua.edu/archives/ibm-main.html > > > > > > >-- >For IBM-MAIN subscribe / signoff / archive access instructions, >send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO >Search the archives at http://bama.ua.edu/archives/ibm-main.html -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Thanks for the ideas guys! Much appreciated for sure. Bill __ CONFIDENTIALITY NOTICE: This email from the State of California is for the sole use of the intended recipient and may contain confidential and privileged information. Any unauthorized review or use, including disclosure or distribution, is prohibited. If you are not the intended recipient, please contact the sender and destroy all copies of this email. -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Hi Bill, tell your Java programmers to write an Java Client for the Web Service. Then create a COBOL wrapper for that Java program with Enterprise COBOL. Call that COBOL as subroutine from your Batch COBOL. Enterprise COBOL will create the JVM in the same address space and reuse it. An example on how to call a Java class from Enterprise COBOL can be found here: http://www.ims-society.org/board/viewtopic.php?t=79 The sample is how to do it for an IMS online program. However, its a compiler function so you can do that in any z/OS address space! This way you do not have to deal with 404. In addition COBOL can also get control when there are Java Exceptions and act accordingly (e.g. rerun the request). Denis Gaebler. -Original Message- From: George.William To: IBM-MAIN@bama.ua.edu Sent: Tue, 12 May 2009 7:49 pm Subject: Batch Process Calling a Web Service This is just an initial concept question. In general, what mechanism could; * a batch job, most likely an Enterprise COBOL batch program, * connect with a web service and request information from some application the web service connects with outside of the mainframe world * receive a response back from said application or if no response, be able to deal with a 404 (timeout, service not available, basically no response) type situation * and then go about it batch processing with the returned information We are at the pre-pre-concept of this and just looking for ideas. Thanks Bill George __ CONFIDENTIALITY NOTICE: This email from the State of California is for the sole use of the intended recipient and may contain confidential and privileged information. Any unauthorized review or use, including disclosure or distribution, is prohibited. If you are not the intended recipient, please contact the sender and destroy all copies of this email. -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
This question has come up recently and is getting more popular. Question in reply: what else (middleware) do you already have installed? CICS Transaction Server, for example? That will heavily influence your range of options. (There are a LOT of ways to do this.) - - - - - Timothy Sipples IBM Consulting Enterprise Software Architect Based in Tokyo, Serving IBM Japan / Asia-Pacific E-Mail: timothy.sipp...@us.ibm.com -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
Thanks, I'll see what this entails from our batch side. -Original Message- From: IBM Mainframe Discussion List [mailto:ibm-m...@bama.ua.edu]on Behalf Of Kirk Wolf Sent: Tuesday, May 12, 2009 11:03 AM To: IBM-MAIN@bama.ua.edu Subject: Re: Batch Process Calling a Web Service If you are interested in using Java in a batch job step (as a web service client), there is an example of this in the JZOS Cookbook, available on alphaWorks: http://www.alphaworks.ibm.com/tech/zosjavabatchtk Kirk Wolf Dovetailed Technologies __ CONFIDENTIALITY NOTICE: This email from the State of California is for the sole use of the intended recipient and may contain confidential and privileged information. Any unauthorized review or use, including disclosure or distribution, is prohibited. If you are not the intended recipient, please contact the sender and destroy all copies of this email. -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Re: Batch Process Calling a Web Service
If you are interested in using Java in a batch job step (as a web service client), there is an example of this in the JZOS Cookbook, available on alphaWorks: http://www.alphaworks.ibm.com/tech/zosjavabatchtk Kirk Wolf Dovetailed Technologies On Tue, May 12, 2009 at 12:49 PM, George.William wrote: > This is just an initial concept question. > In general, what mechanism could; > > * a batch job, most likely an Enterprise COBOL batch program, > * connect with a web service and request information from some > application the web service connects with outside of the mainframe world > * receive a response back from said application > or if no response, be able to deal with a 404 > (timeout, service not available, basically no response) type situation > * and then go about it batch processing with the returned information > > We are at the pre-pre-concept of this and just looking for ideas. > Thanks > Bill George > > __ > CONFIDENTIALITY NOTICE: This email from the State of California is for the > sole use of the intended recipient and may contain confidential and > privileged information. Any unauthorized review or use, including disclosure > or distribution, is prohibited. If you are not the intended recipient, please > contact the sender and destroy all copies of this email. > > -- > For IBM-MAIN subscribe / signoff / archive access instructions, > send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO > Search the archives at http://bama.ua.edu/archives/ibm-main.html > -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html
Batch Process Calling a Web Service
This is just an initial concept question. In general, what mechanism could; * a batch job, most likely an Enterprise COBOL batch program, * connect with a web service and request information from some application the web service connects with outside of the mainframe world * receive a response back from said application or if no response, be able to deal with a 404 (timeout, service not available, basically no response) type situation * and then go about it batch processing with the returned information We are at the pre-pre-concept of this and just looking for ideas. Thanks Bill George __ CONFIDENTIALITY NOTICE: This email from the State of California is for the sole use of the intended recipient and may contain confidential and privileged information. Any unauthorized review or use, including disclosure or distribution, is prohibited. If you are not the intended recipient, please contact the sender and destroy all copies of this email. -- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html