서블릿의 doGet 및 doPost


105

서블릿에 정보를 보내는 HTML 페이지를 개발했습니다. 서블릿에서 나는 방법을 사용하고 doGet()과를 doPost():

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException  {

     String id = req.getParameter("realname");
     String password = req.getParameter("mypassword");
}

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

    String id = req.getParameter("realname");
    String password = req.getParameter("mypassword");
}

Servlet을 호출하는 html 페이지 코드에서 다음과 같습니다.

<form action="identification" method="post" enctype="multipart/form-data">
    User Name: <input type="text" name="realname">
    Password: <input type="password" name="mypassword">
    <input type="submit" value="Identification">
</form> 

method = "get"Servlet에서 사용하면 id와 password의 값을 얻지 method = "post"만을 사용 하면 id와 password가로 설정됩니다 null. 이 경우 값을 얻지 못하는 이유는 무엇입니까?

내가 알고 싶은 또 다른 것은 서블릿에 의해 생성되거나 검증 된 데이터를 사용하는 방법입니다. 예를 들어, 위에 표시된 서블릿이 사용자를 인증하는 경우 HTML 페이지에 사용자 ID를 인쇄하고 싶습니다. 응답으로 'id'문자열을 보내고 HTML 페이지에서이 정보를 사용할 수 있어야합니다. 가능할까요?


html에서 post 메소드를 어떻게 사용하고 있습니까?
Igor Artamonov

또한 매개 변수 이름에 대한 이상한 루프가 필요한 이유는 무엇입니까?
Igor Artamonov

1
`enctype = multipart / form-data`를 제거해 보셨습니까? 나는 그것이 당신의 문제라고 생각합니다.
Jack Leow

그거였다. 이것이 있으면 왜 게시가 작동하지 않습니까? 당신의 도움을 주셔서 감사합니다!
dedalo

답변:


197

소개

HTTP GET 요청doGet() 을 가로 채고 싶을 때 사용해야 합니다 . HTTP POST 요청doPost() 을 가로 채고 싶을 때 사용해야 합니다 . 그게 다야. 하나를 다른 것으로 또는 그 반대로 이식하지 마십시오 (예 : Netbeans의 불행한 자동 생성 processRequest()방법). 이것은 전혀 의미가 없습니다.

가져 오기

일반적으로 HTTP GET 요청은 멱등 적 입니다. 즉, 요청을 실행할 때마다 정확히 동일한 결과를 얻습니다 (승인 / 인증 및 페이지의 시간에 민감한 특성 (검색 결과, 마지막 뉴스 등)을 고려하지 않음). 북마크 가능한 요청에 대해 이야기 할 수 있습니다. 링크 클릭, 북마크 클릭, 브라우저 주소 표시 줄에 원시 URL 입력 등은 모두 HTTP GET 요청을 실행합니다. 서블릿이 문제의 URL을 수신하는 경우 해당 doGet()메서드가 호출됩니다. 일반적으로 요청 을 사전 처리 하는 데 사용됩니다 . 즉, 테이블에 표시 할 데이터를 수집하는 등 JSP에서 HTML 출력을 표시하기 전에 몇 가지 비즈니스 작업을 수행합니다.

@WebServlet("/products")
public class ProductsServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Product> products = productService.list();
        request.setAttribute("products", products); // Will be available as ${products} in JSP
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    }

}
<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td><a href="product?id=${product.id}">detail</a></td>
        </tr>
    </c:forEach>
</table>

또한 위의 마지막 열에 표시된 세부 정보보기 / 편집 링크는 일반적으로 멱 등성입니다.

@WebServlet("/product")
public class ProductServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Product product = productService.find(request.getParameter("id"));
        request.setAttribute("product", product); // Will be available as ${product} in JSP
        request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response);
    }

}
<dl>
    <dt>ID</dt>
    <dd>${product.id}</dd>
    <dt>Name</dt>
    <dd>${product.name}</dd>
    <dt>Description</dt>
    <dd>${product.description}</dd>
    <dt>Price</dt>
    <dd>${product.price}</dd>
    <dt>Image</dt>
    <dd><img src="productImage?id=${product.id}" /></dd>
</dl>

게시하다

