I have a trouble with turkish characters while inserting to the database

I have a trouble with turkish characters while inserting to the database

<%@ page contentType="text/html; charset=ISO-8859-9" %> (is correcting only
texts. it doesnt work while inserting data to database)

the problem is begining with inserting data to database.

"çöö&#351;i&#351;iü&#287;ü&#287;"(entered data) is turning to "çöö?i?iü?ü?"(database view)
I cannot see these character in database (&#304;Üü&#287;&#351;&#305;&#350;&#286;)

how can i solve this problem
thanks for your help.
LVL 4
orhanbabaAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

saleemkhanCommented:
in insert jsp
use the below statement.
<%request.setCharacterEncoding("ISO-8859-9");%>

saleemkhanCommented:
<%@ page contentType="text/html; charset=ISO-8859-9" %>
is for browser only not for the database.


so to insert data with perticualar text format
u have to use
<%request.setCharacterEncoding("ISO-8859-9");%>

here is the ex

<%request.setCharacterEncoding("ISO-8859-9");%>
String username=request.getParameter("username");
and  your insert statement


s = conn.createStatement();
sql = "inert into tablename values (username'"+ username + "'");
 rs = s.executeQuery(sql);
conn.commit();

hope this helps.


kennethxuCommented:
I agree with saleemkhan comments on setCharacterEncoding

>> is turning to "çöö?i?iü?ü?"(database view)
have you tried to read it back from database and display it on jsp page? sometimes it is the database view have problem to display the right thing. so always check it on your jsp page.
Exploring ASP.NET Core: Fundamentals

Learn to build web apps and services, IoT apps, and mobile backends by covering the fundamentals of ASP.NET Core and  exploring the core foundations for app libraries.

orhanbabaAuthor Commented:
I am taking data from database to a jsp page and same problem continues.

<%request.setCharacterEncoding("ISO-8859-9");%> doesnt work
kennethxuCommented:
can you show us the code that you save data into database?
saleemkhanCommented:
hi,
  in your first post
<%@ page contentType="text/html; charset=ISO-8859-9" %> (is correcting only
texts. it doesnt work while inserting data to database)

u mentioned it doesnt workin while inserting.


in your recent post
I am taking data from database to a jsp page and same problem continues.

will  u be sure of  your problem while inserting or while taking(i mean displaying).

Note :if you didnt insert in correct it obviously show in wrong format.

please post your code here.

saleemkhanCommented:
hi,
    which database you are using?and which version.?

Recently i used oracle 9.i and i insert arabic data and retrive it no problem.

Let me know details?about db and all?

Just to find where is wrong in your code try this below.

in your insert.jsp

For example:

<%request.setCharacterEncoding("ISO-8859-9");%>
<%
String username=request.getParameter("username");
out.print(username);
%>
 if you are able print  username in correct format then we can conclude that may be the problem with db not supporting turkish text.

hint: If  the problem with db not supporting turkish text ask your dba i think you have change nls_lang to turkish format.

hope this helps.
if not let me know.


orhanbabaAuthor Commented:
this is form
<%@ page contentType="text/html; charset=ISO-8859-9" %>
<html>
<head>
<% request.setCharacterEncoding("ISO-8859-9");%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Language" content="tr">
</head><body onload=habermetin>
<SCRIPT language=JavaScript>
function fonksiyon(FonksiyonKodu) {      
      document.habermetin.HaberDetay.value += FonksiyonKodu;
}
</SCRIPT>
<center>
<h2>Yeni Haber Ekle</h2>
<form  name="habermetin" method="post" action="haberyaz.jsp">
<table>
<tr>
<td bgcolor="#FFCC66">Menüler</td>
<td>
<a href="javascript:fonksiyon('[R][/R]')"><img border="0" src="imgs/resim.gif" width="50" height="20"></a>
<a href="javascript:fonksiyon('[B][/B]')"><img border="0" src="imgs/baslik.gif" width="50" height="20"></a>
<a href="javascript:fonksiyon('[K][/K]')"><img border="0" src="imgs/kalin.gif" width="50" height="20"></a>
<a href="javascript:fonksiyon('[YS]')"><img border="0" src="imgs/ys.gif" width="50" height="20"></a>
</td>
</tr>
<tr>
<td bgcolor="#FFCC66">Yazar:</td>
<td>
<input type="text" name="Yazar" size="20" style="border-style: dotted; border-width: 2"></td>
</tr>
<tr>
<td bgcolor="#FFCC66">Ba&#351;l&#305;k:</td>
<td>
<input type="text" name="Baslik" size="60" style="border-style: dotted; border-width: 2"></td>
</tr>
<tr>
<td bgcolor="#FFCC66">Haber Metni:</td>
<td>
<textarea rows="17" name="HaberDetay" cols="48" style="border-style: dotted; border-width: 2" ></textarea></td>
</tr>
<tr><td bgcolor="#FFCC66" bordercolor="#FFCC66">&nbsp;</td>
  <td bgcolor="#FFCC66">
<input type="submit" value="Kay&#305;t Ekle" style="float: right">
<input type="reset" value="Temizle" style="float: right">
</td>
</tr>
</table>
</form></center>
</body>
</html>
______________________________
<%@ page contentType="text/html; charset=ISO-8859-9" %>
<html>
<head>
<meta http-equiv="Content-Language" content="tr">
</head>
<body>
<h2>Yeni Haber Ekleme</h2>
<% request.setCharacterEncoding("ISO-8859-9");%>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
String url = "jdbc:odbc:MS Access Database;DBQ=" + application.getRealPath( "db\\haber.mdb" );
//#########################################################
java.sql.Connection bag = java.sql.DriverManager.getConnection(url);
//#########################################################
String Sorgu = "INSERT INTO HABER (Yazar,Baslik,HaberDetay) VALUES (?,?,?)";
java.sql.PreparedStatement sorgulama = bag.prepareStatement(Sorgu);
sorgulama.setString(1,request.getParameter("Yazar"));
sorgulama.setString(2,request.getParameter("Baslik"));
sorgulama.setString(3,request.getParameter("HaberDetay"));
String Yazar = request.getParameter("Yazar");
if (Yazar.length() >= 20)
{
out.println("&#304;sim çok uzun...");
out.println("Geri dönmek için <a href='javascript: history.back()'> t&#305;klay&#305;n</a>");
}else
{
sorgulama.executeUpdate();
bag.close();
out.println("Yeni haber eklenmistir<br>Haber sayfasina dönmek için.. <a href='haber.jsp'>buraya</a> tiklayin.");
out.println("<br>Haber yönetim sayfas&#305;na dönmek için..<a href='haberadmin.jsp'> t&#305;klay&#305;n..</a>");
}
%>
</body>
</html>
this inserts
thanks
kennethxuCommented:
code looks good to me, blame it on jdbc-odbc bridge! This driver should get you the right result:
http://www.infozoom.de/ie/javaado.html

BTW, I always use UTF-8

let me know if you have further enquires.
saleemkhanCommented:
hi,
Try this and let me know.

 try to print one varaiable value in your  insert jsp

<% request.setCharacterEncoding("ISO-8859-9");%>
<%out.print("Yazar="+Yazar);%>


if you are able print  Yazar variable value   in correct(turkish) format then we can conclude that may be the problem with db not supporting turkish text.


