intellij + maven + GlassFish - niedziałający serwlet

0

Cześć. Napisałem prosty serwlet i skonfigurowałem intelliJ IDEA ale po deploy nadal nie odpowiada serwlet.

Od początku to szło tak:
#Utworzyłem nowy projekt mavenowy w IntelliJ IDEA Ultimate z archetypu maven-archetype-webapp.
#Dodałem zależność i plugin do poma (źródło pom.xml poniżej).
#Wszedłem w Run -> Edit Configuration i skonfigurowałem GlassFish'a (screeny z konfiguracji również poniżej).
#W folderze main projektu dodałem folder java ustawiając go w File -> Project Structure… -> Modules jako Sources.
#W folderze utworzyłem pakiet test a w nim klasę serwletu Servlet.java (źródło tej klasy poniżej).
#Klikam [Shift]+[F10] (Run), wszystko ładnie się buduje i następuje deploy i… no właśnie. W przeglądarce plik index.jsp się otwiera ale gdy chcę zobaczyć odpowiedź z serwletu to jedynie co widzę to status 404.

Co muszę jeszcze zrobić by to zadziałało i serwlet był widoczny?

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>servlet</groupId>
	<artifactId>servlet</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<version>7.0</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>servlet</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

klasa serwletu Servlet.java:

package test;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "Main Servlet", urlPatterns = {"/servlet"})
public class Servlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType(MediaType.TEXT_PLAIN);
		try(PrintWriter out = response.getWriter()) {
			out.println("POST");
		}
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType(MediaType.TEXT_PLAIN);
		try(PrintWriter out = response.getWriter()) {
			out.println("GET");
		}
	}
}

screeny z konfiguracji GlassFish i struktura katalogów:
user image user image user image

Dodam, że cały projekt buduje się i następuje deploy nawet bez jednego ostrzeżenia. A co do adnotacji

@WebServlet(name = "Main Servlet", urlPatterns = {"/servlet"})

to nic to nie zmieni jeśli zamienię ją na o wiele prostrzą

@WebServlet("/servlet")

bez względu czy będzie tam /servlet czy servlet (sprawdziłem to, myślę, że tu chodzi o coś innego).

0

A nie dajesz w URLu podwójnie "servlet"? Ogólnie ręczne robienie servletów to przestarzała metoda.

0

A co ty wpisujesz w pasku adresu?

0

Nieeee, ręcznie to ja go nie robię. Klikam na katalog źródłowy java i mając go zaznaczony wybieram File -> New -> Servlet. Wówczas IntelliJ generuje taki prosty przykładowy kod serwletu włącznie z adnotacją. Ja jedynie co zrobiłem to tylko dopisałem te kilki:

response.setContentType(MediaType.TEXT_PLAIN);
try(PrintWriter out = response.getWriter()) {
	out.println("GET");
}

i

response.setContentType(MediaType.TEXT_PLAIN);
try(PrintWriter out = response.getWriter()) {
	out.println("POST");
}

w metodach doGet i doPost (które IntelliJ też wygenerował tyle, że były puste). Dodałem też adnotacje @Override do tych metod bo IntelliJ sam ich nie wygenerował i zmieniłem standardowo wygenerowaną adnotację

@WebServlet(name = "Servlet")

na

@WebServlet(name = "Main Servlet", urlPatterns = {"/servlet"})

A co do przeglądarki i paska to w zasadzie nic nie wpisuję, bo konfigurację (patrz screen wyżej) tak ustawiłem że po odpaleniu uruchamia mi się Firefox ze stroną http://localhost:8080/servlet/servlet na której właśnie nie ma odzewu ze strony serwletu (kod błędu 404). Natomiast gdy usunę jedno servlet i pozostanie w pasku tylko http://localhost:8080/servlet/ to oczywiście otwiera się strona index.jsp, która też jest w projekcie. Wobec tego myślę, że samo budowanie WARa jest ok, tylko pewnie coś w konfiguracji trzeba jeszcze zmienić. Sam WAR jest oczywiście zdeploydowany na serwerze, widzę go na liście zdeploydowanych aplikacji.

@Pinek: to że jest podwójnie servlet w adresie to akurat wynik zbieżności nazw context root'a aplikacji z url serwletu ;) Gdybym zamienił adnotację serwletu na

@WebServlet(name = "Main Servlet", urlPatterns = {"/simpleservlet"})

to wpisywałbym
http://localhost:8080/servlet/simpleservlet

0

Pokaż jeszcze web.xml

0

web.xml nieruszony. Serwlet mam zamiar konfigurować za pomocą adnotacji.

web.xml

<!DOCTYPE web-app PUBLIC
		"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
		"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
	<display-name>Archetype Created Web Application</display-name>
</web-app>

Ale coś czuję, że pora przerzucić się w końcu na springa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1