Используйте атрибут [required]
для каждого элемента управления формы:
<input type='text' required>
Удалите атрибут onevent в <form>
:
<form
onsubmit = "return false" del> ...>
Делегировать событие отправки на <form>
]
$("#fieldsForm").on('submit', function(e) {...
Добавить event.preventDefault()
в обработчик событий.
См. Демонстрация 1
По поводу вашего вопроса:
«Я все еще не понимаю, почему функция проверить значение элементов управления формы и добавить класс не работает. "
blockquote>jQuery
.each()
проверяет фактические элементы управления формы, которые будут продолжаться независимо от возврата в результате состояние. Когда условие выполнено, и существует ссылка вне цикла на ссылку, цикл учитываетbreak
илиreturn
.В демонстрационной версии 2 логическое значение:
var invalid = false;
Кроме того, часть, где таблица заполняется значениями, также устанавливается в условии.
if (!invalid) { table() }
См. Демонстрация 2
Кстати, атрибуты[disabled]
и[hidden]
были удалены из<select>
, потому что все поля должны иметь состояние, когда они фактически пустой.
Демонстрация 1
$("#fieldsForm").on('submit', function(e) { e.preventDefault(); var field_name = $("#customfield_name").val(); var field_slug = $("#customfield_slug").val().toLowerCase().replace(/\s/g, "_"); var field_type = $("#customfield_type").val(); var markup = "<tr class='field_row'><td class='edit_col'><span class='js_edit edit_link'>Edit</span></td><td><span class='field_name'>" + field_name + "</span></td><td><span class='field_slug'>" + field_slug + "</span></td><td><span class='field_type'>" + field_type + "</span></td><td><div class='dropdown'><button class='dropbtn'><i class='icon-arrow'></i></button><div class='dropdown-content'><span class='delete_link js_delete'>Delete</span></div></div></td></tr></tr>"; $("table tbody").append(markup); $(this).trigger('reset'); }); $(document).on("click", ".js_delete", function() { $(this).parents("tr").remove(); });
.formstuff { color: #000; } label { display: block; } .form-group { margin-bottom: 20px; } input.form-control { background-color: #f8f9f9; border: 1px solid #e7e7e7; border-radius: 2px; height: 23px; width: 120px; } .error_notice { color: red; display: none; } .error .error_notice { display: block; } .error_field, .error .error_field { border-color: red; } .dropbtn { border: none; padding: 8px; } .dropdown { position: relative; display: inline-block; } .dropdown-content { background-color: #fff; border: 1px solid #D1D4D5; border-radius: 2px; box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.1); box-sizing: border- box; display: none; min-width: 160px; padding: 5px 0; position: absolute; z-index: 1; } .delete_link { display: block; padding: 5px 10px; width: 100%; } .delete_link:hover { background: #1498BE; color: #fff; } .dropdown:hover .dropdown-content { display: block; } table { border: 1px solid blue; width: 100%; } .table tr { border: 1px solid #ddd; } .table td, .table th { text-align: left; position: relative; } .table>thead>tr>th { color: #8F8F8F; font-size: 14px; } .table>thead>tr>th, .table>tbody>tr>td { border-color: #F2F5F6; } .table>tbody tr:first-child td { border: none; } .edit_col { position: relative; width: 60px; } .field_row:hover { background-color: #FBFDFE; cursor: pointer; } .field_row .edit_link { color: #1498BE; cursor: pointer; display: none; font-size: 11px; text-align: center; } .field_row:hover .edit_link { display: block; } .field_row .delete_link { cursor: pointer; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <section class="formstuff"> <form id="fieldsForm" name="create_fields"> <div class="error_notice"> <p>All Fields are Required</p> </div> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="customfield_name">Name*</label> <input type="text" class="form-control" id="customfield_name" aria-describedby="custom field name" required> </div> </div> </div> <div class="row d-flex align-items-center"> <div class="col-md-6"> <div class="form-group"> <label for="customfield_slug">Slug*</label> <input type="text" class="form-control" id="customfield_slug" aria-describedby="custom field slug" name="customfield_slug" required> </div> </div> </div> <div class="row"> <div class="col-md-2"> <div class="form-group"> <label for="customfield_type">Field type*</label> <select class="form-control" id="customfield_type" placeholder="Select Option" required> <option value="" selected disabled hidden>Select Option</option> <option value="Text">Text</option> <option value="Checkbox">Checkbox</option> <option value="Multiple Choice">Multiple Choice</option> </select> </div> </div> </div> <button type="submit" class="btn btn-primary" id="createField">Create Field</button> </form> <table class="table" id="fieldsList"> <thead> <tr> <th scope="col" class="edit_col"></th> <th scope="col">Name</th> <th scope="col">Slug</th> <th scope="col">Type</th> <th scope="col"></th> </tr> </thead> <tbody> <tr class="field_row"> <td class="edit_col"><span class="js_edit edit_link">Edit</span></td> <td><span class="field_name">This is a name</span></td> <td><span class="field_slug">ThisSlug</span></td> <td><span class="field_type">Text</span></td> <td> <div class="dropdown"> <button class="dropbtn">X</button> <div class="dropdown-content"> <span class="delete_link js_delete">Delete</span> </div> </div> </td> </tr> <tr class="field_row"> <td class="edit_col"><span class="js_edit edit_link">Edit</span></td> <td><span class="field_name">This is a name 2</span></td> <td><span class="field_slug">ThisSlug2</span></td> <td><span class="field_type">Checkbox</span></td> <td> <div class="dropdown"> <button class="dropbtn">X</button> <div class="dropdown-content"> <span class="delete_link js_delete">Delete</span> </div> </div> </td> </tr> </tbody> </table> </section>
Демо 2
$("#fieldsForm").on('submit', function(e) { e.preventDefault(); var invalid = false; $('.form-control').filter(function(e) { if ($(this).val().trim() === '') { $(this).addClass("error_field"); invalid = true; return false; } else { $(this).removeClass('error_field'); } }); if (!invalid) { table(); } }); function table() { var field_name = $("#customfield_name").val(); var field_slug = $("#customfield_slug").val().toLowerCase().replace(/\s/g, "_"); var field_type = $("#customfield_type").val(); // HTML to append on form submit var markup = "<tr class='field_row'><td class='edit_col'><span class='js_edit edit_link'>Edit</span></td><td><span class='field_name'>" + field_name + "</span></td><td><span class='field_slug'>" + field_slug + "</span></td><td><span class='field_type'>" + field_type + "</span></td><td><div class='dropdown'><button class='dropbtn'><i class='icon-arrow'></i></button><div class='dropdown-content'><span class='delete_link js_delete'>Delete</span></div></div></td></tr></tr>"; // On successful submit append the markup html to the table body (bottom) $("table tbody").append(markup); // In case of an error class, remove it on a successful submit $(this).trigger('reset'); }
.formstuff { color: #000; } label { display: block; } .form-group { margin-bottom: 20px; } input.form-control { background-color: #f8f9f9; border: 1px solid #e7e7e7; border-radius: 2px; height: 23px; width: 120px; } .error_notice { color: red; display: none; } .error .error_notice { display: block; } .error_field, .error .error_field { outline: 3px dashed red; } .dropbtn { border: none; padding: 8px; } .dropdown { position: relative; display: inline-block; } .dropdown-content { background-color: #fff; border: 1px solid #D1D4D5; border-radius: 2px; box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.1); box-sizing: border- box; display: none; min-width: 160px; padding: 5px 0; position: absolute; z-index: 1; } .delete_link { display: block; padding: 5px 10px; width: 100%; } .delete_link:hover { background: #1498BE; color: #fff; } .dropdown:hover .dropdown-content { display: block; } table { border: 1px solid blue; width: 100%; } .table tr { border: 1px solid #ddd; } .table td, .table th { text-align: left; position: relative; } .table>thead>tr>th { color: #8F8F8F; font-size: 14px; } .table>thead>tr>th, .table>tbody>tr>td { border-color: #F2F5F6; } .table>tbody tr:first-child td { border: none; } .edit_col { position: relative; width: 60px; } .field_row:hover { background-color: #FBFDFE; cursor: pointer; } .field_row .edit_link { color: #1498BE; cursor: pointer; display: none; font-size: 11px; text-align: center; } .field_row:hover .edit_link { display: block; } .field_row .delete_link { cursor: pointer; }
<section class="formstuff"> <form id="fieldsForm" name="create_fields"> <div class="error_notice"> <p>All Fields are Required</p> </div> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="customfield_name">Name*</label> <input type="text" class="form-control" id="customfield_name" aria-describedby="custom field name"> </div> </div> </div> <div class="row d-flex align-items-center"> <div class="col-md-6"> <div class="form-group"> <label for="customfield_slug">Slug*</label> <input type="text" class="form-control" id="customfield_slug" aria-describedby="custom field slug" name="customfield_slug" /> </div> </div> </div> <div class="row"> <div class="col-md-2"> <div class="form-group"> <label for="customfield_type">Field type*</label> <select class="form-control" id="customfield_type" placeholder="Select Option"> <option value="" selected>Select Option</option> <option value="Text">Text</option> <option value="Checkbox">Checkbox</option> <option value="Multiple Choice">Multiple Choice</option> </select> </div> </div> </div> <button type="submit" class="btn btn-primary" id="createField">Create Field</button> </form> <table class="table" id="fieldsList"> <thead> <tr> <th scope="col" class="edit_col"></th> <th scope="col">Name</th> <th scope="col">Slug</th> <th scope="col">Type</th> <th scope="col"></th> </tr> </thead> <tbody> <tr class="field_row"> <td class="edit_col"><span class="js_edit edit_link">Edit</span></td> <td><span class="field_name">This is a name</span></td> <td><span class="field_slug">ThisSlug</span></td> <td><span class="field_type">Text</span></td> <td> <div class="dropdown"> <button class="dropbtn">X</button> <div class="dropdown-content"> <span class="delete_link js_delete">Delete</span> </div> </div> </td> </tr> <tr class="field_row"> <td class="edit_col"><span class="js_edit edit_link">Edit</span></td> <td><span class="field_name">This is a name 2</span></td> <td><span class="field_slug">ThisSlug2</span></td> <td><span class="field_type">Checkbox</span></td> <td> <div class="dropdown"> <button class="dropbtn">X</button> <div class="dropdown-content"> <span class="delete_link js_delete">Delete</span> </div> </div> </td> </tr> </tbody> </table> </section> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Ваша ссылка "Не вводит к сервлетам" ничего не, упоминает о ejbs или @ejb аннотации. Это говорит о не ориентированные на многопотоковое исполнение объекты, такие как PersistenceContext.
На спецификацию EJB можно получить доступ к ejbs от множества удаленных клиентов включая сервлеты (спецификация (JSR-220) EJB 3.0 - Раздел 3.1). Введение ejb использующий @EJB аннотация является методом получения интерфейса EJB через внедрение зависимости (разделите 3.4.1), который альтернативен к поиску ejb объекты в пространстве имен JNDI. Таким образом, нет ничего специального о @EJB аннотации относительно полученного EJBs.
Так, на основе спецификации EJB 3.0 это - общепринятая практика для получения ejbs из сервлетов с помощью @EJB аннотацию.
Я думаю, что простой ответ - то, что Вам не гарантируют это, это безопасно.
Причина этого состоит в том, что нет ничего явного в спецификации EJB, которая говорит, что EJB домашние интерфейсы должна быть ориентирована на многопотоковое исполнение. Спецификация обрисовывает в общих чертах поведение серверной части только. То, что Вы, вероятно, найдете, - то, что клиент skeletons на самом деле ориентирован на многопотоковое исполнение, но необходимо было бы посмотреть на то, как они реализованы библиотекой, которой Вы пользуетесь. Часть аннотации просто расширится в сервисный локатор так, чтобы не покупал Вас ничто.
Безопасно ввести EJB в Сервлете как переменная экземпляра Сервлета, пока EJB является Не сохраняющим состояние. Вы НИКОГДА не должны вводить Боб С сохранением информации в Сервлете.
Необходимо реализовать не сохраняющее состояние EJB в этом, это не содержит переменной экземпляра, которая самой содержит значение с сохранением информации (как Контекст Персистентности). Если необходимо использовать контекст персистентности, то необходимо получить экземпляр его В методах EJB. Можно сделать это при наличии PersistenceContextFactory как переменная экземпляра EJB, и затем Вы получаете экземпляр менеджера по объекту от Фабрики в методе EJB.
PersistenceContextFactory ориентирован на многопотоковое исполнение, таким образом он может быть введен в переменной экземпляра.
Пока Вы соответствуете вышеупомянутым правилам, это должно быть ориентировано на многопотоковое исполнение для введения Боба Не сохраняющего состояние в Сервлете
Смешанная ситуация.
Сессионные компоненты без сохранения состояния могут быть внедрены и безопасны. Это связано с тем, что даже если используется один экземпляр заглушки, доступ к методам будет сериализован контейнером.
Я думаю, что то, что говорит inferreddesign, не соответствует действительности. Неважно, использует ли сессионный компонент без состояния контекст сохранения. Только один вызывающий объект будет когда-либо обращаться к одному экземпляру компонента в одно и то же время, поэтому, даже если контекст персистентности не является потокобезопасным, EJB защищает от множественного доступа к нему.Думайте об этом так, как если бы к каждому методу сессионного компонента было применено ключевое слово synchronized.
Я думаю, что основной проблемой внедрения EJB в сервлет является производительность. Один экземпляр-заглушка станет основной областью разногласий, когда несколько запросов стоят в очереди, ожидая выполнения для них метода сеансового компонента.