Popular select de acordo com a seleção anterior

Boa tarde galera do GUJ.
Em várias consultas no fórum para resolver meu problema, infelizmente não consegui encontrar uma mais próxima do meu. E parece que é um problema um tanto quanto comum entre os usuários.
Isso pode ser porque em meio a infinidade de frameworks e tecnologias, é muito difícil encontrar alguém que esteja fazendo com os mesmos recursos que você tenha em mãos.
Mas vamos lá!
O problema é o velho cadastro de Estado e Cidade.
Como posso resolver de acordo com o código que já tenho logo abaixo, para que ao escolher o País, venham somente os Estados a ele relacionados?
Lembrando que o CRUD está funcionando. Só está faltando algumas melhorias como essa citada
CidadeDAO

package br.com.offline.local.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.vraptor.ioc.Component;
import br.com.offline.infra.CriaSession;
import br.com.offline.local.Cidade;

@Component
public class CidadeDAO {
	
	private final Session session;
	
	public CidadeDAO(){
		this.session = CriaSession.getSession();
	}
	
	public void adiciona(Cidade cidade){
		Transaction transaction = session.beginTransaction();
		session.save(cidade);
		transaction.commit();
	}
	
	public void altera(Cidade cidade){
		Transaction transaction = session.beginTransaction();
		session.update(cidade);
		transaction.commit();
	}

	public void remove(Cidade cidade){
		Transaction transaction = session.beginTransaction();
		session.delete(cidade);
		transaction.commit();
	}
	
	public Cidade carrega(Long codigo){
		return (Cidade) this.session.load(Cidade.class, codigo);
	}
	
	@SuppressWarnings("unchecked")
	public List<Cidade> listaCidade(){
		return session.createCriteria(Cidade.class).list();
	}
	
}

CidadeController

package br.com.offline.local.controller;

import java.util.List;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.offline.local.Cidade;
import br.com.offline.local.Estado;
import br.com.offline.local.Pais;
import br.com.offline.local.dao.CidadeDAO;
import br.com.offline.local.dao.EstadoDAO;
import br.com.offline.local.dao.PaisDAO;

@Resource
public class CidadeController {
	
	private final CidadeDAO dao;
	private final Result result;
	private final EstadoDAO estadoDAO;
	private final PaisDAO paisDAO;

	public void novaCidade(){
		List<Pais> pais = paisDAO.listaPais();
		List<Estado> estados = estadoDAO.listaEstado();
			result.include("estados", estados);
			result.include("pais", pais);
	}
	
	public CidadeController(CidadeDAO dao, Result result, PaisDAO paisDAO, EstadoDAO estadoDAO){
		this.dao = dao;
		this.result = result;
		this.paisDAO = paisDAO;
		this.estadoDAO = estadoDAO;
	}
	
	// Métodos dao.
	public void adiciona(Cidade cidade){
		dao.adiciona(cidade);
		result.redirectTo(CidadeController.class).cidadeAdicionada();
	}
	
	public Cidade alteraCidade(Long codigo){
		List<Pais> pais = paisDAO.listaPais();
		List<Estado> estados = estadoDAO.listaEstado();
		result.include("pais", pais);
		result.include("estados", estados);
		return dao.carrega(codigo);
	}
	
	public void altera(Cidade cidade){
		dao.altera(cidade);
		result.redirectTo(this).listaCidade();
	}
	
	public void remove(Long codigo){
		Cidade cidade = dao.carrega(codigo);
		dao.remove(cidade);
		result.redirectTo(this).listaCidade();
	}
	
	public List<Cidade> listaCidade() {
		return dao.listaCidade();
	}

	public String cidadeAdicionada(){
		return "/cidade/cidadeAdicionada.jsp";
	}

}

novaCidade.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<style type="text/css"></style>
</head>
<body>
<div id="corpo">
	<h3>Adicionando uma nova Cidade.</h3>
	<form action="adiciona" method="post" name="novaCidade">
		<fieldset>
			<legend>Adicionar Cidade</legend>
			<input	id="codigo" type="hidden" name="cidade.codigo" />
			<br />
			<label	for="nome">Nome:</label>
			<input	id="nome" type="text" name="cidade.nome" />
			<br />
			<label	for="sigla">Sigla:</label>
			<input	id="sigla" type="text" name="cidade.sigla" maxlength="3" />
			
			<br />
			
 			<label	for="pais"> País:</label>
			<select id="pais" name="pais.codigo" onchange="buscaEstado()">
				<option>Selecione</option>
				<c:forEach items="${pais }" var="pais">
					<option id="pais" value="${pais.codigo }"> ${pais.nome }</option>
				</c:forEach>
			</select>
			
			<br />
			
			<label	for="estado"> Estado:</label>
			<select id="estado" name="cidade.estado.codigo">
				<option id="estado">Selecione</option>
				<c:forEach items="${estados }" var="estado">
					<option id="estado" value="${estado.codigo }"> ${estado.nome }</option>
				</c:forEach>
			</select>
			<br />
			<button type="submit">Enviar</button>
		</fieldset>
	</form>
<br />
</div>
</body>
</html>

Desde já agradeço a todos.

vc pode fazer uma requisição ajax passando o id do pais e fazendo a consulta no banco, trazendo apenas os estados daquele país

Cade o código do buscaestado ?

Como o colega aí de cima definiu, faz uma requisição ajax que retorne uma lista com o que você quer.

Está usando algum framework web ou é servlet mesmo ?

Estou usando o vraptor.
Quanto ao buscaestado é justamente o que estou procurando.
Todos os que eu tentei fazer não deram certo.
Gostaria de receber um modelo exemplo baseado no que tenho de código atualmente.

Amigos do GUJ.
Encontrei um exemplo que é do google https://code.google.com/p/cidades-estados-js mas esse modelo já vem com tudo pronto e como o intuito é estudar o relacionamento entre od select através de dados obtidos do BD, não usei o do goole.
Alguém tem um help aí?