правильный способ смоделировать номер isbn в приложении j2ee - PullRequest
3 голосов
/ 13 июня 2011

Я пробую веб-приложение с использованием сервлетов и jsps, и мне нужно смоделировать номер элемента в моем классе, а также в отображениях гибернации.Какой должен быть тип числа isbn: Long или String?Я сталкивался со многими учебниками, которые используют любой из них ... isbn, предположительно, является 10-значным идентификатором ... иногда вы сталкиваетесь с числами, такими как 0-85131-041-9, которые не могут быть длинными .. В некоторых примерах используются числа без дефисов ..

Итак, какой тип должен быть?Есть предложения?

спасибо

оценка

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

На самом деле ISBN - это не 10 цифр, а 12 цифр + чек Часто задаваемые вопросы ISBN Чек может быть X

Метод определения контрольной цифры для ISBN - этомодуль 11 с весовыми коэффициентами от 10 до 1. Римская цифра X используется вместо 10, где десять будет в виде контрольной цифры.

Если вы храните информацию, набранную пользователем, тоВы должны включить контрольную цифру, и это должна быть строка.

Если вы храните фактический ISBN, вы можете проигнорировать проверку, поскольку вы можете рассчитать ее.Однако, если используются новые 12 цифр, числа больше, чем может содержать длинная, если старые 10 цифр, то она может быть длинной, но вы должны помнить, что, возможно, добавьте первые 0 назад.Таким образом, в этом случае я бы держал его в строке, удаляя все нечисловые данные, например, дефисы.

Также, глядя на этот FAQ, есть возможная причина хранить ISBn разделенным, чтобы разрешить поиск по частям.

Пять частей ISBN следующие:
1. К текущему ISBN-13 будет добавляться префикс "978"
2. Идентификатор группы или страны, который идентифицирует национальную или географическую группуиздатели;
3. Идентификатор издателя, который идентифицирует конкретного издателя в группе;
4. Идентификатор заголовка, который идентифицирует конкретный заголовок или издание заголовка;
5. Контрольная цифра - это одна цифра в концеISBN, который подтверждает ISBN.

и 5 не нужно сохранять, так как их можно рассчитать, но их нужно получить от пользователей для проверки ввода.

3 голосов
/ 13 июня 2011

ISBN имеет 13 цифр (см. wiki ).Я бы использовал класс, который проверяет правильность заданного String.Что-то вроде:

class ISBN {
  private String isbn;
  public ISBN(String isbn) throws ISBNFormatException {
    // you might want to filter hyphens first, before the check
    if(ISBN.isValid(isbn)) this.isbn = isbn;
    else throw new ISBNFormatException(isbn);
  }
  public static boolean isValid(String s) {
   // validate number here, see wiki
  }
}

Это, конечно, может быть слишком много.Если ваше приложение действительно простое, вы можете просто использовать String.

Редактировать Дефис разделяет число на группы (язык, издатель и т. Д.).Однако, что касается уникальности числа, переносы (или деление с пробелами) не играют никакой роли.

2 голосов
/ 13 июня 2011

Этот вопрос на самом деле не имеет ничего общего с J2EE, а просто с типами данных Java и, возможно, типами данных в вашей базе данных.

Если вы хотите включить дефисы в любой вывод, вам придется хранить их в виде строки. Если вы не хотите писать код, чтобы выяснить, куда идут дефисы, но правила, лежащие в основе этого, довольно сложны, в зависимости от значений цифр в начале числа. (Если вы работаете в системе, которая назначает номера ISBN или разбирает их на части и работает с фрагментами, возможно, вы захотите сделать это. Если вы просто хотите, чтобы пользователь набрал его, и вы его помните, это звучит как слишком большая проблема .)

Полагаю, если вам не нужны дефисы, вы можете использовать String или long. Тем не менее, длинная будет дополнительной болью в том, что вам придется выяснить, когда показывать начальные нули.

Краткий ответ: я не вижу никакого преимущества в том, чтобы хранить его как число. Используйте строку.

0 голосов
/ 13 июня 2011

Я бы сохранил его в свойстве Long и использовал бы форматтер / парсер (по сути, конвертер). Когда вы собираетесь его отобразить, конвертер должен просто преобразовать свойство Long в человеческое представление с дефисами в нужных местах. Когда вы собираетесь проверить / сохранить его, конвертер должен удалить все дефисы из переданного значения и поместить его в свойство Long.

По сути, это та же идея, что и для поля Date, которое вы форматируете / анализируете в человеческом представлении с помощью SimpleDateFormat. Единственное отличие состоит в том, что средство форматирования / синтаксического анализа ISBN недоступно стандартным API Java SE. Вам нужно было бы написать один самостоятельно или принять сторонний (хотя о нем еще ничего не приходит в голову). Наконец, этот преобразователь можно затем использовать в качестве тега JSP (например, <fmt:formatDate> в JSTL) или автономного класса Java, который вызывается функцией EL, или, когда вы используете JSF, класс @FacesConverter.

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

...