Пара вопросов:
Если я сопоставил клиента с i-var List<Order> orders с аннотацией CascadeType.ALL, я должен также установить отношение в MySQL InnoDB ON DELETE CASCADE? Или они будут мешать?
List<Order> orders
ON DELETE CASCADE
Нужно ли говорить <%@page contentType="text/html" pageEncoding="UTF-8"%> в каждом файле JSP? Могу ли я установить это как параметр конфигурации в web.xml как-нибудь вместо этого?
<%@page contentType="text/html" pageEncoding="UTF-8"%>
Возможно ли, чтобы компилятор проверил для вас URL-адреса отображения сервлета и URL-адреса в JSP, или каким-то образом принудительно обеспечил их синхронизацию? Пример: в web.xml <url-pattern>/login</url-pattern> и в login.jsp: <c:url value="/loginn" /> (обратите внимание на дополнительные n).
<url-pattern>/login</url-pattern>
<c:url value="/loginn" />
В чем разница между <c:out value="${value}" /> и просто $ {value}, оба работают (кроме случаев, когда вам нужно значение по умолчанию)? Когда я должен использовать какой?
<c:out value="${value}" />
Есть ли лучший способ проверки входных параметров (из формы) в сервлете:
String possibleUserID = request.getParameter("userid"); if(possibleUserID == null){ errors.add("User-ID must be exist"); } else { if(possibleUserID.trim().length() == 0){ errors.add("User-ID must be filled in"); } // etc }
без какого-либо веб-фреймворка?
4) <c:out value="${value}" /> выполняет экранирование XML, ${value} не
${value}
Чтобы иметь правильную модель данных, да, вы должны.
В конечном итоге вы можете использовать фильтр, который работает с HttpServeletResponse#setCharacterEncoding() и #setContentType(), но для простых страниц JSP я бы предпочел @page выше этого. При необходимости просто добавьте дополнительную строку в начало шаблона JSP в вашей IDE, чтобы вам не приходилось вводить его каждый раз.
HttpServeletResponse#setCharacterEncoding()
#setContentType()
@page
Нет. Это не ответственность компилятора.
c:out экранирует сущности HTML, а EL в тексте шаблона - нет. Вам следует использовать c:out, если вы хотите снова отобразить контролируемый пользователем ввод. В противном случае достаточно простого EL. Например:
c:out
String input = "<script>alert('XSS');</script>"; <p><c:out value="${input}" /></p> <!-- works fine, no alert, just escaped. --> <p>${input}</p> <!-- JS get interpreted and executed! XSS! -->
Конечно, есть лучший способ. Но так как вы не хотите использовать фреймворк, на этом все заканчивается. Я могу по крайней мере предположить, что ключ является DRY . Минимизация и рефакторинг дублирования кода. Также попытайтесь сделать его абстрактным, чтобы его можно было легко расширять и использовать повторно. Вот несколько советов:
String username = view.getField("username", REQUIRED, MINLENGTH(3)); String email = view.getField("email", REQUIRED, EMAIL); Integer age = view.getField("age", Integer.class, NUMBER); // ... public String getField(String name, Validator... validators) { return getField(name, String.class, validators); } public <T extends Object> T getField(String name, Class<T> type, Validator... validators) { String value = request.getParameter(name); return validateAndConvert(name, value, type, validators); } private <T extends Object> T validateAndConvert (String name, String value, Class<T> type, Validator... validators) { value = (value != null && !value.trim().isEmpty()) ? value.trim() : null; try { for (Validator validator : validators) { validator.validate(value); } } catch (ValidatorException e) { setError(name, e.getMessage()); } return (value != null) ? Converter.convert(value, type) : null; }
1. Нет, вам не нужно. Каскады управляются вашим провайдером JPA.
5.No. Либо напишите свои собственные служебные классы или структуру проверки, либо используйте существующий.