소개
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);
}
}
}
User
DB에서 발견 되면 (예 : 사용자 이름과 비밀번호가 유효 함) 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을 사용하여 파일을 서버에 업로드하는 방법?