Avatar billede skwat Praktikant
24. august 2009 - 10:40 Der er 7 kommentarer og
1 løsning

Struts/j2ee replace input.

Jeg har et site kørende som nu er begyndt at blive brugt i Østeuropa, heraf følger de næsten obligatoriske fejl vedr. tegnsæt. (Man har fra begyndelsen ikke brugt UTF-noget).

På den korte bane vil jeg gerne løse det ved at erstatte underlige tegn med nogle vesteuropæiske lookalikes :) sådan at eks:

Ą( &#260 ) -> A osv.

Tænkte at jeg bare kunne lave min egen specialisering af BaseFieldTag og så override getValue. Men.... det ser ikke ud til at det er den metode der bliver brugt til at fylde ens bean.

(Og ja, jeg ved godt det ikke er den bedste løsning osv.)

Nogen (Sikkert Arne_v :) ) - der har en god ide til det? Har ikke lyst til at klister sådan noget replace ind på alle mine getter og setter over alt i koden :)
Avatar billede arne_v Ekspert
24. august 2009 - 15:36 #1
1) Er det ikke nemmere at skifte til UTF-8 end at lave et hack?

Java koerer jo allerede Unicode internt, hvis databasen forstaar unicode eller UTF-8 er det vel mest et spoergsmaal om at aendre charset i HTML & HTTP.

2)

Hvis du vil fifle, saa proev og lav et servlet filter hvor du sender en HttpServletRequestWrapper med som wrapper den rigtige HttpServletRequest men har overrided diverse getParameter metoder.
Avatar billede skwat Praktikant
24. august 2009 - 17:02 #2
Hej Arne,

ad 1) Jo, det var også det jeg helst ville, men det er, af forskellige årsager jeg ikke fatter, ikke muligt. (Noget med at databasen bliver brugt af en mulliard andre ting som er preUTF8 og i 201X forventer man at have opgraderet den del, og derfor..... standard snak)
Det bliver naturligvis løst i version 2 af systemet.

Den ligger jo lige til højrebenet her, hvorfor tænkte jeg ikke på det - servlet er klart.
Avatar billede skwat Praktikant
24. august 2009 - 23:38 #3
be om et svar igen.
Avatar billede arne_v Ekspert
25. august 2009 - 03:34 #4
svar
Avatar billede arne_v Ekspert
25. august 2009 - 05:06 #5
Og hvis nogen skulle oenske lidt mere kode saa:

web.xml fragment:

    <filter>
        <filter-name>reverse</filter-name>
        <filter-class>test.ReverseFilter</filter-class>
    </filter>
    <filter-mapping> 
        <filter-name>reverse</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>

filter:

package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;

public final class ReverseFilter implements Filter {
    public void doFilter(ServletRequest request,
                        ServletResponse response,
                        FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new ReverseRequestWrapper((HttpServletRequest)request), response);
    }
    public void init(FilterConfig config) throws ServletException { 
    } 
    public void destroy() { 
    } 
}

request wrapper:

package test;

import java.util.Map;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class ReverseRequestWrapper extends HttpServletRequestWrapper {
    public ReverseRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    public String getParameter(String name) {
        String res = super.getParameter(name);
        if(res == null) return res;
        return reverse(res);
    }
    public Map getParameterMap() {
        Map res = super.getParameterMap();
        if(res == null) return res;
        Iterator it = res.keySet().iterator();
        while(it.hasNext()) {
            String key = (String)it.next();
            String value = (String)res.get(key);
            res.put(key, reverse(value));
        }
        return res;
    }
    public String[] getParameterValues(String name) {
        String[] res = super.getParameterValues(name);
        if(res == null) return res;
        for(int i = 0; i < res.length; i++) {
            res[i] = reverse(res[i]);
        }
        return res;
    }
    private String reverse(String s) {
        StringBuffer sb = new StringBuffer(s);
        sb.reverse();
        return sb.toString();
    }
}

Dette eksempel laver saa ikke helt det samme, men ideen skulle vaere demonstreret.
Avatar billede skwat Praktikant
25. august 2009 - 14:30 #6
arne_v, dit filter ville være en ret sjov 1.lirpa joke.

min løsning er næsten den samme, men griber bare ind i doPost, da det er input kun jeg skal bruge. men ellers er der bare at sige enmillion tak --- endnu engang.
Avatar billede arne_v Ekspert
28. august 2009 - 21:06 #7
Finessen med filteret er at det overhovedet ikke roerer den egentlige applikations kode.

Det virker med Struts, JSF og alle mulige Java web frameworks.

Hvis de engang faar fikset det egentlige problem, så fjerner du bare filteret.
Avatar billede arne_v Ekspert
13. september 2009 - 02:31 #8
Husk lige at klikke accepter ved lejlighed.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester