소개
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을 사용하여 파일을 서버에 업로드하는 방법?