kennethxuCommented:
saleemkhan, I have actually reproduced the same result for orhanbaba. the problem is on the jdbc-odbc bridge, the bridge handles chinese properly but not turkish. As soon as I switch to type 2 jdbc driver, everything works perfectly.
orhanbabaAuthor Commented:
Yes, there is sth wrong with first page. I still have a problem.  Turkish characters are still missing. ( i did all the thing you said ,seleemkhan)
(I am using tomcat v4)
which driver?
kennethxuCommented:
orhanbaba, the problem is NOT in the jsp/html page, it's the jdbc driver that you are using have problem to handle Turkish characters when it save data to database. have you tried the driver that I have posted earlier?
orhanbabaAuthor Commented:
------>
saleemkhan, I have actually reproduced the same result for orhanbaba. the problem is on the jdbc-odbc bridge, the bridge handles chinese properly but not turkish. As soon as I switch to type 2 jdbc driver, everything works perfectly.
<----------
what does it mean type 2
orhanbabaAuthor Commented:
Dear sleemkhan & kenethxu,
I think it is not about  jdbc:odbc bridge. There is a problem with server or sth else. Please look at these codes
This is < a.jsp >
<html>
<%@ page contentType="text/html; charset=ISO-8859-9" %>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</head>
<body>
<form method="POST" action="aa.jsp">
 <input type="submit" value="Submit" name="B1">
 <input type="reset" value="Reset" name="B2">
 <input type="text" name="kelime" size="20"></p>
</form>
</body>
</html>

this is < aa.jsp>

<%@ page contentType="text/html; charset=ISO-8859-9" %>
<html>
<body>
<% request.setCharacterEncoding("ISO-8859-9");%>
<%
String metin = request.getParameter("kelime");
out.println(metin);
%>
<body>
</html>

when i insert turkish characters to a.jsp and submit to aa.jsp I turkish characters are still missing. This is not about jdbc odbc bridge.
orhanbabaAuthor Commented:
If I change aa.jsp like this everything is ok...
Now I am changing my question. Is there any easy method ? Please write.
<%@ page contentType="text/html; charset=ISO-8859-9" %>
<html>
<body>
<% request.setCharacterEncoding("ISO-8859-9");%>
<%
String x;
String metin = request.getParameter("kelime");
x=new String(metin.getBytes("ISO-8859-1"),"ISO-8859-9");
out.println(x);
%>
<body>
</html>

Thank you saleemkhan and kennethxu. I found my answer i want my points back  :))
kennethxuCommented:
can you please post your full solution so we can PAQ the question and get your points back?
orhanbabaAuthor Commented:
ok
now I have a trouble with turkish characters with jsp page.
With first page I was taking characters and posting to another jsp page.
(No db connection) in second page the characters I have posted was disabled. I couldnt see the turkish characters.
so I found this method.
I took my posted data from ISO-8859-1 and converted it to ISO-8859-9

String x;
String metin = request.getParameter("kelime");
x=new String(metin.getBytes("ISO-8859-1"),"ISO-8859-9");// this solved the problem
out.println(x);


So problem solved
kennethxuCommented:
didn't you have problem with inserting Turkish character into Access database? did you managed to insert it into MS Access with jdbc-odbc bridge?

Anyway, you can post a request in community support if you wish to get your points back.
http://www.experts-exchange.com/Community_Support/
orhanbabaAuthor Commented:
yes everythig works perfect I have inserted it sql and access.
Thanks for your help.
can you sen me you email I think you are good person to be friend.
(sorry about bad english)
orhanbenim@yahoo.com
saleemkhanCommented:
hi,
good  to know that you solved the problem.
Congratualations :)
orhanbabaAuthor Commented:
I really thank you. you said it cannot be about database and I found this thank you both
kennethxuCommented:
my email is kennethxu at hotmail.com, I try my best to reply emails but it just impossible to reply to every one since there are a lot coming in every day.
orhanbabaAuthor Commented:
ok
thank you..
orhanbabaAuthor Commented:
how can i use md5 in my jsp page
thisis md5 java please help.
i will post a password it will encrypt.
here is the code

mport java.io.*;

public class MD5 {
    private class MD5State {

        public void reset() {
            state[0] = 0x67452301;
            state[1] = 0xefcdab89;
            state[2] = 0x98badcfe;
            state[3] = 0x10325476;
            bitCount = 0L;
        }

        public void copy(MD5State from) {
            System.arraycopy(from.buffer, 0, buffer, 0, buffer.length);
            System.arraycopy(from.state, 0, state, 0, state.length);
            valid = from.valid;
            bitCount = from.bitCount;
        }

        public boolean valid;
        public int state[];
        public long bitCount;
        public byte buffer[];

