Solicitar atributos não disponíveis na página jsp ao usar o sendRedirect de um servlet

Eu sou novo em jsp e servlet. Meu cenário é o seguinte

Eu tenho uma página jsp que tem um formulário nela. com dois campos. O snipet de código da página jsp é o seguinte.

Arquivo MyFirstJSP.jsp

<body>
<h1> This is my first jsp and servlet project</h1>
<%
//System.out.println(request.getAttribute("fname"));

if(request.getAttribute("fname")!=null){
    System.out.println(request.getAttribute("fname"));
}else{
    System.out.println("No request ");
}
%>
<form action="MyFirstServlet" method="get">
First Name<input type="text" name="fname" value= ${fname}><br>
Last Name<input type="text" name="lname" value= ${lname}>
<input type="submit" value="Send">
</form>
</body>

Quando envio este formulário, o MyFirstServlet é chamado, que verifica o primeiro nome digitado pelo usuário. Se o primeiro nome for igual a "abc", o servlet define o atributo para solicitar o objeto e enviá-lo para a página jsp chamada, ou seja, acima da página. Que obterá o valor do objeto de solicitação e o preencherá no respectivo campo do formulário. Eu tenho a linguagem Java Expression também para o mesmo efeito.

Aqui está o meu snipet de código do arquivo de servlet MyFirstServlet.java

/**
 * Servlet implementation class MyFirstServlet
 */
public class MyFirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public MyFirstServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       // TODO Auto-generated method stub
    String firstname=request.getParameter("fname");
    if(firstname.equalsIgnoreCase("abc")){
        System.out.println("Setting attributes");
        request.setAttribute("fname",firstname);
        request.setAttribute("lname",request.getParameter("lname"));
        response.sendRedirect("MyFirstJSP.jsp");
    }else{
        System.out.Println("No problem");
    }
}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter p=response.getWriter();
    p.println("Success!");
    doGet(request,response);
}
}

Mas quando executo o código, o servlet redireciona para a página jsp, mas não preenche os campos do formulário com os respectivos valores. Quanto a encontrar a causa, adicionei o bloco if-else-block para saber a causa e descobri que o atributo de objetos request não está disponível aqui.

Se eu usar o dispatcher de solicitação nesse caso, os valores serão disponibilizados e o formulário será preenchido com os valores, mas o URL na barra de endereço não mudará e sempre mostrará o URL para o servlet.

Então minha consulta é

** 1) Por que o objeto request não está disponível para a página jsp usando sendRedirect.

2) Há alguma outra forma de mostrar meu formulário na página jsp preenchida com os valores inseridos pelo usuário se o servlet for redirecionado para o jsp de chamada para que o usuário não precise reinserir os dados no formulário. **

Por favor me guie amigos neste problema Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion