Quando doPost é chamado? Antes ou depois do envio completo dos dados?  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
EderBaum
JavaBaby
[Avatar]

Membro desde: 27/07/2005 22:58:32
Mensagens: 92
Offline

Estive pesquisando pela net e não achei quase nada falando sobre isto, mas minha duvida é relativamente simples.

Imagine que enviei um formulário via POST com apenas dois campos.
Titulo -> Um String de poucos Bytes
Conteudo -> Um String enorme, com talvez 2MB.

Minha duvida é quanto será a chamada do metodo doPost do Servlet.
A) Este método só é chamado quando o envio de tudo estiver em 100% com o Stream completinho no servidor?
B) Assim que a requisição "toca" o servlet, o método doPost já é chamado, mesmo com os dados parcialmente enviados, cabendo a este método ler o Stream de dados.

Pelo que trabalhei com Upload de arquivos, a resposta lógica seria a B.
Tal pergunta é extremamente pertinente, pois através desta resposta saberei onde melhor colocar uma abertura de conexão com o banco de dados por exemplo (Antes ou depois de ler todos os dados).

sabesim.com.br
[WWW]
schranko
JavaTeenager
[Avatar]

Membro desde: 05/09/2010 17:58:40
Mensagens: 156
Localização: Moscow, Russia
Offline

Ola,

Correto. Se ja existir uma instancia do Servlet, o container fornece um Thread que executa o metodo service do Servlet, que por
sua vez, no caso, invoca o metodo doPost. No metodo doPost voce obtem um InputStream do HttpServletRequest para ler
os bytes enviados. Com relacao a conexao com a base de dados, lembre-se que de qualquer forma nao eh interessante voce obte-la
no contexto de um Servlet, seja localmente ou como variavel de instancia. Localmente pois cada request ira implicar numa nova conexao
sendo criada e isso tem um grande impacto em performance e escalabilidade nao somente da sua aplicacao mas tambem do SGBD. Como
variavel de instancia porque uma unica conexao sera compartilhada por todos os Threads e isso pode gerar problemas de concorrencia,
e com isso afetar a performance e disponibilidade de sua aplicacao. Sugestao: Implemente uma arquitetura 3-tier:
Presentation Tier (JSP/Servlet) => Business Tier (Logica da aplicacao) => Integration Tier (Logica de acesso aos dados / persistencia).
Na camada de integracao implemente um DAO que utilizada um connection pooling gerenciado pelo container. Com isso voce garante melhor
manutenabilidade, extensibilidade, disponibilidade, performance e escalabilidade para a sua aplicacao

[ ]'s

"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." (Brian W. Kernighan)
[WWW]
lazaropj
JavaGuru
[Avatar]

Membro desde: 29/10/2009 11:05:04
Mensagens: 244
Localização: Brasilia - DF
Offline

schranko wrote:Ola,

Correto. Se ja existir uma instancia do Servlet, o container fornece um Thread que executa o metodo service do Servlet, que por
sua vez, no caso, invoca o metodo doPost. No metodo doPost voce obtem um InputStream do HttpServletRequest para ler
os bytes enviados. Com relacao a conexao com a base de dados, lembre-se que de qualquer forma nao eh interessante voce obte-la
no contexto de um Servlet, seja localmente ou como variavel de instancia. Localmente pois cada request ira implicar numa nova conexao
sendo criada e isso tem um grande impacto em performance e escalabilidade nao somente da sua aplicacao mas tambem do SGBD. Como
variavel de instancia porque uma unica conexao sera compartilhada por todos os Threads e isso pode gerar problemas de concorrencia,
e com isso afetar a performance e disponibilidade de sua aplicacao. Sugestao: Implemente uma arquitetura 3-tier:
Presentation Tier (JSP/Servlet) => Business Tier (Logica da aplicacao) => Integration Tier (Logica de acesso aos dados / persistencia).
Na camada de integracao implemente um DAO que utilizada um connection pooling gerenciado pelo container. Com isso voce garante melhor
manutenabilidade, extensibilidade, disponibilidade, performance e escalabilidade para a sua aplicacao

[ ]'s


Cara, bela explicação.
Essa arquitetura na qual vc citou, a 3-tier, é diferente de MVC?

Lazaro Jr.

Java4all
schranko
JavaTeenager
[Avatar]

Membro desde: 05/09/2010 17:58:40
Mensagens: 156
Localização: Moscow, Russia
Offline

Cara, bela explicação.
Essa arquitetura na qual vc citou, a 3-tier, é diferente de MVC?


Obrigado!

Numa arquitetura 3-tier utilizando JEE o MVC eh implementado na Presentation Tier. Note que se voce definir
uma arquiterura Web-Centric (por exemplo: Browser <=> Web Container <=> Database), entao necessariamente
o Web Container ira conter a implementacao das 3 camadas, e portanto seus componentes (por exemplo: JSPs,
Controllers, JavaBeans, Facades, DAOs, etc) serao acessados localmente um pelo outro. Contudo, se voce definir
uma arquitetura EJB-Centric (por exemplo: Browser <=> Web Container <=> EJB Container <=> Database), entao o
MVC continua implementado na Presentation Tier (no Web Container) e voce deve implementar alguns presentation-to-business
patterns (por exemplo Business Delegate) para acessar a Business Logic Tier agora implementada em componetes remotos EJB
(Stateless/Statefull Session Beans, por exemplo).

[ ]'s

"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." (Brian W. Kernighan)
[WWW]
EderBaum
JavaBaby
[Avatar]

Membro desde: 27/07/2005 22:58:32
Mensagens: 92
Offline

schranko wrote:Com relacao a conexao com a base de dados, lembre-se que de qualquer forma nao eh interessante voce obte-la
no contexto de um Servlet, seja localmente ou como variavel de instancia.


Na verdade só citei isso pq foi a primeira coisa que veio na cabeça. Uso Pool de Conexão, JPA, etc...
Mas acho interessante este detalhe da leitura dos dados pois um código assim:



É menos eficiente que este:


sabesim.com.br
[WWW]
marcelo.martins
What is classpath?

Membro desde: 24/03/2010 12:15:57
Mensagens: 7
Offline

Ola, é impressão minha, ou vc simplesmente inverteu a linha 1 pela 2???
jakefrog
GUJ Expert
[Avatar]

Membro desde: 22/01/2007 22:00:53
Mensagens: 4184
Online

marcelo.martins wrote:Ola, é impressão minha, ou vc simplesmente inverteu a linha 1 pela 2???


Pois é, não entendi o pq isso afetaria o desempenho.

Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]

SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)

Vamos em frente que atrás vem gente!
EderBaum
JavaBaby
[Avatar]

Membro desde: 27/07/2005 22:58:32
Mensagens: 92
Offline

Sim exatamente.
Apenas inverti as linhas.

Como você podem ler na discução acima imaginem que o parametro "texto" tem um tamnho de 10MB.
A leitura desta informação começará quando o primeiro byte deste parãmetro começar a ser enviado pelo navegador do cliente e só acabará quando tudo estiver no lado do servidor (Imagine isso numa conexão discada).

Enquanto isso o arquivo "C:\\Arquivo.txt" fica "esperando" até o envio de dados estar completo.

O que não ocorre no segundo caso.

sabesim.com.br
[WWW]
jakefrog
GUJ Expert
[Avatar]

Membro desde: 22/01/2007 22:00:53
Mensagens: 4184
Online

Caso queria otimizar o código, foi poderia fazer algo muito ninjitsu com multi-thread.

Poderia picar o arquivo em várias partes e subir todas de uma vez...

Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]

SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)

Vamos em frente que atrás vem gente!
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team