Most html attributes can be assigned via th:<attr_name>="..." You can hardcore assign value as default value. When all ok, it will be rewritten.

<a href="will be rewritten" th:href="@{/my_cool_link.html}">my cool link</a>

<a th:href="${'/base_url/'+${obj.cool_link}}">my cool link</a>

<input type="submit"  th:value="#{input.submit}"/>

Universal way is using th:attr. Here you can assign one attribute or list of attributes at once.

<a th:attr="href=@{/my_cool_link.html}">my cool link</a>

<img th:attr="src=@{/images/logo.jpg},title=#{logo},alt=#{logo}" />

You can append or prepend some string to an existing attribute value using th:attrappend. There are also two specific appending attributes: the th:classappend and th:styleappend.

<!-- result will be
<input type="button" value="Do it!" class="btn warning" />
<input type="button" value="Do it!" class="btn" th:attrappend="class=${' ' + cssStyle}" />

<tr th:each="prod : ${prods}" class="row" th:classappend="${prodStat.odd}? 'odd'">

You can define custom attributes with names like data-*

<button th:data-url="@{/myHomeUrl}"

Thymeleaf allows embedding into a attribute value. For this use a |...|

<a th:href="|#my-anchor-${ind}|"> my cool link </a>

If value of attribute contains large text, you must use th:attr or custom attribute.

<!-- just for demonstration, 
using  th:onclick will crush thymeleaf parser
<button type="button" name="btAddContent"
  th:attr="onclick=|var okCode = ${ok};
    var errCode = ${err};
     url: '/myapi/new_content',
     type: 'POST',
     contentType: 'application/json',
     dataType: 'json',
     data: JSON.stringify({ 
         path : $('#formShortArticleListPath').val() ,
         description : $('#formShortArticleListDescr').val()
      success: function(response) { eval(okCode);  } ,
      error: function (data) { eval(errCode);  }