서블릿에 정보를 보내는 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 페이지에서이 정보를 사용할 수 있어야합니다. 가능할까요?
답변
소개
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을 올바른 방법으로 사용 하는 방법 을 배우는 것이 좋습니다 .
또한보십시오:
- 서블릿 위키 페이지
- Java EE 웹 개발, 어디서 시작해야하며 어떤 기술이 필요합니까?
- 서블릿이 “HTTP 상태 404 요청 된 리소스 (/ servlet)를 사용할 수 없습니다.”를 반환합니다.
- MVC 및 DAO 패턴을 사용하여 JSP 페이지의 HTML에 JDBC 결과 집합 표시
업데이트 : 질문의 업데이트에 따라 (매우 중요합니다. 원래 질문의 일부를 제거해서는 안됩니다. 이것은 답을 쓸모 없게 만들 것입니다. 오히려 새 블록에 정보를 추가 합니다), 그것은 당신이 불필요하게 양식의 인코딩 유형을 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을 사용하여 파일을 서버에 업로드하는 방법?
답변
GET과 POST는 모두 브라우저에서 서버에서 단일 리소스를 요청하는 데 사용됩니다. 각 리소스에는 별도의 GET 또는 POST 요청이 필요합니다.
- 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 등)으로 전송됩니다.
- 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 방법의 단점 : 데이터로 북마크 할 수 없음
답변
서블릿 컨테이너의 HttpServlet.service () 메서드 구현은 필요에 따라 자동으로 doGet () 또는 doPost ()로 전달되므로 서비스 메서드를 재정의 할 필요가 없습니다.
답변
게시가 아닌 get을 통해 데이터를 전달하는 것일 수 있습니까?
<form method="get" ..>
..
</form>
답변
<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");
.........
.........