Действительно ли безопасно ввести EJB в сервлет как переменная экземпляра?

  • Используйте атрибут [required] для каждого элемента управления формы:

    <input type='text' required>
    
  • Удалите атрибут onevent в <form>:

    <form onsubmit = "return false" ...>

  • Делегировать событие отправки на <form> ]

    $("#fieldsForm").on('submit', function(e) {...
    
  • Добавить event.preventDefault() в обработчик событий.

См. Демонстрация 1


По поводу вашего вопроса:

«Я все еще не понимаю, почему функция проверить значение элементов управления формы и добавить класс не работает. "

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>

12
задан Brett Hannah 6 March 2009 в 10:57
поделиться

4 ответа

Ваша ссылка "Не вводит к сервлетам" ничего не, упоминает о 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 аннотацию.

3
ответ дан 2 December 2019 в 20:41
поделиться

Я думаю, что простой ответ - то, что Вам не гарантируют это, это безопасно.

Причина этого состоит в том, что нет ничего явного в спецификации EJB, которая говорит, что EJB домашние интерфейсы должна быть ориентирована на многопотоковое исполнение. Спецификация обрисовывает в общих чертах поведение серверной части только. То, что Вы, вероятно, найдете, - то, что клиент skeletons на самом деле ориентирован на многопотоковое исполнение, но необходимо было бы посмотреть на то, как они реализованы библиотекой, которой Вы пользуетесь. Часть аннотации просто расширится в сервисный локатор так, чтобы не покупал Вас ничто.

0
ответ дан 2 December 2019 в 20:41
поделиться

Безопасно ввести EJB в Сервлете как переменная экземпляра Сервлета, пока EJB является Не сохраняющим состояние. Вы НИКОГДА не должны вводить Боб С сохранением информации в Сервлете.

Необходимо реализовать не сохраняющее состояние EJB в этом, это не содержит переменной экземпляра, которая самой содержит значение с сохранением информации (как Контекст Персистентности). Если необходимо использовать контекст персистентности, то необходимо получить экземпляр его В методах EJB. Можно сделать это при наличии PersistenceContextFactory как переменная экземпляра EJB, и затем Вы получаете экземпляр менеджера по объекту от Фабрики в методе EJB.

PersistenceContextFactory ориентирован на многопотоковое исполнение, таким образом он может быть введен в переменной экземпляра.

Пока Вы соответствуете вышеупомянутым правилам, это должно быть ориентировано на многопотоковое исполнение для введения Боба Не сохраняющего состояние в Сервлете

11
ответ дан 2 December 2019 в 20:41
поделиться

Смешанная ситуация.

Сессионные компоненты без сохранения состояния могут быть внедрены и безопасны. Это связано с тем, что даже если используется один экземпляр заглушки, доступ к методам будет сериализован контейнером.

Я думаю, что то, что говорит inferreddesign, не соответствует действительности. Неважно, использует ли сессионный компонент без состояния контекст сохранения. Только один вызывающий объект будет когда-либо обращаться к одному экземпляру компонента в одно и то же время, поэтому, даже если контекст персистентности не является потокобезопасным, EJB защищает от множественного доступа к нему.Думайте об этом так, как если бы к каждому методу сессионного компонента было применено ключевое слово synchronized.

Я думаю, что основной проблемой внедрения EJB в сервлет является производительность. Один экземпляр-заглушка станет основной областью разногласий, когда несколько запросов стоят в очереди, ожидая выполнения для них метода сеансового компонента.

1
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: