我是一个asp.net的开发者,最近因为要把项目集成到用友A8 OA中,在OA的菜单中加个链接,但是没接触过jsp,一窍不通,找别人帮忙给把链接加上了,现在链接是这样的:<a href="http://192.168.207.190/Account/Loginfromoa?loginname=${v3x:currentUser().loginName}&realname=${v3x:currentUser().name}" target="mainFrame">视频点播</a>,现在问题是url中的loginName和realname没有编码,传递过来后我获取的是乱码,现在不知道怎么给这句中把url编码加上,希望熟悉jsp的朋友帮下忙,谢了。

解决方案 »

  1.   

    你是在asp 中加上 这个超链接?还是在jsp中加上的超链接的啊?
    在jsp中加的话,做个过滤就可以了。如果在asp 中加,还没有遇到这个问题过;
    jsp 中加:
      new String(str.getBytes("gb2312"),"iso-8859-1"); 
      注意:str是你获取的字符,后面的方法是过处理的。也就是${v3x:currentUser().loginName} 这个获取的字符了。
    asp中:
    不知道如何整了。
      

  2.   

    你试试下面这个URL编码的类,把你的loginName和realname处理一下再放进url,如
    loginName = URLEncoder.encode(loginName); 这样loginName就被url编码了
    import java.io.*;public class URLEncoder {
        private static final int MAX_BYTES_PER_CHAR = 10; // rather arbitrary limit, but safe for now
        private static boolean[] dontNeedEncoding;
        private static String defaultEncName = "";
        private static final int caseDiff = ('a' - 'A');
        static 
        {
            dontNeedEncoding = new boolean[256];
            for (int i='a'; i<='z'; i++) 
            {
                dontNeedEncoding[i] = true;
            }
            for (int i='A'; i<='Z'; i++) 
            {
                dontNeedEncoding[i] = true;
            }
            for (int i='0'; i<='9'; i++) 
            {
                dontNeedEncoding[i] = true;
            }
            dontNeedEncoding[':'] = true;
            dontNeedEncoding['/'] = true;
            dontNeedEncoding[' '] = true;
            dontNeedEncoding['-'] = true;
            dontNeedEncoding['_'] = true;
            dontNeedEncoding['.'] = true;
            dontNeedEncoding['*'] = true;
            //defaultEncName = System.getProperty("microedition.encoding");
            if(defaultEncName == null || defaultEncName.trim().length() == 0){
                defaultEncName = "UTF-8";
            }
        }
        public static final int MIN_RADIX = 2;
        public static final int MAX_RADIX = 36;
        private URLEncoder() {}
        public static String encode(String s) 
        {
            String str = null;
            str = encode(s, defaultEncName);
            return str;
        }
        
        public static String encode(String s,String enc) 
        {
            boolean needToChange = false;
            boolean wroteUnencodedChar = false;
            StringBuffer out = new StringBuffer(s.length());
            ByteArrayOutputStream buf = new ByteArrayOutputStream(MAX_BYTES_PER_CHAR);
            OutputStreamWriter writer = null;
            try 
            {
                writer = new OutputStreamWriter(buf, enc);
            } 
            catch (UnsupportedEncodingException ex) 
            {
                try 
                {
                    writer = new OutputStreamWriter(buf,defaultEncName);
                } 
                catch (UnsupportedEncodingException e) 
                {
                    //never reach
                }
            }
            for (int i = 0; i < s.length(); i++) 
            {
                int c = (int) s.charAt(i);
                if (c<256 && dontNeedEncoding[c]) 
                {
                    out.append((char) (c==' ' ? '+' : c));
                    wroteUnencodedChar = true;
                } 
                else 
                {
                    // convert to external encoding before hex conversion
                    try 
                    {
                        if (wroteUnencodedChar) 
                        { // Fix for 4407610
                            writer = new OutputStreamWriter(buf,enc);
                            wroteUnencodedChar = false;
                        }
                        if(writer != null)
                            writer.write(c);
                        /*
                        * If this character represents the start of a Unicode
                        * surrogate pair, then pass in two characters. It's not
                        * clear what should be done if a bytes reserved in the
                        * surrogate pairs range occurs outside of a legal surrogate
                        * pair. For now, just treat it as if it were any other
                        * character.
                        */
                        if (c >= 0xD800 && c <= 0xDBFF) 
                        {
                            if ((i + 1) < s.length()) 
                            {
                                int d = (int) s.charAt(i + 1);
                                if (d >= 0xDC00 && d <= 0xDFFF) 
                                {
                                    writer.write(d);
                                    i++;
                                }
                            }
                        }
                        writer.flush();
                    } 
                    catch (IOException e) 
                    {
                        buf.reset();
                        continue;
                    }
                    byte[] ba = buf.toByteArray();
                    for (int j = 0; j < ba.length; j++) 
                    {
                        out.append('%');
                        char ch = toHex((ba[j] >> 4) & 0xF,16);
                        // converting to use uppercase letter as part of
                        // the hex value if ch is a letter.
                        if (isLetter(ch)) 
                        {
                            ch -= caseDiff;
                        }
                        out.append(ch);
                        ch = toHex(ba[j] & 0xF,16);
                        if (isLetter(ch)) 
                        {
                            ch -= caseDiff;
                        }
                        out.append(ch);
                    }
                    buf.reset();
                    needToChange = true;
                }
            }
            return (needToChange? out.toString() : s);
        }
        private static char toHex(int digit,int radix) 
        {
            if ((digit >= radix) || (digit < 0)) 
            {
                return '\0';
            }
            if ((radix < MIN_RADIX) || (radix > MAX_RADIX)) 
            {
                return '\0';
            }
            if (digit < 10) 
            {
                return (char)('0' + digit);
            }
            return (char)('a' - 10 + digit);
        }
        private static boolean isLetter(char c) 
        {
            if( (c >= 'a' && c <= 'z') || (c >='A' && c <= 'Z'))
                return true;
            return false;
        }
    }
      

  3.   


    <a href="http://192.168.207.190/Account/Loginfromoa?loginname=${v3x:currentUser().loginName}&realname=${v3x:currentUser().name}" target="mainFrame">视频点播 </a>jsp中,我是没有见过这样获取值的${v3x:currentUser().name;还有就是传编码没有什么用。
    一般在jsp开头中声明是哪种编码,如GB2312,还有就是你试着在jsp中打印${v3x:currentUser().name,看看在jsp中是不是乱码,如果是的话,用这样处理:
    你先把${v3x:currentUser().name赋值给一个变量,然后对这个变量进行编码处理,如
    String loginname = new String(变量.getBytes(),"iso8859-1");
    System.out.println(loginname);//看看loginname是不是乱码,如果不是就ok了
    另一个参数也是这样处理。然后,超链接的时候如下:
    <a href="http://192.168.207.190/Account/Loginfromoa?loginname=<%=loginname%>&realname=<%=name%>" target="mainFrame">视频点播 </a>
    楼主这样试试
      

  4.   

    晕,太复杂了,这是用友的A8 OA,不敢乱改,要改只能在上面那种链接中改,不能直接象asp.asp那样:
    <%=Server.UrlEncode("要编码的字符")%>这样吗?
      

  5.   

    我是在jsp中加,用utf8编码,这个new String...在jsp文件中放哪啊?因为这种必须经jsp引擎解析才行,象asp.net中,前台的服务器端代码可以放在<%%>中间,jsp怎么弄呢?
      

  6.   

    人气太差劲了,简直没法和asp.net版相比,算了,我自己用javascript全搞定
      

  7.   


    new String...在jsp中也是放在<%%>里面的
      

  8.   


    这个兄弟写的很清楚了。你在jsp界面上要是用加代码的话在 <% “代码” %> 里面加;我给你的方法就是这样的。当然,asp 我没接触过,不知道是这么传值的。
    <%
    String loginname=new String(${v3x:currentUser().loginName}.getBytes(),"iso8859-1");
    String name=new String(${v3x:currentUser().name}.getBytes(),"iso8859-1");
    %>然后,超链接的时候如下:<a href="http://192.168.207.190/Account/Loginfromoa?loginname=<%=loginname%>&realname=<%=name%>" target="mainFrame">视频点播</a>这样写的够清楚了吧!