1
I need to call a method that adds in a ArrayList what the user reported in dynamically generated tags when clicking on "add". Any suggestions? 
I was trying to do it using AJAX, but I haven’t succeeded yet. The value entered by the user is added to ArrayList, but when adding one more the first is no longer there, it seems that instance the action again. 
I don’t know much about Struts 2 or AJAX.
Page JSP:
<table  id="tabelaCanais" style="width: 100%" class="tabela_interna">
                <tbody>
            <tr>
                <th colspan="3">Canal / Vigência</th>
            </tr>
                <tr>
              <th colspan="1"  align="center">Canal de Venda</th>
              <th  colspan="1"   align="center">Vigência</th>
              <th   align="center">Ações</th>
            </tr>
            <tr>
                <td colspan="" width="40%" align="center">  
                    <s:select name="vigenciaCanalVendaVO.canalVendaVO.nome" id="canal" value="vigenciaCanalVendaVO.canalVendaVO.nome" list="listaDeCanais" headerKey="0"  listKey="codigo" listValue="nome"/>
                </td>
                <td width="40%" align="center">
                     <s:textfield name="vigenciaCanalVendaVO.dataInicioVigencia" id="dataInicioVigencia" data-mask="data" data-date-type="default" size="12"/>
                     Até
                     <s:textfield name="vigenciaCanalVendaVO.dataFimVigencia" id="dataFimVigencia" data-mask="data" data-date-type="default" size="12"/>
               </td>
                <td align="center" width="10%">
                    <img src="<c:url value="/includes/images/bt_adicionar.gif" />" id="associar1"   style="cursor:pointer;cursor:hand;"/>
               </td>                    
            </tr>
    </tbody>
   </table>
        <br/><br/><br/><br/>
    <table id="tabela_botoes" style="width: 100%">
        <tr>
            <td align="center" width="100%">
                <img src="<c:url value="/includes/images/bt_incluir.gif" />" id="incluir" style="cursor:pointer;cursor:hand;"/>
File . js
$(document).ready(function(){ 
$("#siglaanterior").hide();
$("#nomeanterior").hide();
    $("#associar1").on("click", function(e){
            e.preventDefault();
            var codigo = $('#canal').val();
            var  dataInicioVigencia = $("#dataInicioVigencia").val();
            var dataFimVigencia = $("#dataFimVigencia").val();
            var rowCount = ($("#tabelaCanais tr").length - 3);
            var counts=rowCount;
            $("#canal option[value='"+$("#canal").val() +"']").remove();
            alert('Estou aqui'+$('#canal').val()+"  "+     $('#dataInicioVigencia').val()+"  "+$('#dataFimVigencia').val());
                     var coluna = "<tr>";
                     coluna += "<td width='40%'  align='center'><input type='text' id='id1'  value= "+$("#canal").val()+" name='vigenciaCanalVendaVO.canalVendaVO.codigo'/></td>";
                     coluna +="<td width='40%'  align='center'><input type='text' data-mask='data' data-date-type='default' size='12' maxlength='10'  value="+$("#dataInicioVigencia").val()+" name='vigenciaCanalVendaVO.dataInicioVigenciaAssociacaoPlano'/>"
                     coluna +="Até<input type='text'  data-mask='data' data-date-type='default' size='12' maxlength='10'  value="+$("#dataFimVigencia").val()+" name='vigenciaCanalVendaVO.dataFimVigenciaAssociacaoPlano'/></td>";
                     coluna +="<td align='center'><img src='/EEDI-Administrativo/includes/images/bt_remover.gif' id='remover' style='cursor:pointer;cursor:hand;'/></td>";
                     coluna += "</tr>";
                     //alert(coluna);
                ($('#tabelaCanais')).append(coluna);
                $.ajax({
                    type: "POST",
                    url:  $.url.get('salvarRelacaoCanalVendaPlano'  ),
                    data: {'vigenciaCanalVendaVO.canalVendaVO.codigo':$("#canal").val(), 'vigenciaCanalVendaVO.dataInicioVigenciaAssociacaoPlano' : $("#dataInicioVigencia").val(),
                        'vigenciaCanalVendaVO.dataFimVigenciaAssociacaoPlano':$("#dataFimVigencia").val()},
                    beforeSend: function() {
                            bloquearTela();
                    },
                    complete: function() {
                            desbloquearTela();
                    } ,success: function(data) {
                        //alert('sucess');
                    },
                    error: function(data){
                        alert('error');
                    }
                });       
    });
});
Struts . xml
<?xml version="1.0" encoding="UTF-8" ?>
<package name="plano" namespace="/plano" extends="default">
    <!-- Consulta de Plano -->
    <action name="listarPorFiltro" class="planoAction" method="listarPorFiltro">
        <result>/WEB-INF/pages/plano/consultar.jsp</result>
        <result name="input">/WEB-INF/pages/plano/consultar.jsp</result>
    </action>
    <!-- Cadastro de Plano -->
    <action name="iniciarIncluir" class="planoAction" method="iniciarIncluir">
        <result>/WEB-INF/pages/plano/incluir.jsp</result>
    </action>
    <action name="incluir" class="planoAction" method="incluir">
        <result type="saveErrorsAndRedirectAction">listarPorFiltro</result>
        <result name="input">/WEB-INF/pages/plano/incluir.jsp</result>
    </action>
        <!--Adicionar relação canal e plano -->
    <action name="salvarRelacaoCanalVendaPlano" class="planoAction" method="salvarRelacaoCanalVendaPlano">
            <result>/WEB-INF/pages/plano/incluircanal.jsp</result>
            <result name="input" >/WEB-INF/pages/plano/incluircanal.jsp</result>
    </action>
