First go at my own form validation, and suggestions?
A couple of small changes:


near the end:

if (errors == true) {
    return false;
}
else {
    var errors = false;
    alert("Submitted");
    return true;
}


Could be:

if(!errors)
{
    alert("Submitted");
}
return !errors; 

the .req 

if($(this).val() == ''){


could be:

if(!$(this).val()){


This would actually be a problem because

 " " != ""


so a space would validate (if that's what you intended then ignore this one ;) )
var errors= false; needs to be inside the click event:

 $('.submit').click(function() {
     var errors = false;


otherwise when you click the submit a second time after an invalid attempt it won't reset the value.


Alternatively:-

http://jsfiddle.net/ssTPm/

var validationConfig = [
{
    "selector": ".req",
    "hasErrors": function() {
        return !$(this).val()
    },
    "errorMessage": "&lt;span class='error'&gt;Required field.&lt;/span&gt;"},
{
    "selector": '.reqe',
    "hasErrors": function() {
        return $('.reqe').val().indexOf('@') === -1
    },
    "errorMessage": "&lt;span class='error'&gt;Please enter valid email.&lt;/span&gt;"
}];


then a nice loop like:

for (var i = 0, validation = null; validation = validationConfig[i]; i++) {
    $(validation.selector).each(validateEach);
}


and validateEach would look like:

 function validateEach () {
    var hasErrors = validation.hasErrors.call(this);
    errors |= hasErrors;
    if (hasErrors) {
        $(this).after(validation.errorMessage);
    }
};


This would mean you could have the validation function in you js files and then when you initialise the page from the server you just output the validationConfig:

validationConfig = validationConfig || [];
validationConfig.concat([
    {
        "selector": ... 
    }
];


as many times as you like. Although from the looks of things it might be over-engineering things a bit.

Explanations:-

so the || is a coalesce or OR operator. 

myVariable = myVariable || [];


means if myVariable results in a true value (not false, undefined, null etc etc) then it does nothing otherwise it assigns it a defualt value.

so if I had the following:

myList = myList|| [];
myList.push(1);
myList = myList|| [];
myList.push(2);
myList = myList|| [];
myList.push(3);


it would result in [1,2,3]. The first time it sets the value as [] the next times they just assign itself to itself. This way it doesn't need to know if it has been initialised or not.

the |= is a bitwise | (BITWISE OR) and an = so

value |= otherValue;


is the equivalent to 

value = value | otherValue;


In this example

errors |= hasErrors;


is the exact same as 

errors = errors || hasErrors;


Errors is assigned true as long as either it was already true or hasErrors is true;