2012-09-10 3 views
4

jsp와 servlet을 처음 사용합니다. 내 시나리오는 다음과 같습니다.servlet에서 sendRedirect를 사용할 때 jsp 페이지에서 요청 속성을 사용할 수 없음

여기에 양식이있는 JSP 페이지가 있습니다. 두 개의 필드가 있습니다. jsp 페이지의 코드 스 니펫은 다음과 같습니다.

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> 

나는 사용자가 입력 한 이름을 확인하는 MyFirstServlet가 호출이 양식을 제출

. 첫 번째 이름이 "abc"와 같으면 서블릿은 객체를 요청하도록 속성을 설정하고이를 호출 JSP 페이지 즉 위 페이지로 재전송합니다. 요청 개체로부터 값을 가져 와서 양식의 해당 필드에 채 웁니다. 동일한 효과를 내기 위해 Java 표현식 언어도 사용하고 있습니다.

다음은 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); 
} 
} 

의 내 코드 snipet입니다하지만이 코드를 실행하면 서블릿은 JSP 페이지로 리디렉션하지만 각각의 값으로 양식 필드를 채 웁니다. 원인을 알아 내기 위해 원인을 알기 위해 if-else-block을 추가했으며 여기서는 요청 개체 속성을 사용할 수 없다는 것을 알게되었습니다.

이 경우 요청 발송자를 사용하면 값을 사용할 수 있으며 양식은 값으로 채워지지만 주소 표시 줄의 URL은 변경되지 않으며 항상 서블릿에 대한 URL을 표시합니다.

그래서 내 질문은 요청 객체 대해 sendRedirect를 사용하여 JSP 페이지에 사용할 수없는 이유는

** 1).

2) 사용자가 입력 한 값으로 채워져 JSP 페이지 내 폼을 표시하는 다른 방법 THRE되어있는 경우 호출 JSP와 서블릿 sendredirects 그래서이 사용자는 양식에 데이터를 다시 입력 할 필요가 없다. **

이 문제로 친구를 안내하십시오. 감사합니다! 요청 속성이 소실 (위치 헤더 1 체크 아웃)는 클라이언트 측 조치입니다 리디렉션으로

+0

BalusC의 답변 읽기 : http://stackoverflow.com/questions/2047122/requestdispatcher-interface-vs-sendredirect –

답변

16

당신은, 서버 측의 JSP 페이지 앞으로 해야합니다.

response.sendRedirect("MyFirstJSP.jsp"); 

request.getRequestDispatcher("MyFirstJSP.jsp").forward(request, response); 

편집 교체 : 죄송합니다, 나는이 경우 요청 디스패처를 사용하는 경우이 부분

를 건너 뛴 다음 값은 사용할 수 얻고 양식은 값으로 채워지지만 주소 표시 줄의 URL은 변경되지 않으며 항상 서블릿에 대한 URL을 표시합니다.구현

  • :

그럼에도 불구하고, 당신은 (내가 이미 위에서 언급 한 바와 같이 클라이언트 측 동작 것) 나는 다음을 수행 좋을 것

을 리디렉션 할 때 요청이 JSP 속성을 전달할 수 없습니다

  • 제출 된 양식 데이터를 처리하기위한 doPost 구현
  • 제출할 HTML 양식에서 GET 대신 POST를 사용하십시오. 형태 모두에서
  • ,의 doGet과의 doPost는 * .jsp로 페이지를 렌더링하는 앞으로을 를 사용합니다.

    GET/MyFirstServlet -> 앞으로 MyFirstJSP.jsp

    POST/MyFirstServlet -> 앞으로 MyFirstJSP.jsp

    이 가장 일반적으로 사용되는 깨끗한 방법입니다.

    편집 2 : 간단한 예

    SimpleFormServlet.java

    public class SimpleFormServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    
    private static final String VIEW_NAME = "/WEB-INF/jsp/simpleForm.jsp"; 
    private static final String MODEL_NAME = "form"; 
    
    public SimpleFormServlet() { 
        super(); 
    } 
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        request.setAttribute(MODEL_NAME, new SimpleForm()); 
        request.getRequestDispatcher(VIEW_NAME).forward(request, response); 
    } 
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    
        final SimpleForm form = map(request); 
    
        if(form.getfName().equalsIgnoreCase("abc")){ 
         request.setAttribute(MODEL_NAME, form); 
         // put additional attributes on the request 
         // e.g. validation errors,... 
         request.getRequestDispatcher(VIEW_NAME).forward(request, response); 
        }else{ 
         System.out.println("No problem"); 
         response.sendRedirect("/SuccessServlet"); 
        } 
    } 
    
    private SimpleForm map(final HttpServletRequest request) { 
        SimpleForm form = new SimpleForm(); 
        form.setfName(request.getParameter("fName")); 
        form.setlName(request.getParameter("lName")); 
        return form; 
    } 
    
    public static class SimpleForm implements Serializable { 
        private static final long serialVersionUID = -2756917543012439177L; 
    
        private String fName; 
        private String lName; 
    
        public String getfName() { 
         return fName; 
        } 
        public void setfName(String fName) { 
         this.fName = fName; 
        } 
        public String getlName() { 
         return lName; 
        } 
        public void setlName(String lName) { 
         this.lName = lName; 
        } 
    
    } 
    
    } 
    

    /WEB-INF/jsp/simpleForm.jsp

    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    </head> 
    <body> 
    
    <form method="POST"> 
        First Name<input type="text" name="fName" value="${form.fName}"><br> 
        Last Name<input type="text" name="lName" value="${form.lName}"> 
        <input type="submit" value="Send"> 
    </form> 
    
    </body> 
    </html> 
    
    1. GET/SimpleFormServlet
    2. 의 doGet () 양식 모델 (SimpleForm)을 준비하고 요청 특성 na로 추가합니다. 메드 '형태'
    3. simpleForm.jsp
    4. 액세스 앞으로
    5. 모델 값과 양식을 미리 기입 : $ {form.fName을} 및 $ {form.lName}는
    6. 브라우저는 여전히/SimpleFormServlet (우리를 보여줍니다 그것은 ;-)) 같은
    7. POST 상대적으로/SimpleFormSerlvet 폼 (당신이()는 SimpleForm에 요청 ​​매개 변수를 매핑)를 명시 적으로
    8. 의 doPost을 폼 요소의 action 속성을 설정할 필요가 없습니다.
    9. 처리 요청 및
    10. (예를 들어/SuccessServlet을) 당신이 중 하나를 앞으로 (검증이 실패했을 경우 등) simpleForm.jsp 또는 또 다른 서블릿를 리디렉션 할 수 있습니다 (검증) 다음
    11. 을하고 싶은 건 뭐든지 할
    +0

    감사합니다! 귀하의 회신에 대한 친구하지만 내 관심사 중 하나는 요청 디스패처를 사용하면 변경되지 않는 브라우저의 주소 표시 줄에있는 URL입니다. 내 요구 사항은 jsp 페이지 url로 변경해야 브라우저의 주소 표시 줄에있는 URL뿐만 아니라 양식을 채우는 JSP 페이지에 값을 사용할 수 있어야한다는 것입니다. –

    +0

    @ Param-Ganak : 그런 다음 세션 범위 –

    +1

    @ Param-Ganak을 사용하십시오. 죄송합니다. 내 게시물 (및 pls, 양식 속성 및 매개 변수와 같은 것들에 대해 세션 범위를 사용하지 마십시오.)을 편집했습니다. –

    4

    나는 대답하기에는 너무 늦었다 고 알고 있지만 이것은 누군가에게 도움이 될 것입니다. 리디렉션은 클라이언트 측 작업이므로 getAttribute 값을 사용할 수는 없지만 URL 재 작성 개념을 사용하여 해결할 수 있습니다.

    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"); 
    
        response.sendRedirect("MyFirstJSP.jsp?fname="+firstname+"&lname="+request.getParameter("lname")+""); 
    } 
    else{ 
        System.out.Println("No problem"); 
        } 
    } 
    

    MyFirstJSP.jsp 다음의 문자열 값을 추출 request.getParameter()를 사용한다.