Action called:
@Controller
@Scope("request")
public class PlanoAction extends BaseAction {
    private static final long serialVersionUID = -1161409943678292285L;
    private static final Logger LOGGER = LoggerFactory.getLogger(PlanoAction.class);
    private List<PlanoVO> listaDePlanos;
    private List<String> listaDeStatus;
    private FiltroPlanoVO filtro = new FiltroPlanoVO();
    private PlanoVO planoVO = new PlanoVO();
    private Collection<VigenciaCanalVendaVO>listaDeVigenciasCanalVendaVO;
    private CanalVendaVO canalVendaVO = new CanalVendaVO();     
    private VigenciaCanalVendaVO vigenciaCanalVendaVO = new VigenciaCanalVendaVO(); 
    private Integer codigo;
    private LocalDate dataInicioVigencia;
    private LocalDate dataFimVigencia;
    //private Ca
    private List<CanalVendaVO> listaDeCanais;
    private List<PlanoVO> canaisPlano;
    private Map<String, String> mapTipoCobrancaEValor = Maps.newHashMap();
    private Map<String, String> mapTipoCobrancaEPeriodoCarencia = Maps.newHashMap();
    @Autowired
    private transient PlanoServiceFacade planoServiceFacade;
    @Autowired
    private transient CanalVendaServiceFacade canalVendaServiceFacade;
    @Autowired
    private transient VigenciaCanalVendaServiceFacade vigenciaCanalVendaServiceFacade;
    public String salvarRelacaoCanalVendaPlano(){
        listaDeCanais = canalVendaServiceFacade.listar();       
        planoVO.getListaDeVigenciasCanalVendaVO().add(vigenciaCanalVendaVO);
        return SUCCESS;
    }
    public String incluir() {
        //obter as informações de valores do plano (Titular/Dependente) por tipo de cobrança (Mensal/Anual)
        //capturarListaTipoCobrancaEValorDoPlano(Arrays.asList(TipoCobranca.values()));
        listaDeCanais = canalVendaServiceFacade.listar();
        //incluir as informações do plano 
        planoServiceFacade.incluir(planoVO);
        vigenciaCanalVendaServiceFacade.incluir(planoVO.getListaDeVigenciasCanalVendaVO());
        //exibir mensagem de sucesso após o cadastro do plano
        sucesso("msg.sucesso.cadastro", "Plano");
        return SUCCESS;
    }