Jestem nowy w Javie EE i wiem, że coś podobnego do następujących trzech wierszy
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
jest oldskulowym sposobem kodowania, aw JSP w wersji 2 istnieje metoda unikania kodu Java w plikach JSP. Czy ktoś może mi powiedzieć alternatywne linie JSP 2 i jak nazywa się ta technika?
Odpowiedzi:
Używanie skryptletów (tych
<% %>
rzeczy) w JSP jest bardzo odradzane od czasu narodzin taglibów (takich jak JSTL ) i EL ( język wyrażeń , takie${}
rzeczy) w 2001 roku.Główne wady skryptletów to:
SamSunOracle zaleca również w konwencjach kodowania JSP, aby unikać używania skryptletów, ilekroć taka sama funkcjonalność jest możliwa dzięki klasom (tag). Oto kilka istotnych przykładów:Sposób zastępowania skryptletów całkowicie zależy od wyłącznego celu kodu / logiki. Częściej ten kod należy umieścić w pełnej klasie Java:
Jeśli chcesz wywoływać ten sam kod Java przy każdym żądaniu, mniej więcej lub więcej, niezależnie od żądanej strony, np. Sprawdzając, czy użytkownik jest zalogowany, a następnie zaimplementuj filtr i odpowiednio napisz kod w
doFilter()
metodzie. Na przykład:Po zmapowaniu na odpowiednią
<url-pattern>
stronę interesujących stron JSP nie trzeba kopiować tego samego fragmentu kodu ogólnych stron JSP.Jeśli chcesz wywołać część kodu Java w celu wstępnego przetworzenia żądania, np. Wstępne ładowanie listy z bazy danych w celu wyświetlenia w jakiejś tabeli, w razie potrzeby w oparciu o niektóre parametry zapytania, następnie zaimplementuj serwlet i napisz kod odpowiednio w
doGet()
metodzie. Na przykład:W ten sposób radzenie sobie z wyjątkami jest łatwiejsze. Dostęp do DB nie jest uzyskiwany w trakcie renderowania JSP, ale na długo przed wyświetleniem JSP. Nadal masz możliwość zmiany odpowiedzi za każdym razem, gdy dostęp do bazy danych zgłosi wyjątek. W powyższym przykładzie, domyślna strona błędu 500 zostaną wyświetlone które można dostosować w każdym razie przez
<error-page>
wweb.xml
.Jeśli chcesz wywołać pewne kodu Java do przetworzenia żądania, np przetwarzanie formą przedstawienia, a następnie wdrożyć serwletu i napisać kod odpowiednio w
doPost()
metodzie. Na przykład:Ten sposób postępowania z różnych miejsc stronie Rezultatem jest łatwiejsze: ponowne wyświetlanie formularza z błędów walidacji w przypadku błędu (w tym konkretnym przypadku można ponownie wyświetlić go za pomocą
${message}
w EL ), czy po prostu do żądanej strony docelowej w przypadku powodzenia.Jeśli chcesz wywołać kod Java, aby kontrolować plan wykonania i / lub miejsce docelowe żądania i odpowiedzi, zaimplementuj serwlet zgodnie ze schematem kontrolera frontowego MVC . Na przykład:
Lub po prostu zastosuj środowisko MVC, takie jak JSF , Spring MVC , Wicket itp., Aby uzyskać tylko stronę JSP / Facelets i klasę JavaBean bez potrzeby stosowania niestandardowego serwletu.
Jeśli chcesz wywołać kod Java, aby kontrolować przepływ wewnątrz strony JSP, musisz pobrać (istniejący) taglib kontroli przepływu, taki jak rdzeń JSTL . Np. Wyświetlanie
List<Product>
w tabeli:Dzięki znacznikom w stylu XML, które ładnie pasują do całego HTML, kod jest lepiej czytelny (a przez to łatwiejszy w utrzymaniu) niż kilka skryptletów z różnymi nawiasami otwierającymi i zamykającymi ( „Do kogo, do cholery, należy ten nawias zamykający?” ). Łatwą pomocą jest skonfigurowanie aplikacji internetowej do generowania wyjątku za każdym razem, gdy używane są skrypty, poprzez dodanie następującego elementu do
web.xml
:W Facelets , następca JSP, który jest częścią Java EE warunkiem MVC JSF , to już nie można używać skryptletów . W ten sposób jesteś automatycznie zmuszany do robienia rzeczy „we właściwy sposób”.
Jeśli chcesz wywołać jakiś kod Java, aby uzyskać dostęp do danych „zaplecza” na stronie JSP i wyświetlić je, musisz użyć EL (język wyrażeń)
${}
. Np. Ponowne wyświetlenie przesłanych wartości wejściowych:W
${param.foo}
wyświetla wynikrequest.getParameter("foo")
.Jeśli chcesz wywołać jakiś kod Java narzędzia bezpośrednio na stronie JSP (zwykle
public static
metody), musisz zdefiniować je jako funkcje EL. W JSTL znajduje się standardowa funkcja taglib , ale możesz także łatwo tworzyć funkcje samodzielnie . Oto przykład, w jaki sposób JSTLfn:escapeXml
jest przydatny w zapobieganiu atakom XSS .Należy pamiętać, że wrażliwość XSS nie jest w żaden sposób ściśle związana z Java / JSP / JSTL / EL / czymkolwiek, ten problem należy wziąć pod uwagę w każdej rozwijanej aplikacji internetowej. Problem skryptletów polega na tym, że nie zapewnia żadnych wbudowanych mechanizmów zapobiegawczych, a przynajmniej nie używa standardowego interfejsu API Java. Następca JSP, Facelets, już domyślnie ucieka HTML, więc nie musisz się martwić dziurami XSS w Facelets.
Zobacz też:
źródło
<% response.getWriter().flush(); %>
pomiędzy nim</head>
a w<body>
celu poprawy wydajności parsowania strony w przeglądarce. Ale to użycie jest z kolei całkowicie nieistotne, gdy rozmiar bufora wyjściowego po stronie serwera jest niski (1 ~ 2 KB). Zobacz także ten artykuł .Aby zabezpieczyć: Wyłącz Pisma na dobre
W trakcie dyskusji nad innym pytaniem możesz i zawsze powinieneś wyłączyć skryptlety w
web.xml
deskryptorze aplikacji internetowej.Zawsze robiłbym to, aby uniemożliwić programistom dodawanie skryptletów, szczególnie w większych firmach, w których prędzej czy później stracisz przegląd. Te
web.xml
ustawienia wyglądać następująco:źródło
<%-- comment that i don't want in the final HTML --%>
. Uważam, że warto używać tych komentarzy zamiast HTML.<% %>
, wyrażeń<%! %>
skryptletowych i deklaracji skryptletowych<%= %>
. Oznacza to, że dyrektywy<%@ %>
i komentarze<%-- --%>
pozostają włączone i użyteczne, więc nadal możesz robić komentarze i dołączać.JSTL oferuje tagi dla instrukcji warunkowych, pętli, zestawów, pobrań itp. Na przykład:
JSTL działa z atrybutami żądania - najczęściej są one ustawiane w żądaniu przez serwlet, który przesyła je do strony JSP.
źródło
Nie jestem pewien, czy dobrze to zrozumiem.
Powinieneś przeczytać coś o MVC. Spring MVC & Struts 2 to dwa najczęściej stosowane rozwiązania.
źródło
Możesz używać znaczników JSTL razem z wyrażeniami EL, aby uniknąć mieszania kodu Java i HTML:
źródło
Istnieją również frameworki oparte na komponentach, takie jak Wicket, które generują dla Ciebie dużo kodu HTML. Znaczniki, które kończą się w HTML, są niezwykle proste i nie ma praktycznie żadnej logiki, która by się pomieszała. W rezultacie powstają prawie puste strony HTML z typowymi elementami HTML. Minusem jest to, że w interfejsie API Wicket jest wiele elementów do nauki, a niektóre rzeczy mogą być trudne do osiągnięcia przy tych ograniczeniach.
źródło
We wzorze architektonicznym MVC strony JSP reprezentują warstwę widoku. Osadzanie kodu Java w plikach JSP jest uważane za złą praktykę. Możesz użyć JSTL , freeMarker , velocity z JSP jako „silnik szablonów”. Dostawca danych do tych tagów zależy od struktur, z którymi masz do czynienia.
Struts 2
awebwork
jako implementacja dla MVC Pattern wykorzystuje OGNL „bardzo interesującą technikę w celu udostępnienia właściwości fasoli JSP”.źródło
Doświadczenie pokazuje, że strony JSP mają pewne wady, jedną z nich jest trudność do uniknięcia mieszania znaczników z rzeczywistym kodem.
Jeśli możesz, rozważ użycie specjalistycznej technologii do tego, co musisz zrobić. W Java EE 6 jest JSF 2.0, który zapewnia wiele fajnych funkcji, w tym klejenie ziaren Java wraz ze stronami JSF poprzez
#{bean.method(argument)}
podejście.źródło
jeśli chcesz po prostu uniknąć wad kodowania Java w JSP, możesz to zrobić nawet za pomocą skryptów. Po prostu przestrzegaj dyscypliny, aby mieć minimalną Javę w JSP i prawie żadnych obliczeń i logiki na stronie JSP.
źródło
Naucz się dostosowywać i pisać własne tagi za pomocą JSTL
Zauważ, że EL to EviL (wyjątki czasu wykonywania, refaktoryzacja).
Furtka może być również zła (wydajność, trudna dla małych aplikacji lub prosta warstwa widoku)
Przykład z java2s ,
Należy go dodać do pliku web.xml aplikacji internetowej
utwórz plik: java2s.tld w / WEB-INF /
skompiluj poniższy kod do WEB-INF \ klas \ com \ java2s
Uruchom serwer i załaduj plik bodyContent.jsp w przeglądarce
źródło
Wicket jest również alternatywą, która całkowicie oddziela java od html, dzięki czemu projektant i programista mogą współpracować na różnych zestawach kodu, nie rozumiejąc się nawzajem.
Spójrz na Wicket.
źródło
Zadałeś dobre pytanie i chociaż masz dobre odpowiedzi, sugeruję, abyś pozbył się JSP. To przestarzała technologia, która ostatecznie umrze. Zastosuj nowoczesne podejście, takie jak silniki szablonów. Będziesz miał bardzo wyraźne oddzielenie warstw biznesowych i warstw prezentacji, a na pewno nie ma kodu Java w szablonach, dzięki czemu możesz generować szablony bezpośrednio z oprogramowania do edycji prezentacji internetowych, w większości przypadków wykorzystując WYSIWYG.
I z pewnością trzymaj się z dala od filtrów i przetwarzania wstępnego i końcowego, w przeciwnym razie możesz poradzić sobie z trudnościami związanymi z obsługą / debugowaniem, ponieważ zawsze nie wiesz, skąd zmienna uzyskuje wartość.
źródło
w celu uniknięcia kodu java w plikach JSP java udostępnia teraz biblioteki znaczników, takie jak JSTL, java również wymyśliła JSF, w którym można zapisywać wszystkie struktury programowania w postaci znaczników
źródło
Bez względu na to, ile próbujesz uniknąć, pracując z innymi programistami, niektórzy z nich nadal wolą skryptlet, a następnie wstawiają zły kod do projektu. Dlatego ustawienie projektu przy pierwszym znaku jest bardzo ważne, jeśli naprawdę chcesz zmniejszyć kod skryptletu. Istnieje kilka technik, aby sobie z tym poradzić (w tym kilka ram, o których inni wspominali). Jeśli jednak wolisz czysty sposób JSP, użyj pliku znaczników JSTL. Zaletą tego jest to, że możesz również skonfigurować strony wzorcowe dla swojego projektu, aby inne strony mogły dziedziczyć strony wzorcowe
Utwórz stronę wzorcową o nazwie base.tag pod tagami WEB-INF / o następującej treści
Na tej stronie materiału utworzyłem fragment o nazwie „tytuł”, dzięki czemu na stronie podrzędnej mogę wstawić więcej kodów w to miejsce strony wzorcowej. Również tag
<jsp:doBody/>
zostanie również zastąpiony treścią strony podrzędnejUtwórz stronę podrzędną (child.jsp) w folderze WebContent:
<t:base>
służy do określenia strony wzorcowej, której chcesz użyć (która w tej chwili jest base.tag). Cała zawartość tagu<jsp:body>
zostanie zastąpiona<jsp:doBody/>
na stronie wzorcowej. Twoja strona podrzędna może również zawierać dowolny tag lib i możesz normalnie z niej korzystać, tak jak inne wymienione. Jeśli jednak użyjesz tutaj dowolnego kodu skryptletu (<%= request.getParameter("name") %>
...) i spróbujesz uruchomić tę stronę, otrzymaszJasperException because Scripting elements ( <%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) are disallowed here
. Dlatego nie ma możliwości, aby inni ludzie mogli dołączyć zły kod do pliku jspWywoływanie tej strony z kontrolera:
Możesz łatwo wywołać plik child.jsp ze swojego kontrolera. Działa to również dobrze z frameworkiem struts
źródło
Użyj
JSTL Tag libraries
w JSP, który będzie działał idealnie.źródło
Wystarczy użyć znacznika JSTL i wyrażenia EL.
źródło
Jeśli ktoś naprawdę jest przeciwny programowaniu w więcej niż jednym języku , sugeruję GWT, teoretycznie możesz uniknąć wszystkich elementów JS i HTML, ponieważ Google Toolkit przekształca cały klient i wspólny kod w JS, nie będziesz miał z nimi problemu, więc masz serwis internetowy bez kodowania w innych językach. Nawet skądś możesz skorzystać z domyślnego CSS-a, który jest nadawany przez rozszerzenia (smartGWT lub Vaadin). Nie musisz uczyć się dziesiątek adnotacji.
Oczywiście, jeśli chcesz, możesz włamać się do głębi kodu i wstrzyknąć JS i wzbogacić swoją stronę HTML, ale tak naprawdę możesz tego uniknąć, jeśli chcesz, a wynik będzie dobry, jak napisano w innych ramach. Mówię, że warto spróbować, a podstawowy GWT jest dobrze udokumentowany.
I oczywiście wielu innych programistów niniejszym opisuje lub poleca kilka innych rozwiązań. GWT jest przeznaczony dla osób, które tak naprawdę nie chcą zajmować się częścią internetową ani jej minimalizować.
źródło
Dobrym pomysłem ze świata Python są języki atrybutów szablonów ; TAL został wprowadzony przez Zope (dlatego też nazywany „Zope Page Templates”, ZPT) i jest standardem, z implementacjami również w PHP, XSLT i Javie (użyłem inkarnacji Python / Zope i PHP). W tej klasie języków szablonów jeden z powyższych przykładów mógłby wyglądać następująco:
Kod wygląda jak zwykły HTML (lub XHTML) plus niektóre specjalne atrybuty w przestrzeni nazw XML; można go przeglądać za pomocą przeglądarki i bezpiecznie modyfikować przez projektanta. Obsługiwane są również makra i i18n:
Jeśli tłumaczenia treści są dostępne, są one używane.
Jednak niewiele wiem o implementacji Java .
źródło
ui:xxx
tagi w Facelts VDL .tal:replace="structure (expression)"
atrybutów przez cały czas.Używanie skryptletów na stronach JSP nie jest dobrą praktyką.
Zamiast tego możesz użyć:
Należy zapoznać się:
źródło
Jasne, wymień
<%! counter++; %>
go architekturą producent-konsument zdarzenia, w której warstwa biznesowa jest powiadamiana o potrzebie zwiększenia licznika, odpowiednio reaguje i powiadamia prezenterów, aby zaktualizowali widoki. W grę wchodzi szereg transakcji z bazami danych, ponieważ w przyszłości będziemy musieli poznać nową i starą wartość licznika, który ją zwiększył i z jakim celem. Oczywiście chodzi o serializację, ponieważ warstwy są całkowicie oddzielone. Będziesz mógł zwiększyć swój licznik w stosunku do RMI, IIOP, SOAP. Ale wymagany jest tylko HTML, którego nie implementujesz, ponieważ jest to tak przyziemny przypadek. Twoim nowym celem jest osiągnięcie 250 przyrostów na sekundę na nowym błyszczącym serwerze E7 z 64 GB pamięci RAM.Mam ponad 20 lat programowania, większość projektów kończy się niepowodzeniem przed sekstetem: Wielokrotnego użytku Wymienność OO-zdolności Debugowalność Testowalność Potrzebna jest nawet konserwacja. Inne projekty prowadzone przez ludzi, którzy dbali tylko o funkcjonalność, odniosły ogromny sukces. Ponadto sztywna struktura obiektu, zaimplementowana zbyt wcześnie w projekcie, uniemożliwia dostosowanie kodu do drastycznych zmian specyfikacji (zwanych także zwinnymi).
Uważam więc za zwlekanie działanie polegające na definiowaniu „warstw” lub nadmiarowych struktur danych na wczesnym etapie projektu lub gdy nie jest to specjalnie wymagane.
źródło
Technicznie wszystkie pliki JSP są konwertowane na serwlety podczas działania . JSP został początkowo stworzony w celu oddzielenia logiki biznesowej i logiki projektowej, zgodnie ze wzorcem MVC. Tak więc JSP są technicznie wszystkimi kodami Java w czasie wykonywania. Ale aby odpowiedzieć na pytanie, biblioteki znaczników są zwykle używane do stosowania logiki (usuwania kodów Java) na stronach JSP.
źródło
Jeśli użyjemy następujących rzeczy w aplikacji Java, kod Java można usunąć z pierwszego planu JSP.
Użyj architektury MVC do aplikacji internetowych
Użyj tagów JSP
za. Tagi standardowe
b. Niestandardowe tagi
Język wyrażeń
źródło
Jak uniknąć kodu Java w plikach JSP?
Oprócz języka wyrażeń ( EL ) można używać znaczników biblioteki kart, takich jak JSTL . Ale EL nie działa dobrze z JSP. Prawdopodobnie lepiej jest całkowicie upuścić JSP i użyć Faceletów .
Facelets to pierwszy język deklaracji stron inny niż JSP zaprojektowany dla JSF (Java Server Faces), który zapewnia prostszy i bardziej wydajny model programowania dla programistów JSF w porównaniu do JSP. Rozwiązuje różne problemy występujące w JSP podczas tworzenia aplikacji internetowych.
Źródło
źródło
Używanie skryptów jest bardzo starym sposobem i nie jest zalecane. Jeśli chcesz bezpośrednio wyświetlać coś na swoich stronach JSP, po prostu użyj języka wyrażeń (EL) wraz z JSTL .
Istnieją również inne opcje, takie jak użycie silnika szablonów, takiego jak Velocity, Freemarker, Thymeleaf itp. Ale używanie zwykłego JSP z EL i JSTL służy mi przez większość czasu i wydaje się również najprostsze dla początkującego.
Należy również pamiętać, że logika biznesowa w warstwie widoku nie jest najlepszą praktyką, należy wykonywać logikę biznesową w warstwie usługi i przekazywać wyniki wyjściowe do widoków za pośrednictwem kontrolera.
źródło
Nic z tego nie jest już używane, przyjacielu, radzę oddzielić widok (css, html, javascript itp.) Od serwera.
W moim przypadku moje systemy obsługują widok za pomocą Angulara, a wszelkie potrzebne dane są pobierane z serwera za pomocą usług odpoczynku.
Uwierz mi, to zmieni sposób projektowania
źródło
Użyj szkieletowego, kanciastego frameworka javascript do projektowania interfejsu użytkownika i pobierz dane za pomocą interfejsu API rest. Spowoduje to całkowite usunięcie zależności Java z interfejsu użytkownika.
źródło
JSP 2.0 ma funkcję o nazwie „Pliki znaczników” , możesz pisać znaczniki bez zewnętrznego
java
kodu itld
. Musisz utworzyć.tag
plik i włożyć goWEB-INF\tags
, możesz nawet stworzyć strukturę katalogów do pakowania swoich tagów.Na przykład:
Użyj tego jak
Ponadto możesz łatwo odczytać treść znacznika
Użyj tego
Próbki są bardzo proste, ale możesz tutaj wykonać wiele skomplikowanych zadań. Pamiętaj, że możesz użyć innych tagów (np .:
JSTL
kontrolujących tagi, takich jakif/forEcah/chosen
manipulacja tekstem,format/contains/uppercase
a nawet tagi SQLselect/update
), przekazać wszystkie parametry, na przykładHashmap
dostępsession
,request
... w pliku tag zbyt.Plik znaczników jest tak łatwy do opracowania, że nie trzeba było restartować serwera podczas ich zmiany, np. Plików JSP. Ułatwia to ich rozwój.
Nawet jeśli używasz frameworka, takiego jak Struts 2, który ma wiele dobrych tagów, może się okazać, że posiadanie własnych tagów może znacznie zmniejszyć kod. Możesz przekazać parametry tagu do rozpórek i w ten sposób dostosować swój tag ramowy.
Możesz użyć tagu nie tylko do uniknięcia java, ale także do zminimalizowania kodów HTML. Sam próbuję często przeglądać kody HTML i budować tagi, gdy tylko na moich stronach zaczynają się duplikaty kodu.
(Nawet jeśli ostatecznie użyjesz java w kodzie JSP, co mam nadzieję, że nie, możesz umieścić ten kod w tagu)
źródło
Jak mówi wiele odpowiedzi, użyj JSTL lub utwórz własne tagi niestandardowe. Oto dobre wyjaśnienie dotyczące tworzenia niestandardowych tagów
źródło
źródło
Używając tagów JSTL wraz z wyrażeniem EL można tego uniknąć. Umieść następujące rzeczy na swojej stronie jsp:
źródło