Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Это зависит от точки зрения (pun intented).
В большой архитектурной картине ваш собственный JSF-код - это V:
M - Домен бизнес / Уровень обслуживания (например, EJB / JPA / DAO) V - Ваш код JSF C - FacesServlet
В изображении разработчика архитектурный V в свою очередь делится следующим образом:
M - Объект V - Facelets / JSP page C - Управляемый компонент
На маленьком клиентском изображении разработчик V в свою очередь делится следующим образом:
M - дерево компонентов JSF V - визуализированный вывод HTML C - Клиент (webbrowser)
На еще меньшем изображении JavaScript клиент V в свою очередь делится следующим образом:
M - дерево HTML DOM V - визуальная презентация C - функции прослушивания событий ( enduser и Ajax)
Таким образом, это в основном M (M (M (MVC) C) C) C;)
Обратите внимание, что некоторые стартеры и даже некоторые из них - очень простые & mdash; tutorials mingle / copy / flatten свойства объекта в управляемом компоненте, что эффективно сделало бы контроллер моделью. Излишне говорить, что это плохой дизайн (т. Е. Не чистый проект MVC).
В фрагментах кода в следующих ответах показан правильный подход MVC:
Сервлет лиц управляет жизненным циклом лиц, поэтому в этом смысле контроллер сочетается с вашим собственным кодом, который может быть вызван во время каждой фазы жизненного цикла
http: //www.java-samples .com / изображения / JSF-lifecycle.gif
M odel будет вашим ManagedBean
V iew будет jsp
, XHTML
(ну вы можете вместить различные виды здесь)
C ontroller будет FacesServlet
Обновить, надеюсь, что это изображение поможет больше
[/g0]