HTTP POST 요청은 멱 등성이 아닙니다. 최종 사용자가 리디렉션을 수행하지 않은 URL에 대한 POST 양식을 미리 제출 한 경우 URL을 북마크 할 수있는 것은 아닙니다. 제출 된 양식 데이터는 URL에 반영되지 않습니다. URL을 새 브라우저 창 / 탭에 복사하여 붙여 넣으면 양식 제출 후와 정확히 동일한 결과가 생성되지 않을 수 있습니다. 이러한 URL은 북마크 할 수 없습니다. Servlet이 문제의 URL을 수신하는 경우 해당 URL doPost()이 호출됩니다. 일반적으로 요청 을 후 처리 하는 데 사용됩니다 . 즉, 제출 된 HTML 양식에서 데이터를 수집하고이를 사용하여 비즈니스 작업 (변환, 유효성 검사, DB에 저장 등)을 수행합니다. 마지막으로 결과는 일반적으로 전달 된 JSP 페이지에서 HTML로 표시됩니다.

<form action="login" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="login">
    <span class="error">${error}</span>
</form>

...이 서블릿과 함께 사용할 수 있습니다.

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);

        if (user != null) {
            request.getSession().setAttribute("user", user);
            response.sendRedirect("home");
        }
        else {
            request.setAttribute("error", "Unknown user, please try again");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }

}

