» »

tomcat - problem z encodingom

tomcat - problem z encodingom

mainman ::

Zanima me kako bi v tomcatu 5.x usposobil šumnike. Poskusil sem že vse mogoče pa šumniki še vedno ne delajo.
Problem se pojavi ko vnesem neko vrednost in jo potem shranim v bazo. V bazi ni šumnikov ampak sami kvadratki.

Projekt, v katerem to delam je bil prenešen iz websphera in tam so šumniki delali. Baza je DB2.

naredil sem si run datoteko, ki kliče startup datoteko od tomcata.

Vsebina run datoteke:

set JAVA_HOME=.\j2sdk
set CATALINA_HOME=.\tomcat
set CATALINA_OPTS=-Dclient.encoding.override=cp1250
set JAVA_OPTS=-Dclient.encoding.override=cp1250
.\tomcat\bin\startup.bat > .\error_log\start_log.log

Pod JAVA_OPTS sem poskusil nastaviti tudi
-Dfile.encoding=cp1250

cp1250 sem zamenjal z iso-8859-2 in tudi ne dela.

Za vse requeste uporabljam Encoding filter, ki uporablja cp1250 oz. iso-8859-2 in tudi ne dela.

Vsak jsp ima nastavljeno

<META http-equiv="Content-Type" content="text/html; charset=cp1250">

To vse je v webspheru delalo zato sumim, da je problem v tomcatu.

Zanima me, če kdo laufa tomcata in kako je rešil probleme s šumniki?

Zanima me tudi ali ima kdo kake izkušnje z bazo MaxDB? Je baza zadosti stabilna ali so kaki problemi?
Kako se obnaša s podatki reda 1 tera?

kopernik ::

Jaz veliko uporabljam tomcat-a in mi šumniki delujejo brez problema. _TODA_ verzije 5.x sploh še nisem stestiral. Možno je, da ima kakšen bug z encodingi.

Moj postopek:
vsak jsp ima naslednjo deklaracijo:


<%@ page contentType="text/html; charset=iso-8859-2" %>


Napisal sem tudi en filter, ki mi v vsakem requestu kodira parametre iz tega encodinga (iso-8859-2). Oziroma, zaradi tega, ker kot programer ne vem, na katerem OSu bo tekel JVM (posledično ne poznam encoding OSa, ki ga JVM privzame zase), moram pri branju parametrov iz requesta upoštevati dejstvo, da so parametri v iso-8859-2 encodingu, sistemski pa je lahko poljuben. Zaradi tega dejstva se (vsaj začetnikom) velikokrat dogaja to, da jim šumniki v windowsih delajo (če so razvijali v windowsih), na kakem unixu pa ne.

To je vse. Nobenih dodatnih nastavitev pri catalini ali javi (kar je tudi prav, sicer web aplikacija ni prenosljiva med serverji).

Aja, baza je Oracle.

Zgodovina sprememb…

  • spremenil: kopernik ()

kopernik ::


posledično ne poznam encoding OSa, ki ga JVM privzame zase


Majhen popravek. Logično, v Javi so vsi Stringi predstavljeni z UTF encodingom. Problem nastane pri kakršnemkoli Inputu/Outputu. Takrat pa Java privzame, da je vir(npr. tekstovna datoteka, http client, ...) v encodingu oper. sistema, na katerem teče OS. Pri windowsih je to navadno windows-1250, na unixih pa iso-8859-1. Problem je, da ti tega kot programer ne veš.

Zgodovina sprememb…

  • spremenil: kopernik ()

qrof ::

<%@ page contentType="text/html; charset=windows-1250" % >
<% request.setCharacterEncoding( "windows-1250" ); % >

Oziroma cp1250, drugi stavek povzroči da so vsi requesti oz. forme kodirani v cp1250.

V kakšnem encodingu je baza? Ali ti mogoče connector dela kakšno translacijo?

www.experts-exchange.com
www.google.com

Zgodovina sprememb…

  • spremenil: qrof ()

mainman ::

Hvala vsem na odgovorih.

Prikaz šumnikov v jsp-jih dela. Isto dela tudi prikaz šumnikov, ki so prebrani iz baze.

Problem pa se pojavi če imam neko input formo, ki gre preko strutsov.

Če submitnem input formo na navaden jsp in preberem vrednost se šummniki vidijo. V primeru submita na akcijo se ne vidijo. T u ne pomaga nobeden filter in nič.

kopernik ::

Ja, no, saj ravno to je problem. Ko uporabnik klikne na submit, dobiš ti na http konekciji iz njegove mašine podatke (torej parametre). Kar pomeni da pride nekaj od zunaj na tvoj JVM.


