Servlet sınıfını bir package
Öncelikle, servlet sınıfını bir Java'ya koyun package
. Sen gerektiğini hep aksi halde böyle sunucusunun kendisi gibi bir paket içinde olan sınıfların, görünmezdir, bir paket içinde kamuya reuseable Java sınıflarını koydu. Bu şekilde potansiyel çevreye özgü sorunları ortadan kaldırırsınız. Paketsiz sunucu uygulamaları yalnızca belirli Tomcat + JDK kombinasyonlarında çalışır ve buna asla güvenilmemelidir.
"Düz" bir IDE projesi olması durumunda, sınıfın paket yapısında "Java Kaynakları" klasörüne yerleştirilmesi gerekir ve bu nedenle "WebContent" değil , bu JSP gibi web dosyaları içindir. Aşağıda, Navigator görünümünde görüldüğü gibi varsayılan bir Eclipse Dinamik Web Projesinin klasör yapısının bir örneği bulunmaktadır :
EclipseProjectName
|-- src
| `-- com
| `-- example
| `-- YourServlet.java
|-- WebContent
| |-- WEB-INF
| | `-- web.xml
| `-- jsps
| `-- page.jsp
:
Bir Maven projesinin durumda sınıfın, paket yapısı içine yerleştirilmesi gerekir main/java
ve bu nedenle değil mesela main/resources
, bu sigara sınıf dosyaları içindir . Aşağıda, Eclipse'in Navigator görünümünde görüldüğü gibi varsayılan bir Maven web uygulaması projesinin klasör yapısının bir örneği bulunmaktadır :
MavenProjectName
|-- src
| `-- main
| |-- java
| | `-- com
| | `-- example
| | `-- YourServlet.java
| |-- resources
| `-- webapp
| |-- WEB-INF
| | `-- web.xml
| `-- jsps
| `-- page.jsp
:
/jsps
Alt klasörün kesinlikle gerekli olmadığını unutmayın . Hatta onsuz yapabilir ve JSP dosyasını doğrudan webcontent / webapp köküne koyabilirsiniz, ancak bunu sadece sorunuzdan devralıyorum.
Servlet URL'sini şuraya ayarla: url-pattern
Sunucu uygulaması URL'si, sunucu uygulaması eşlemesinin "URL modeli" olarak belirtilir. Sunucu uygulaması sınıfının tanım gereği kesinlikle sınıf adı / dosya adı değildir. URL kalıbı @WebServlet
ek açıklamanın değeri olarak belirtilmelidir .
package com.example;
@WebServlet("/servlet")
public class YourServlet extends HttpServlet {
}
Gibi yol parametrelerini desteklemek istiyorsanız /servlet/foo/bar
, /servlet/*
bunun yerine bir URL kalıbı kullanın. Ayrıca / xyz / {değer} / test gibi Servlet ve yol parametrelerine de bakın , web.xml'de nasıl eşlenir?
@WebServlet
yalnızca Servlet 3.0 veya daha yenisinde çalışır
Kullanmak için , eğer varsa dosyanızın (Servlet 3.0'dan beri isteğe bağlıdır) Servlet 3.0+ sürümüne uygun olarak beyan edildiğinden ve bu nedenle örneğin 2.5 sürümüne veya daha düşük sürüme uygun olmadığından@WebServlet
emin olmanız yeterlidir . Aşağıda bir Servlet 4.0 uyumlu (Tomcat 9+, WildFly 11+, Payara 5+ vb. İle eşleşen) bulunmaktadır.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
>
</web-app>
Veya henüz Servlet 3.0+ üzerinde değilseniz (örn. Tomcat 6 veya daha eski), @WebServlet
notu kaldırın .
package com.example;
public class YourServlet extends HttpServlet {
}
Ve bunun yerine sunucu uygulamasını şu şekilde kaydedin web.xml
:
<servlet>
<servlet-name>yourServlet</servlet-name>
<servlet-class>com.example.YourServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>yourServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
Bu nedenle, her iki yolu da kullanmamanız gerektiğini unutmayın. Açıklama tabanlı yapılandırma veya XML tabanlı yapılandırma kullanın. İkisine de sahip olduğunuzda, XML tabanlı yapılandırma, açıklama tabanlı yapılandırmayı geçersiz kılacaktır.
Derlemeyi / dağıtımı doğrulama
Eclipse ve / veya Maven gibi bir derleme aracı kullanıyorsanız, derlenen sunucu uygulaması sınıfı dosyasının /WEB-INF/classes
, üretilen WAR dosyasının klasöründeki paket yapısında bulunduğundan kesinlikle emin olmanız gerekir . Olması durumunda package com.example; public class YourServlet
, içinde bulunmalıdır /WEB-INF/classes/com/example/YourServlet.class
. Aksi takdirde, @WebServlet
ayrıca bir 404 hatası durumunda veya <servlet>
aşağıdaki gibi bir HTTP 500 hatası durumunda karşılaşacaksınız :
HTTP Durumu 500
Servlet sınıfı com.example.YourServlet başlatılırken hata oluştu
Ve bir log sunucusuna bulmak java.lang.ClassNotFoundException: com.example.YourServlet
bir takip java.lang.NoClassDefFoundError: com.example.YourServlet
dönüş izledi içinde, javax.servlet.ServletException: Error instantiating servlet class com.example.YourServlet
.
Sunucu uygulamasının doğru bir şekilde derlenip sınıf yoluna yerleştirilip yerleştirilmediğini doğrulamanın kolay bir yolu, oluşturma aracının bir WAR dosyası oluşturmasına (örneğin , Eclipse'de sağ tıklama projesi, Dışa Aktar> WAR dosyası ) ve ardından içeriğini bir ZIP aracıyla incelemesine izin vermektir . Sunucu uygulamacığı sınıfı eksikse /WEB-INF/classes
veya dışa aktarma bir hataya neden oluyorsa, proje kötü bir şekilde yapılandırılmıştır veya bazı IDE / proje yapılandırma varsayılanları yanlışlıkla geri alınmıştır (örneğin , Eclipse'de Proje> Otomatik Olarak Oluştur devre dışı bırakılmıştır).
Ayrıca, proje simgesinin bir yapı hatasını gösteren kırmızı çarpı işareti olmadığından da emin olmanız gerekir. Hatayı Sorunlar görünümünde ( Pencere> Görünümü Göster> Diğer ... ) bulabilirsiniz. Genellikle hata mesajı Google'da incelenebilir. Hiçbir fikriniz yoksa, en iyisi sıfırdan yeniden başlatmak ve herhangi bir IDE / proje yapılandırma varsayılanına dokunmamaktır. Eclipse kullanıyorsanız, Eclipse projemde javax.servlet API'sini nasıl içe aktarırım? Bölümünde talimatları bulabilirsiniz.
Sunucu uygulamasının tek tek test edilmesi
Sunucunun üzerinde çalışması localhost:8080
ve WAR'ın bağlam yolunda başarıyla dağıtılması /contextname
(varsayılan olarak IDE proje adına, büyük / küçük harfe duyarlıdır!) Ve sunucu uygulamasının başlatılmasında başarısız olmadıysa (herhangi bir dağıtım / sunucu uygulaması başarılı / başarısız mesajları ve gerçek bağlam yolu ve sunucu uygulaması eşlemesi), URL modeline sahip bir sunucu uygulaması /servlet
adresinde mevcuttur http://localhost:8080/contextname/servlet
.
Tek başına test etmek için doğrudan tarayıcının adres çubuğuna girebilirsiniz. Uygun doGet()
şekilde geçersiz kılınır ve uygulanırsa, çıktısını tarayıcıda görürsünüz. Ya da hiç doGet()
yoksa veya yanlış bir şekilde çağırırsanız super.doGet()
, bir " HTTP 405: HTTP yöntemi GET bu URL tarafından desteklenmiyor " hatası gösterilecektir (bu, bir 405, sunucu uygulamasının kanıtı olarak 404'ten daha iyidir) kendisi aslında bulunur).
service()
Bir MVC çerçevesini yeniden icat etmediğiniz sürece geçersiz kılma kötü bir uygulamadır - bu, servletlerle yeni başlıyorsanız ve mevcut soruda açıklanan soruna dair hiçbir fikriniz yoksa çok düşük bir ihtimaldir;) Ayrıca bkz. Tasarım Modelleri web tabanlı uygulamalar .
Her şeye rağmen, sunucu uygulaması tek tek test edildiğinde zaten 404 döndürüyorsa, bunun yerine bir HTML formuyla denemek tamamen anlamsızdır. Bu nedenle mantıksal olarak, bir sunucu uygulamasından 404 hatasıyla ilgili sorulara herhangi bir HTML formunu dahil etmek de tamamen anlamsızdır.
Sunucu uygulamacığı URL'sine HTML'den başvurma
Tek tek çağrıldığında sunucu uygulamasının iyi çalıştığını doğruladıktan sonra, HTML'ye geçebilirsiniz. HTML formuyla ilgili somut sorununuzla ilgili olarak, <form action>
değerin geçerli bir URL olması gerekir. Aynısı için de geçerlidir <a href>
. Mutlak / göreceli URL'lerin nasıl çalıştığını anlamanız gerekir. Biliyorsunuz, bir URL, web tarayıcısının adres çubuğuna girebileceğiniz / görebileceğiniz gibi bir web adresidir. Form eylemi olarak göreli bir URL belirtirseniz, yani http://
şema olmadan, web tarayıcınızın adres çubuğunda gördüğünüz gibi geçerli URL ile göreli hale gelir . Bu nedenle, birçok yeni başlayanların düşündüğü gibi, sunucunun WAR klasör yapısındaki JSP / HTML dosya konumuna kesinlikle bağlı değildir.
Yani, HTML formu ile JSP sayfası tarafından açık olduğunu varsayarak http://localhost:8080/contextname/jsps/page.jsp
ve bulunan bir sunucu uygulaması başvuruda bulunmaları gerekmektedir http://localhost:8080/contextname/servlet
, burada birkaç vaka (güvenle yerini tutabilir notu olan <form action>
ile <a href>
burada):
Form eylemi, başında eğik çizgiyle bir URL'ye gönderir.
<form action="/servlet">
Baştaki eğik çizgi /
URL'yi etki alanına göre yapar, bu nedenle form şu adrese gönderilir:
http://localhost:8080/servlet
Ancak bu, yanlış bağlamda olduğu için muhtemelen 404 ile sonuçlanacaktır.
Form eylemi, başında eğik çizgi olmadan bir URL'ye gönderir.
<form action="servlet">
Bu, URL'yi mevcut URL'nin geçerli klasörüne göre yapar, böylece form şu adrese gönderilecektir:
http://localhost:8080/contextname/jsps/servlet
Ancak bu, yanlış klasörde olduğu için muhtemelen 404 ile sonuçlanacaktır.
Form eylemi, bir klasör yukarı çıkan bir URL'ye gönderir.
<form action="../servlet">
Bu bir klasör yukarı gidecek (tıpkı yerel disk dosya sistemi yollarında olduğu gibi!), Böylece form şu adrese gönderilecek:
http://localhost:8080/contextname/servlet
Bu çalışmalı!
Bununla birlikte, kanonik yaklaşım, URL'yi etki alanına göre yapmaktır, böylece JSP dosyalarını başka bir klasöre taşıdığınızda URL'leri bir kez daha düzeltmenize gerek kalmaz.
<form action="${pageContext.request.contextPath}/servlet">
Bu üretecek
<form action="/contextname/servlet">
Böylece her zaman doğru URL'ye gönderilir.
HTML'de düz tırnak kullanın
HTML gibi nitelikleri de emin misin düz tırnak kullanıyorsanız kesinlikle yapmak gerekir action="..."
veya action='...'
bu şekilde ve olmayan kıvırcık gibi tırnak action=”...”
veya action=’...’
. Kıvırcık alıntılar HTML'de desteklenmez ve değerin bir parçası haline gelirler. Bloglardan kod parçalarını kopyalayıp yapıştırırken dikkatli olun! Bazı blog motorlarının, özellikle de Wordpress'in, varsayılan olarak "akıllı alıntılar" olarak adlandırılan ve dolayısıyla kod parçacıklarındaki alıntıları bu şekilde bozduğu bilinmektedir. Öte yandan, kodu kopyalayıp yapıştırmak yerine, kodun üzerine kendiniz yazmayı deneyin. Kodu beyninizden ve parmaklarınızdan almanın bir diğer avantajı, kodu uzun vadede çok daha iyi hatırlamanızı ve anlamanızı sağlayacak ve aynı zamanda sizi daha iyi bir geliştirici yapacaktır.
Ayrıca bakınız:
Diğer HTTP Durumu 404 hatası durumları: