Olá… estou estudando o HTTPClient da Apache para comunicar desktop com servlet… tinha feito uma aplicacao cliente e a servlet, funcionando…
Só que veio a idéia de fazer uma biblioteca de classes uteis, e dentro coloquei exatamente igual o codigo cliente funcionando… eu encapsulo num jar, importo para uma aplicacao qualquer e uso… o problema eh que depois que fiz isso, o servlet nao reconhece mais os parametros!! Não dá erros na servlet, ele acha ela no servidor, mas quando verifico os parametros passados, dentro da servlet, estão todos nulos!
Por que isso acontece? Tem algum problema ter inserido o HTTPClient dentro do jar… ?
Classe cliente dentro do jar:
public class ManagerHTTPClient {
public static final String SAVE = "save";
public static final String UPDATE = "update";
public static final String DELETE = "delete";
public static final String RETURN_ALL = "returnAll";
public static final String HQL = "hql";
private static final ManagerHTTPClient bind = new ManagerHTTPClient();
private HttpClient client;
private PostMethod method;
private String charSet = "ISO-8859-1";
private String contentType = "text/html";
private String returnedServerXML = "";
private ManagerHTTPClient() {
}
public static ManagerHTTPClient getInstance() {
return bind;
}
public void registerServer(String registerServer) {
openConnection(registerServer);
}
public void setContentType(String str) {
contentType = str;
}
public void setCharset(String str) {
contentType = str;
}
private void openConnection(String registerServer) {
try {
client = new HttpClient(new MultiThreadedHttpConnectionManager());
client.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
method = new PostMethod(registerServer);
method.addParameter("charset", charSet);
method.setRequestHeader("Content-Type", contentType + "; charset=" + charSet);
//method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
} catch (Exception e) {
System.err.println("ERROR openConnection: " + e.getMessage());
}
}
private void sendReceiveHTTP(String objectInXML, String operation) throws Exception {
method.addParameter("XML", URLEncoder.encode(objectInXML, charSet));
method.addParameter("operation", operation);
//Execute method.
int status = client.executeMethod(method);
if (status != HttpStatus.SC_OK) {
System.err.println("ERROR SEND - STATUS: " + method.getStatusLine());
}
//recebe o xml de retorno do servidor
//xml receives the return of the server
returnedServerXML = URLDecoder.decode(method.getResponseBodyAsString(), charSet);
//limpa caracteres que podem estar antes do in�cio do xml
//characters that can be cleared before the xml
int idx = returnedServerXML.indexOf("<");
if (idx >= 0) {
returnedServerXML = returnedServerXML.substring(idx);
}
//libera a conexao
//releases the connection
method.releaseConnection();
}
//envia um objeto para o servidor efetuar alguma operacao
//send an object to the server make any operation
public Object sendReceiveAction(Object objectSend, String operation) throws Exception {
//cria xml de um objeto
//create an object xml
String clientXML = ManagerXML.getInstance().createXML(objectSend);
//enviando o xml criado
//sending the xml created
sendReceiveHTTP(clientXML, operation);
//cria o objeto do xml retornado
//create the object of the xml returned
Object returnedObject = ManagerXML.getInstance().createObject(returnedServerXML);
return returnedObject;
}
OBS: ManagerXML.getInstance().createXML cria um codigo xml…
ManagerXML.getInstance().createObject retorna o obj do xml…
Se eu testo o conteudo retornado do ManagerXML, está criando e retornando normalmente.
Dae eu acesso isso com:
ManagerHTTPClient.getInstance().registerServer("http://localhost:8084/SalesCommunityServer/ManagerHTTPServlet");
Object ret = ManagerHTTPClient.getInstance().sendReceiveAction(obj, ManagerHTTPClient.SAVE);
System.out.println("RETURN SERVER:");
System.out.println(ret);
E na servlet temos:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String charSet = request.getParameter("charset");
String xmlClient = request.getParameter("XML");
System.out.println("**********");
System.out.println("**********");
System.out.println("charSet: "+charSet);
System.out.println("xmlClient: "+xmlClient);
System.out.println("**********");
System.out.println("**********");
} catch(Exception ex){
ex.printStackTrace();
}
}
Sei que no cliente nao terá retorno nenhum, pois a servlet nao retorna nada mesmo… o problema está nos parametros passados… se eu vejo no cliente está ok… mas no servidor não… qq tem de errado? A servlet tem os outros métodos doPost etc… e é acessada pelo cliente, pois mostra as mensagens, mas nulos…
jopss 