HTML chamando Servlet Java - Como fazer?

Darlan, ok. Eu estudei a apostila do K19. Ela me ajudou muito com o HTML e CSS. Mas ela não explora muito a questão dos Servlets. Vou estudar a apostila sugerida pelo rmendes08. Vi q ela trata do Tomcat. Eu, entretanto, gostaria de usar, inicialmente, o Glassfish. Vc tem dominio desse server? Grato.

O tomcat é mais simples e fácil de configurar e entender. É mais indicado para quem está começando, afinal, você deveria focar em aprender sobre servlets, jsp e etc e não num application server.
Não vai usar nem 10% do que o glassfish possui, é como usar um tanque de guerra para prender um bêbado perturbando o sossego.

1 curtida

darlan, instalei o Tomcat 7 (ignorei o Tomcat 9 para ficar similar a apostila sugerida pelo rmendes08). Vi na
apostila como instalar e foi realmente muito simples. Ele já está rodando (started). Lendo a apostila vi
q ela se baseia no Eclipse. Vou falar uma coisa agora q sei q vc vai odiar:

como eu fiz nos estudos do Java (Desktop) eu comecei fazendo tudo “na mão”. Não usei qualquer IDE.
Fiz isso para fixar bem os comandos, evitando o apoio q o IDE dá. Foi muito bom para mim.

Eu queria fazer de novo. A apostila mostra, por exemplo, o WEB-INF da aplicação teste,
mas não mostra onde deve ser criado a pasta WEB-INF. Deve ser (obrigatóriamente) na mesma pasta
do Java? Ou deve ser (obrigatóriamente) na mesma pasta do Tomcat?

A apostila mostra a seguinte estrutura do projeto q eu, creio, foi criada pelo Eclipse:

  • projeto-teste
    • src
    • JRE System Library
    • Apache Tomcat 7
      • build
    • WebContaint
      • META-INF
      • WEB-INF
        • lib
          web.xml

Não usando o Eclipse (ou q/q outro IDE), onde eu deveria criar a estrutura com WEB-INF e o
restante necessario para rodar a aplicação no Tomcat?

Grato.

A estrutura é a mesma que está sendo mostrada no Eclipse. Você só não precisa criar as pastas “JRE System Library” e “Apache Tomcat 7”. Mas como você vai fazer tudo na mão, você precisa entender o que vai de fato para o servidor e o que não vai. A estrutura do projeto será a seguinte:

  • projeto-teste
    • src
    • WebContent
      • *.jsp, *.html, *.css, *.js
      • META-INF
      • WEB-INF
        • classes
        • lib
        • web.xml

Na pasta /src é onde ficam os seus fontes Java, distribuídos em pacotes. Na pasta WebContent, no primeiro nível é onde deverão ficar seus *.jsp’s e os arquivos estáticos, como CSS, Javascript, HTML, etc. Na pasta WEB-INF/lib devem ficar os .jar de bibliotecas externas que você está usando, e por fim, a pasta WEB-INF/classes é onde devem ficar os arquivos Java compilados, isto é, seus arquivos .class.
Para fazer o deploy da aplicação você vai precisar:

  1. compilar os arquivos da pasta /src para a pasta /WEB-INF/classes
  2. a partir da pasta WebContent, usar o comando jar para gerar um arquivo compactado com sufixo .war. No seu caso, projeto-teste.war.
  3. Copiar o arquivo .war gerado para a paste de deploy do servidor. No caso do Tomcat, você também pode copiar a pasta WebContent diretamente para a pasta de deploy do Tomcat, mas você deve renomeá-la com o nome que a aplicação vai ter no servidor.

Eu comecei a estudar java web em 2008. As primeiras aulas foram “na mão”. Criar a estrutura do projeto e tudo mais.
Posso afirmar uma coisa: a cada 10 empresas que você vá desenvolver, -2 vão exigir que você faça na mão, atualmente.
Aliás, dificilmente vão pedir para você criar projetos como está aí na apostila. Você vai “ser obrigado” a aprender a usar coisas como maven, gradle e afins. Mas, isso é “ota fumiga”.
Por quê usar o Eclipse?
Ele é utilizado em larga escala no Brasil e no mundo. Dá um certo trabalho se adaptar a ele (o netbeans é bem mais user friendly), mas, nada que alguns dias não resolvam.
De qualquer maneira, esse tutorial te dará uma certa luz.
Era comum há alguns anos (uma década atrás) você encontrar tutoriais com esse processo, passo a passo. Hoje, é bem mais difícil achar.

rmendes08/darlan, desculpe-me pela demora em retornar e obrigado pela orientação. Fiz o seguinte:

  • Criei a estrutura q vc indicou como segue:

    • c:
      • loginServlet (é o nome q estou usando para o aplicativo)
        • src
        • WebContaint
          • loginServlet.jsp;
          • loginServlet.war (deixei uma copia aqui);
          • META-INF
          • WEB-INF
            • web.xml (ver abaixo)
            • classes
              • loginServlet.class
            • lib
  • Como está o WEB.XML

<?xml version="1.0" encoding="ISO-8859-1" ?>

  <display-name>loginServlet</display-name>
  <description>
    This is a simple web application with a source code organization
    based on the recommendations of the Application Developer's Guide.
  </description>

  <servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>java.loginServlet.WebContaint.WEB-INF.classes.loginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/loginServlet</url-pattern>
  </servlet-mapping>

Obs: na instrução java.loginServlet.WebContaint.WEB-INF.classes.loginServlet</servlet-
class> eu coloquei o caminho completo até chegar na “class”;

     Na instrução <url-pattern>/loginServlet</url-pattern> eu deixei como no exemplo do WEB.XML
     q eu peguei no tutorial q o darlan sugeriu.
  • Copiei o loginServlet.war para a pasta C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps;
    Dentro dessa pasta, além do WAR q eu copiei tem varias pastas (doscs, examples, host-manager,
    manager e Root. Tem tb a pasta loginServlet q foi criada automaticamente quando eu copiei o WAR.

    • na pasta loginServlet tem:
      • META-INF
        • MANIFEST
      • WEB-INF
        • classes
          loginServlet.class
        • lib
        • web.xml
  • Eu stopei e startei o Tomcat novamente.

  • o HTML/JSP está com a chamada do servlet com
    method=“GET” action=“loginServlet”

  • Testei digitando http://localhost:8080/loginServlet no Chrome. Deu erro 404.

Vcs conseguem me ajudar? Grato.

Tem certeza que o tomcat está funcionando e está rodando na porta 8080?
Você baixou o instalador do tomcat ou o arquivo compactado do mesmo?
Está utilizando netbeans ou eclipse ou outra ide?

darlan/rmendes08, grato pela resposta. O monitor do Tomcat 7.0 mostra "started no Service Status. Vi
no server.xml o q está abaixo:

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
-->
<!-- Define a SSL HTTP/1.1 Connector on port 8443
     This connector uses the BIO implementation that requires the JSSE
     style configuration. When using the APR/native implementation, the
     OpenSSL style configuration is required as described in the APR/native
     documentation -->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
-->

Eu instalei o Tomcat no Windows 7 pelo instalador. Não usei o zip.

Como comentei nos posts anteriores para esta minha 1a experiencia eu estou fazendo “na mão”. Não
estou usando q/q IDE.

Vcs acham q o WEB.XML está correto e q os loginServlet.war e web.xml estão nas pastas certas?

Grato.

Então, camarada, eu entendo que você quer fazer na mão e tudo mais, mas, devido ao grande número de problemas que está encontrando e a dificuldade em resolver, eu sugiro, fortemente, baixe o eclipse e faça como a maioria faz.

1 curtida

Siga o que @darlan_machado falou. Em tempos que a geração atual usa maven e não se preocupam nem em saber como se referencia libs por conta própria, isso que você quer é loucura, em se tratando de Java principalmente, onde mesmo com IDE a vida não é fácil. Tem gente até que vai pro Netbeans pra fugir do Eclipse. Então relaxa, os profissionais usam Eclipse. Isso não impede saber como as coisas funcionam por baixo, tipo se nao entendeu porque o Eclipse gera tal pasta, se informe.

Não, não está. Esta linha do web.xml está completamente errada:

java.loginServlet.WebContaint.WEB-INF.classes.loginServlet

se você prestar atenção, o nome da tag é <servlet-class>, ou seja, você tem que passar o nome completo da classe, e não o caminho da classe em disco. Se a sua classe estiver no pacote default, então é só informar o nome da classe que deve funcionar.

Além disso, um servidor Tomcat pode hospedar várias aplicações Java, de forma que você tem que especificar a aplicação ao acessá-la através da URL. Assim, para acessar o seu Servlet, o formato da URL deve ser:

http://<host>:<porta>/<pasta-aplicação>/<url-pattern>

da maneira que você mapeou o seu servlet, tem que ficar

http://localhost:8080/loginServlet/loginServlet

sim, vai ter que repetir as duas coisas mesmo.

rmendes08, grato pela resposta. Vc tem razão. Eu usei http://localhost:8080/loginServlet/loginServlet no Chrome e o erro mudou. Agora é o erro abaixo:

HTTP Status 500 - Error instantiating servlet class Program Files.Apache Software Foundation.Tomcat 7.0.webapps.loginServlet.WEB-INF.classes.loginServlet

Será q a classe não foi instanciada justamente pelo erro no WEB.XML? Confesso q não ficou claro para
mim como eu deveria corrigí-lo. O pacote default a q vc se refere é o tradicional “pack” usado nos aplicativos Java Desktop? Pq dentro do meu Java eu não fiz q/q referencia à pack. Veja abaixo:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class loginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String userName = request.getParameter("userName");
		String password = request.getParameter("password");
		out.println("<html>");
		out.println("<body>");
		out.println("Hello " + "  " + userName + "welcome to my blog");
		out.println("Your password is : " + "  " + password + "<br>");
		out.println("</body></html>");
	}
}