UserDB에서 발견 되면 (예 : 사용자 이름과 비밀번호가 유효 함) User세션 범위 (예 : "로그인 됨")에 배치되고 서블릿이 일부 기본 페이지로 리디렉션됩니다 (이 예는로 이동 http://example.com/contextname/home). 오류 메시지를 설정하고 요청을 동일한 JSP 페이지로 다시 전달하여 메시지가에서 표시되도록 ${error}합니다.

당신이 할 수있는 경우도 필요 "숨기기" login.jsp/WEB-INF/login.jsp따라서 사용자가 서블릿에 액세스 만 할 수있다. 이렇게하면 URL이 깨끗하게 유지 http://example.com/contextname/login됩니다. 다음 doGet()과 같이 서블릿 에 a 를 추가하기 만하면됩니다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}

(그리고 doPost()그에 따라 같은 줄을 업데이트하십시오 )

그건 그냥 장난과 어둠 속에서 촬영,하지만 당신이 게시 코드는 사용으로 (잘 보이지 않는 경우 나는 확실하지 않다 말했다 compareTo()대신 equals()하고 parameternames 파고 대신에 단지 사용 getParameter()하고, id그리고 password에 보인다 서블릿 인스턴스 변수로 선언되어야 합니다 . 이는 threadsafe 가 아닙니다 ). 따라서 Oracle 자습서 ( "Trails Covering the Basics"장 확인)를 사용하여 기본 Java SE API에 대해 조금 더 배우고 해당 자습서 를 사용하여 JSP / Servlet을 올바른 방법으로 사용 하는 방법 을 배우는 것이 좋습니다 .

또한보십시오:


업데이트 : 질문의 업데이트에 따라 (매우 중요합니다. 원래 질문의 일부를 제거해서는 안됩니다. 이것은 답을 쓸모 없게 만들 것입니다. 오히려 새 블록에 정보를 추가 합니다), 그것은 당신이 불필요하게 양식의 인코딩 유형을 multipart/form-data. 이렇게하면 application/x-www-form-urlencoded요청 매개 변수를 쿼리 문자열 (예 :)로 보내는 (기본값)과 다른 구성으로 요청 매개 변수를 보냅니다 name1=value1&name2=value2&name3=value3. 당신 multipart/form-data<input type="file">문자가 아닌 데이터 (이진 데이터) 일 수있는 파일을 업로드하기위한 양식의 요소. 이것은 귀하의 경우가 아니므로 제거하면 예상대로 작동합니다. 파일을 업로드해야하는 경우 인코딩 유형을 설정하고 요청 본문을 직접 구문 분석해야합니다. 일반적으로 Apache Commons FileUpload 를 사용 하지만 이미 새로운 Servlet 3.0 API 를 사용하고 있다면 HttpServletRequest#getPart(). 구체적인 예는이 답변을 참조하십시오 : JSP / Servlet을 사용하여 파일을 서버에 업로드하는 방법?


2

GET과 POST는 모두 브라우저에서 서버에서 단일 리소스를 요청하는 데 사용됩니다. 각 리소스에는 별도의 GET 또는 POST 요청이 필요합니다.

  1. GET 메서드는 브라우저가 서버에서 정보를 검색하는 데 가장 일반적으로 사용하는 방식이며 기본 방식입니다. GET 메소드를 사용할 때 요청 본문 인 요청 패킷의 세 번째 섹션은 비어 있습니다.

GET 메소드는 두 가지 방법 중 하나로 사용됩니다. 메소드가 지정되지 않은 경우 즉, 사용자 또는 브라우저가 HTML 페이지, 이미지 등과 같은 간단한 리소스를 요청하는 경우입니다. 양식을 제출하고 메소드를 선택하는 경우 = HTML 태그를 가져옵니다. GET 메소드를 HTML 양식과 함께 사용하는 경우 양식을 통해 수집 된 데이터는 "?"를 추가하여 서버로 전송됩니다. URL 끝에 "&"로 구분 된 모든 name = value 쌍 (html 양식 필드의 이름 및 해당 필드에 입력 된 값)을 추가합니다. 예 : GET /sultans/shop//form1.jsp?name= Sam % 20Sultan & iceCream = vanilla HTTP / 1.0 선택적 헤더 선택적 헤더 << 빈 줄 >>>

name = value 형식 데이터는 QUERY_STRING이라는 환경 변수에 저장됩니다. 이 변수는 처리 프로그램 (예 : JSP, Java 서블릿, PHP 등)으로 전송됩니다.

  1. POST 메소드는 HTML 양식을 작성하고 태그의 일부로 method = POST를 요청할 때 사용됩니다. POST 메서드를 사용하면 클라이언트가 요청의 요청 본문 섹션에있는 서버로 양식 데이터를 보낼 수 있습니다 (앞서 설명). 데이터는 표준 입력을 통해 프로그램으로 전송된다는 점을 제외하고는 GET 메소드와 유사한 형식으로 인코딩되고 형식화됩니다.

예 : POST /sultans/shop//form1.jsp HTTP / 1.0 선택적 헤더 선택적 헤더 << 빈 줄 >>> name = Sam % 20Sultan & iceCream = vanilla

post 메소드를 사용할 때 QUERY_STRING 환경 변수는 비어 있습니다. GET과 POST의 장점 / 단점

GET 방법의 장점 : 약간 더 빠른 매개 변수는 양식을 통해 입력하거나 URL 페이지를 매개 변수로 북마크 할 수있는 후에 추가하여 입력 할 수 있습니다.

GET 방법의 단점 : 4K 분량의 데이터 만 보낼 수 있습니다. (텍스트 영역 필드를 사용할 때 사용해서는 안됩니다) 매개 변수는 URL 끝에 표시됩니다.

POST 방법의 장점 : URL 끝에 매개 변수가 표시되지 않습니다. (민감한 데이터에 사용) 4K 이상의 데이터를 서버로 전송할 수 있습니다.

POST 방법의 단점 : 데이터로 북마크 할 수 없음


0

서블릿 컨테이너의 HttpServlet.service () 메서드 구현은 필요에 따라 자동으로 doGet () 또는 doPost ()로 전달되므로 서비스 메서드를 재정의 할 필요가 없습니다.


0

게시가 아닌 get을 통해 데이터를 전달하는 것일 수 있습니까?

<form method="get" ..>
..
</form>

0

<form action="identification" >HTML 양식에 대해 수행 하는 경우 기본적으로 'Get'을 사용하여 데이터가 전달되므로 Java 서블릿 코드에서 doGet 함수를 사용하여이를 포착 할 수 있습니다. 이렇게하면 데이터가 HTML 헤더 아래로 전달되므로 제출시 URL에 표시됩니다. 반면에 HTML 본문에 데이터를 전달하려면 Post :를 사용 <form action="identification" method="post">하고 doPost 함수에서이 데이터를 포착하십시오. 즉, 데이터는 html 헤더가 아닌 html 본문 아래로 전달되며 양식을 제출 한 후에는 URL에 데이터가 표시되지 않습니다.

내 HTML의 예 :

<body>  
<form action="StartProcessUrl" method="post">
.....
.....

내 자바 서블릿 코드의 예 :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter out = response.getWriter();
         String surname = request.getParameter("txtSurname");
         String firstname = request.getParameter("txtForename");
         String rqNo = request.getParameter("txtRQ6");
         String nhsNo = request.getParameter("txtNHSNo");

         String attachment1 = request.getParameter("base64textarea1");
         String attachment2 = request.getParameter("base64textarea2");

.........
.........
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.