Calcular a idade em jsp

esse codigo é pra calcular a idade so que ela esta retornado errada… se por 30/08/1980 na data de nascimento ela retorna 27 anos… algum ajuda.

<% String data="";
Date calc,hoje;
int idade;
data=request.getParameter("dtaNascimento");
calc=new Date(data);
hoje=new Date();
int dia=calc.getYear();
int age=hoje.getYear()-calc.getYear();
if((hoje.getMonth() > calc.getMonth()) && (hoje.getDay() >= calc.getDay()))
	idade=age-1;
	else
	idade=age;
out.println("Idade: "+idade+" anos"); %> <br/>

Da uma olhada:

http://imasters.uol.com.br/artigo/5360/java/calcule_a_idade_corretamente_em_java/

Retorna a idade exata.

public int calculaIdade(String data) throws ParseException{
		int idade = 0;
		DateFormat df = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);  
		Date data1 = df.parse(data); 
		Date data2 =  new Date(); 
		Calendar cal1 = Calendar.getInstance();  
		Calendar cal2 = Calendar.getInstance();  
		cal1.setTime(data1);  
		cal2.setTime(data2);  
		int year1 = cal1.get(Calendar.YEAR);  
		int year2 = cal2.get(Calendar.YEAR);  
		int month1 = cal1.get(Calendar.MONTH);  
		int month2 = cal2.get(Calendar.MONTH);  
		int day1 = cal1.get(Calendar.DAY_OF_MONTH);  
		int day2 = cal2.get(Calendar.DAY_OF_MONTH);  
		idade = year2 - year1;	
                //mês menor que o mês passado como parêmtro ou 
                //mês igual e dia menor que o passado como parâmetro
                //idade - 1.					
		if ( (month2 &lt; month1)   
		 || ( (month2 == month1) && (day2 &lt; day1) ) ) {  
		  idade -= 1; 
		  }  
		return idade;
	}

http://www.guj.com.br/posts/listByUser/45355.java

   //Simples assim:
private static final int calculateAge(final Date dtNascimento)
{
	int idade;
	final Calendar calAtual = Calendar.getInstance();
	final Calendar calNascimento = new GregorianCalendar();
	calNascimento.setTime(dtNascimento);
	idade = calAtual.get(Calendar.YEAR) - calNascimento.get(Calendar.YEAR);
	if (calAtual.get(Calendar.DAY_OF_YEAR) > calNascimento.get(Calendar.DAY_OF_YEAR))
		return idade;
	return --idade;
}