Você pode me ajudar com o WEB.XML? Grato.

A resposta já está no post anterior. Mas sinceramente, você precisa estudar alguns conceitos básicos antes. Você precisa entender o que é um pacote em Java e como é o nome completo de uma classe. Entendendo isso você vai entender o seu erro.

rmendes08, vc está certo. Li algumas apostilas q tratam do básico na programação dos Servlets. Daí minha ideia de ter uma app muito simples, como a q propus acima, e com ela estudar as apostilas e aplicar na prática.
Vou buscar entender o conceito de pacote em Java (percebo pelo seu comentário q é diferente do pack q uso para Desktop).

De q/q forma, fiz uma pequena alteração no WEB.XML interpretando o q vc disse. Coloquei apenas o nome
da class (loginServlet). Testei e vi q uma coisa curiosa: o pagina inicial (HTML loginServlet.jsp) não apareceu (onde é pedido o Login e a Senha) mas apareceu a HTML q é montada dinamicamente pelo loginServlet.class, mostrando a msg Hello nullwelcome to my blog Your password is : null. Os campos Login e Senha estão evidentemente “null” pois a tela inicial não apareceu.
Deu a impressão que o http://localhost:8080/loginServlet/loginServlet está chamando diretamente o Servlet, sem passar pelo HTML. É possível isso? Um Browser pode chamar direto uma classe Java?
Grato.

Não é que o browser “chama o servlet”. O browser monta uma requisição HTTP e envia para o servidor. O browser não faz a menor ideia se naquele endereço existe um Servlet, um arquivo HTML, um script PHP, etc. Para o browser é tudo a mesma coisa. A questão é que o arquivo web.xml que você configurou diz exatamente isso: que ao acessar o padrão loginServlet o server deve chamar o Servlet.

Ok. Então vc acha q ainda existe um problema no WEB.XML? Pergunto isso, pois a sequencia correta seria: HTML mostrar a Tela, após pressionar o botão submit chamar o Servlet e, só então, mostrar a msg gerada dinamicamente, correto?
Grato.

Não tem erro no web.xml. Pelo jeito as coisas estão funcionando perfeitamente. Mas se você quer começar a navegação pelo HTML você tem que digitar o endereço do HTML no navegado.

rmendes08, grato pela resposta. Sim, para este meu 1o teste o HTML vai chamar o Servlet informando o User e a Password. Para chamar 1o o HTML basta q eu digite todo o caminho até onde o mesmo está? Por exemplo, c://java/…
Eu achei q para o HTML conseguir chamar um Servlet a chamada do HTML teria q ser, de alguma forma, “dentro” do Web Server. Grato.

É claro que tem que ser pelo web server. Mas dentro da aplicação o html tem uma url e o Servlet tem outro.

rmendes08, grato pela resposta. Tive a sugestão de incluir no web.xml a instrução “welcome-file-list” e
agora o HTML aparece primeiro e o Servlet só é chamado após o submit pressionado. veja abaixo:

<welcome-file-list>
    <welcome-file>loginServlet.jsp</welcome-file>
</welcome-file-list>

Muito obrigado pela tua ajuda. Agradeço tb ao douglas/javaflex. Grato.