T u ne pomaga nobeden filter in nič.


Če ni napisan pravilno, potem res ne. Lahko pokažeš kodo, ki si jo napisal za ta filter ?

mainman ::

Filter je isti kot je v primeru, ki ga dobiš poleg tomcata v examples

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;

public class SetCharacterEncodingFilter implements Filter {

protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;

public void destroy() {

this.encoding = null;
this.filterConfig = null;

}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {



// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {

String encoding = selectEncoding(request);
if (encoding != null){
request.setCharacterEncoding(encoding);
//response.setCharacterEncoding(encoding);
}
}

// Pass control on to the next filter
chain.doFilter(request, response);

}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;

}
protected String selectEncoding(ServletRequest request) {

return (this.encoding);

}


}

kopernik ::

Ja, tale filter nič ne spreminja(enkodira) parametrov.
Ok, moj filter, ki mi dela povsod:

dva razreda, najprej prvi:


import java.io.IOException;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;

public class EncodingFilter implements Filter
{
  private String encoding = null;
  
  /**
   * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
   */
  public void init(FilterConfig arg0) throws ServletException
  {
    this.encoding = arg0.getInitParameter("encoding");
    if(this.encoding == null)
    {
      this.encoding = "iso-8859-1";
    }

    Helpers.log("Encoding filter initialized!");
  }

  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException
  {
    EncodingRequestWrapper wrapper = 
      new EncodingRequestWrapper((HttpServletRequest) req, this.encoding);
      
    chain.doFilter(wrapper, res);
  }

  /**
   * @see javax.servlet.Filter#destroy()
   */
  public void destroy()
  {
  }
}


in še drugi razred (wrapper) :


import java.util.*;

import javax.servlet.http.*;

/**
 * Request wrapper that takes care of propper character encoding.
 * Java API automatically encodes every request with default system encoding.
 * We don't like that, so we change the encoding of every request param.
 */
public class EncodingRequestWrapper extends HttpServletRequestWrapper
{
  private final String encoding;
  
  /**
   * @param arg0
   */
  public EncodingRequestWrapper(HttpServletRequest req, String encoding)
  {
    super(req);
    
    this.encoding = encoding;
  }

  /**
   * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
   */
  public String getParameter(String arg0)
  {
    return Helpers.encodeString(super.getParameter(arg0), this.encoding);
  }

  /**
   * @see javax.servlet.ServletRequest#getParameterMap()
   */
  public Map getParameterMap()
  {
    Map params = new HashMap();
    params.putAll(super.getParameterMap());
    
    for(Iterator keys = params.keySet().iterator();keys.hasNext();)
    {
      String key = (String) keys.next();
      String[] values = (String[]) params.get(key);
      String[] encodedValues = new String[values.length];
      
      for(int i = 0;i < values.length;i++)
      {
        encodedValues[i] = Helpers.encodeString(values[i], this.encoding);
      }

      params.put(key, encodedValues);
    }
    
    return params;
  }

  /**
   * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
   */
  public String[] getParameterValues(String arg0)
  {
    String[] originalValues = super.getParameterValues(arg0);
    String[] paramValues = new String[originalValues.length];
    
    for(int i = 0;i < originalValues.length;i++)
    {
      paramValues[i] = Helpers.encodeString(originalValues[i], this.encoding);
    }

    return paramValues;
  }
}


Še statična metoda encodeString iz razreda Helpers:
  public static String encodeString(String s, String encoding)
  {
    String sTemp = null;

    if (s != null)
    {
      try
      {
        sTemp = new String(s.getBytes("iso-8859-1"), encoding);
      }
      catch (UnsupportedEncodingException ex)
      {
        ex.printStackTrace();
      }
    }

    return (sTemp);
  }


Potem ta filter nastaviš za celotno aplikacijo (oz. lahko tudi samo za tiste jsp-je/servlete, kjer imaš probleme).

Zgodovina sprememb…

  • spremenil: kopernik ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Jasper subreport

Oddelek: Programiranje
131529 (1278) nightrage
»

java v javascript?

Oddelek: Programiranje
211988 (1691) boss-tech
»

tomcat in datasource

Oddelek: Programiranje
131881 (1638) infiniteLoop
»

[Java] Servlet ne prepozna šumnikov

Oddelek: Programiranje
51462 (1388) MarkookraM
»

[Ajax in Java] v IE6 dela, v Firefoxu ne

Oddelek: Programiranje
241814 (1568) krho

Več podobnih tem