        public MD5State() {
            valid = true;
            state = new int[4];
            buffer = new byte[64];
            reset();
        }
    }

    public MD5() {
        workingState = new MD5State();
        finalState = new MD5State();
        decodeBuffer = new int[16];
        reset();
    }

    public byte[] getHash() {
        if(!finalState.valid) {
            finalState.copy(workingState);
            long bitCount = finalState.bitCount;
            int leftOver = (int)((finalState.bitCount >>> 3) + 9L & 63L);
            int padlen = 65 - leftOver;
            update(finalState, padding, 0, padlen);
            update(finalState, bitCount);
            finalState.valid = true;
        }
        return encode(finalState.state, 16);
    }

    public String getHashString() {
        return toHex(getHash());
    }

    public static byte[] getHash(byte b[]) {
        MD5 md5 = new MD5();
        md5.update(b);
        return md5.getHash();
    }

    public static String getHashString(byte b[]) {
        MD5 md5 = new MD5();
        md5.update(b);
        return md5.getHashString();
    }

    public static byte[] getHash(InputStream in) throws IOException {
        MD5 md5 = new MD5();
        byte buffer[] = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1)
            md5.update(buffer, read);
        return md5.getHash();
    }

    public static String getHashString(InputStream in) throws IOException {
        MD5 md5 = new MD5();
        byte buffer[] = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1)
            md5.update(buffer, read);
        return md5.getHashString();
    }

    public static byte[] getHash(File f) throws IOException {
        return getHash(((InputStream) (new FileInputStream(f))));
    }

    public static String getHashString(File f) throws IOException {
        return getHashString(((InputStream) (new FileInputStream(f))));
    }

    public static byte[] getHash(String s) {
        MD5 md5 = new MD5();
        md5.update(s);
        return md5.getHash();
    }

    public static String getHashString(String s) {
        MD5 md5 = new MD5();
        md5.update(s);
        return md5.getHashString();
    }

    public static byte[] getHash(String s, String enc) throws UnsupportedEncodingException {
        MD5 md5 = new MD5();
        md5.update(s, enc);
        return md5.getHash();
    }

    public static String getHashString(String s, String enc) throws UnsupportedEncodingException {
        MD5 md5 = new MD5();
        md5.update(s, enc);
        return md5.getHashString();
    }

    public void reset() {
        workingState.reset();
        finalState.valid = false;
    }

    public String toString() {
        return getHashString();
    }

    private void update(MD5State state, byte buffer[], int offset, int length) {
        finalState.valid = false;
        if(length + offset > buffer.length)
            length = buffer.length - offset;
        int index = (int)(state.bitCount >>> 3) & 0x3f;
        state.bitCount += length << 3;
        int partlen = 64 - index;
        int i = 0;
        if(length >= partlen) {
            System.arraycopy(buffer, offset, state.buffer, index, partlen);
            transform(state, decode(state.buffer, 64, offset));
            for(i = partlen; i + 63 < length; i += 64)
                transform(state, decode(buffer, 64, i));

            index = 0;
        }
        if(i < length) {
            int start = i;
            for(; i < length; i++)
                state.buffer[(index + i) - start] = buffer[i + offset];

        }
    }

    public void update(byte buffer[], int offset, int length) {
        update(workingState, buffer, offset, length);
    }

    public void update(byte buffer[], int length) {
        update(buffer, 0, length);
    }

    public void update(byte buffer[]) {
        update(buffer, 0, buffer.length);
    }

    public void update(byte b) {
        byte buffer[] = new byte[1];
        buffer[0] = b;
        update(buffer, 1);
    }

    private void update(MD5State state, long l) {
        update(state, new byte[] {
            (byte)(int)(l >>> 0 & 255L), (byte)(int)(l >>> 8 & 255L), (byte)(int)(l >>> 16 & 255L), (byte)(int)(l >>> 24 & 255L), (byte)(int)(l >>> 32 & 255L), (byte)(int)(l >>> 40 & 255L), (byte)(int)(l >>> 48 & 255L), (byte)(int)(l >>> 56 & 255L)
        }, 0, 8);
    }

    public void update(String s) {
        update(s.getBytes());
    }

    public void update(String s, String enc) throws UnsupportedEncodingException {
        update(s.getBytes(enc));
    }

    private static String toHex(byte hash[]) {
        StringBuffer buf = new StringBuffer(hash.length * 2);
        for(int i = 0; i < hash.length; i++)
        {
            int intVal = hash[i] & 0xff;
            if(intVal < 16)
                buf.append("0");
            buf.append(Integer.toHexString(intVal));
        }

        return buf.toString();
    }

    private static int FF(int a, int b, int c, int d, int x, int s, int ac) {
        a += b & c | ~b & d;
        a += x;
        a += ac;
        a = a << s | a >>> 32 - s;
        return a + b;
    }

    private static int GG(int a, int b, int c, int d, int x, int s, int ac) {
        a += b & d | c & ~d;
        a += x;
        a += ac;
        a = a << s | a >>> 32 - s;
        return a + b;
    }

    private static int HH(int a, int b, int c, int d, int x, int s, int ac) {
        a += b ^ c ^ d;
        a += x;
        a += ac;
        a = a << s | a >>> 32 - s;
        return a + b;
    }

    private static int II(int a, int b, int c, int d, int x, int s, int ac) {
        a += c ^ (b | ~d);
        a += x;
        a += ac;
        a = a << s | a >>> 32 - s;
        return a + b;
    }

    private static byte[] encode(int input[], int len) {
        byte out[] = new byte[len];
        int j;
        int i = j = 0;
        for(; j < len; j += 4)
        {
            out[j] = (byte)(input[i] & 0xff);
            out[j + 1] = (byte)(input[i] >>> 8 & 0xff);
            out[j + 2] = (byte)(input[i] >>> 16 & 0xff);
            out[j + 3] = (byte)(input[i] >>> 24 & 0xff);
            i++;
        }

        return out;
    }

    private int[] decode(byte buffer[], int len, int offset) {
        int j;
        int i = j = 0;
        for(; j < len; j += 4)
        {
            decodeBuffer[i] = buffer[j + offset] & 0xff | (buffer[j + 1 + offset] & 0xff) << 8 | (buffer[j + 2 + offset] & 0xff) << 16 | (buffer[j + 3 + offset] & 0xff) << 24;
            i++;
        }

        return decodeBuffer;
    }

    private static void transform(MD5State state, int x[]) {
        int a = state.state[0];
        int b = state.state[1];
        int c = state.state[2];
        int d = state.state[3];
        a = FF(a, b, c, d, x[0], 7, 0xd76aa478);
        d = FF(d, a, b, c, x[1], 12, 0xe8c7b756);
        c = FF(c, d, a, b, x[2], 17, 0x242070db);
        b = FF(b, c, d, a, x[3], 22, 0xc1bdceee);
        a = FF(a, b, c, d, x[4], 7, 0xf57c0faf);
        d = FF(d, a, b, c, x[5], 12, 0x4787c62a);
        c = FF(c, d, a, b, x[6], 17, 0xa8304613);
        b = FF(b, c, d, a, x[7], 22, 0xfd469501);
        a = FF(a, b, c, d, x[8], 7, 0x698098d8);
        d = FF(d, a, b, c, x[9], 12, 0x8b44f7af);
        c = FF(c, d, a, b, x[10], 17, -42063);
        b = FF(b, c, d, a, x[11], 22, 0x895cd7be);
        a = FF(a, b, c, d, x[12], 7, 0x6b901122);
        d = FF(d, a, b, c, x[13], 12, 0xfd987193);
        c = FF(c, d, a, b, x[14], 17, 0xa679438e);
        b = FF(b, c, d, a, x[15], 22, 0x49b40821);
        a = GG(a, b, c, d, x[1], 5, 0xf61e2562);
        d = GG(d, a, b, c, x[6], 9, 0xc040b340);
        c = GG(c, d, a, b, x[11], 14, 0x265e5a51);
        b = GG(b, c, d, a, x[0], 20, 0xe9b6c7aa);
        a = GG(a, b, c, d, x[5], 5, 0xd62f105d);
        d = GG(d, a, b, c, x[10], 9, 0x2441453);
        c = GG(c, d, a, b, x[15], 14, 0xd8a1e681);
        b = GG(b, c, d, a, x[4], 20, 0xe7d3fbc8);
        a = GG(a, b, c, d, x[9], 5, 0x21e1cde6);
        d = GG(d, a, b, c, x[14], 9, 0xc33707d6);
        c = GG(c, d, a, b, x[3], 14, 0xf4d50d87);
        b = GG(b, c, d, a, x[8], 20, 0x455a14ed);
        a = GG(a, b, c, d, x[13], 5, 0xa9e3e905);
        d = GG(d, a, b, c, x[2], 9, 0xfcefa3f8);
        c = GG(c, d, a, b, x[7], 14, 0x676f02d9);
        b = GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);
        a = HH(a, b, c, d, x[5], 4, 0xfffa3942);
        d = HH(d, a, b, c, x[8], 11, 0x8771f681);
        c = HH(c, d, a, b, x[11], 16, 0x6d9d6122);
        b = HH(b, c, d, a, x[14], 23, 0xfde5380c);
        a = HH(a, b, c, d, x[1], 4, 0xa4beea44);
        d = HH(d, a, b, c, x[4], 11, 0x4bdecfa9);
        c = HH(c, d, a, b, x[7], 16, 0xf6bb4b60);
        b = HH(b, c, d, a, x[10], 23, 0xbebfbc70);
        a = HH(a, b, c, d, x[13], 4, 0x289b7ec6);
        d = HH(d, a, b, c, x[0], 11, 0xeaa127fa);
        c = HH(c, d, a, b, x[3], 16, 0xd4ef3085);
        b = HH(b, c, d, a, x[6], 23, 0x4881d05);
        a = HH(a, b, c, d, x[9], 4, 0xd9d4d039);
        d = HH(d, a, b, c, x[12], 11, 0xe6db99e5);
        c = HH(c, d, a, b, x[15], 16, 0x1fa27cf8);
        b = HH(b, c, d, a, x[2], 23, 0xc4ac5665);
        a = II(a, b, c, d, x[0], 6, 0xf4292244);
        d = II(d, a, b, c, x[7], 10, 0x432aff97);
        c = II(c, d, a, b, x[14], 15, 0xab9423a7);
        b = II(b, c, d, a, x[5], 21, 0xfc93a039);
        a = II(a, b, c, d, x[12], 6, 0x655b59c3);
        d = II(d, a, b, c, x[3], 10, 0x8f0ccc92);
        c = II(c, d, a, b, x[10], 15, 0xffeff47d);
        b = II(b, c, d, a, x[1], 21, 0x85845dd1);
        a = II(a, b, c, d, x[8], 6, 0x6fa87e4f);
        d = II(d, a, b, c, x[15], 10, 0xfe2ce6e0);
        c = II(c, d, a, b, x[6], 15, 0xa3014314);
        b = II(b, c, d, a, x[13], 21, 0x4e0811a1);
        a = II(a, b, c, d, x[4], 6, 0xf7537e82);
        d = II(d, a, b, c, x[11], 10, 0xbd3af235);
        c = II(c, d, a, b, x[2], 15, 0x2ad7d2bb);
        b = II(b, c, d, a, x[9], 21, 0xeb86d391);
        state.state[0] += a;
        state.state[1] += b;
        state.state[2] += c;
        state.state[3] += d;
    }

    private MD5State workingState;
    private MD5State finalState;
    private int decodeBuffer[];
    private static final byte padding[] = {
        -128, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0
    };
}
orhanbabaAuthor Commented:
noone here?
CetusMODCommented:
PAQed, with points refunded (40)

CetusMOD
Community Support Moderator

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
JSP

From novice to tech pro — start learning today.