서블릿 양식 데이터
많은 경우 일부 정보는 브라우저에서 웹 서버로, 마지막으로 백그라운드 프로그램으로 전달되어야 합니다. 브라우저는 이 정보를 웹 서버에 전달하기 위해 GET 메서드와 POST 메서드라는 두 가지 방법을 사용합니다.
GET 메소드
GET 메소드는 인코딩된 사용자 정보를 페이지 요청에 보냅니다. 페이지와 인코딩된 정보는 아래와 같이 ? 문자로 구분됩니다.
http://www.test.com/hello?key1=value1&key2=value2
GET 메서드는 브라우저에서 웹 서버로 정보를 전송하는 기본 방법으로 매우 긴 문자열을 생성합니다. 브라우저의 주소 표시줄에 나타납니다. 비밀번호나 기타 중요한 정보를 서버에 전달하는 경우 GET 메서드를 사용하지 마세요. GET 메서드에는 크기 제한이 있습니다. 요청 문자열에는 최대 1024자만 사용할 수 있습니다.
이 정보는 QUERY_STRING 헤더를 사용하여 전달되며 QUERY_STRING 환경 변수를 통해 액세스할 수 있습니다. 서블릿은 이러한 유형의 요청을 처리하기 위해 doGet() 메서드를 사용합니다.
POST 방법
백그라운드 프로그램에 정보를 전송하는 또 다른 보다 안정적인 방법은 POST 방법입니다. POST 메서드는 GET 메서드와 거의 동일한 방식으로 정보를 패키지하지만, 정보를 URL의 ? 문자 뒤에 텍스트 문자열로 보내는 대신 POST 메서드는 정보를 별도의 메시지로 보냅니다. 메시지는 구문 분석하고 사용할 수 있는 표준 출력으로 백그라운드 프로그램에 전달됩니다. 서블릿은 doPost() 메소드를 사용하여 이러한 유형의 요청을 처리합니다.
서블릿을 사용하여 양식 데이터 읽기
서블릿은 양식 데이터를 처리하며 상황에 따라 다양한 방법을 사용하여 자동으로 구문 분석됩니다.
getParameter(): request.getParameter() 메서드를 호출하여 양식 매개변수의 값을 가져올 수 있습니다.
getParameterValues(): 이 메소드는 매개변수가 두 번 이상 나타나고 체크박스와 같이 여러 값을 반환하는 경우 호출됩니다.
getParameterNames(): 현재 요청에 있는 모든 매개변수의 전체 목록을 가져오려면 이 메소드를 호출하세요.
URL을 사용한 GET 메소드의 예
아래는 GET 메소드를 사용하여 HelloForm 프로그램에 두 개의 값을 전달하는 간단한 URL입니다.
http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI
다음은 웹 브라우저 입력을 처리하는 HelloForm.java입니다. 서블릿 프로그램. 전달된 정보에 쉽게 액세스할 수 있는 getParameter() 메소드를 사용하겠습니다.
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloForm */ @WebServlet("/HelloForm") public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "使用 GET 方法读取表单数据"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>名字</b>:" + request.getParameter("first_name") + "\n" + " <li><b>姓氏</b>:" + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body></html>"); } }
환경이 올바르게 설정되었다고 가정하고 다음과 같이 HelloForm.java를 컴파일합니다.
$ javac HelloForm.java
모든 것이 순조롭게 진행되면 위의 컴파일로 HelloForm.class 파일이 생성됩니다. 다음으로, 클래스 파일을 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes에 복사하여 <Tomcat-installation-directory>/webapps/ROOT/WEB에 배치해야 합니다. 다음 항목을 생성합니다. INF/의 web.xml 파일:
<servlet> <servlet-name>HelloForm</servlet-name> <servlet-class>HelloForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloForm</servlet-name> <url-pattern>/HelloForm</url-pattern> </servlet-mapping>
이제 브라우저의 주소 표시줄에 http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI를 입력하고 위 명령을 실행하기 전에 Tomcat 서버가 시작되었는지 확인하세요. 모든 것이 순조롭게 진행되면 다음과 같은 결과를 얻게 됩니다:
GET 메소드를 사용하여 양식 데이터 읽기
|
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <form action="HelloForm" method="GET"> 名字:<input type="text" name="first_name"> <br /> 姓氏:<input type="text" name="last_name" /> <input type="submit" value="提交" /> </form> </body> </html>이 HTML을 hello.htm 파일에 저장하고 <Tomcat-installation-directory>/webapps/ROOT 디렉토리에 저장하세요. 다음은
http://localhost:8080/Hello.htm
을 방문했을 때 위 양식의 실제 출력입니다.성과 이름을 입력한 다음 "제출" 버튼을 클릭하여 컴퓨터에서 결과를 확인하세요. 제공된 입력을 기반으로 이전 인스턴스와 유사한 결과를 생성합니다. 폼의 POST 메소드 인스턴스 사용위 서블릿이 GET 및 POST 메소드를 모두 처리할 수 있도록 약간 수정해 보겠습니다. 다음
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // 扩展 HttpServlet 类 public class HelloForm extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Using GET Method to Read Form Data"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>名字</b>:" + request.getParameter("first_name") + "\n" + " <li><b>姓氏</b>:" + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body></html>"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }이제 위 서블릿을 컴파일 및 배포하고 아래와 같이 테스트를 위해 POST 메서드와 함께 Hello.htm을 사용합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="HelloForm" method="POST">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>
다음은 위 형식의 실제 출력입니다. 이름과 성을 입력하려면 "제출" 버튼을 클릭하여 로컬 컴퓨터에서 출력을 확인하세요. 제공된 입력을 기반으로 이전 인스턴스와 유사한 결과가 생성됩니다. 체크박스 데이터를 서블릿 프로그램에 전달 둘 이상의 옵션을 선택해야 할 경우 체크박스를 사용합니다. 다음은 두 개의 확인란이 있는 양식인 CheckBox.htm HTML 코드 예제입니다. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <form action="CheckBox" method="POST" target="_blank"> <input type="checkbox" name="maths" checked="checked" /> 数学 <input type="checkbox" name="physics" /> 物理 <input type="checkbox" name="chemistry" checked="checked" /> 化学 <input type="submit" value="选择学科" /> </form> </body> </html>이 코드의 결과는 다음과 같은 형식입니다.
读取复选框数据
|
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // 扩展 HttpServlet 类 public class CheckBox extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "读取复选框数据"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>数学标识:</b>: " + request.getParameter("maths") + "\n" + " <li><b>物理标识:</b>: " + request.getParameter("physics") + "\n" + " <li><b>化学标识:</b>: " + request.getParameter("chemistry") + "\n" + "</ul>\n" + "</body></html>"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }<🎜>위 예에서는 다음 결과가 표시됩니다. <🎜>
체크박스 데이터 읽기
|
모든 양식 매개변수 읽기
다음은 HttpServletRequest의 getParameterNames() 메소드를 사용하여 사용 가능한 모든 양식 매개변수를 읽는 일반적인 예입니다. 이 메서드는 지정되지 않은 순서로 매개변수 이름을 포함하는 열거형을 반환합니다.
열거형이 있으면 hasMoreElements() 메서드를 사용하여 중지 시점을 결정하고 nextElement()<를 사용하여 표준 방식으로 열거형을 반복할 수 있습니다. 🎜> 각 매개변수의 이름을 가져오는 방법입니다.
import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ReadParams */ @WebServlet("/ReadParams") public class ReadParams extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ReadParams() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "读取所有的表单数据"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<table width=\"100%\" border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + "<th>参数名称</th><th>参数值</th>\n"+ "</tr>\n"); Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n"); String[] paramValues = request.getParameterValues(paramName); // 读取单个值的数据 if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("<td><i>没有值</i></td>"); else out.println("<td>" + paramValue + "</td>"); } else { // 读取多个值的数据 out.println("<td><ul>"); for(int i=0; i < paramValues.length; i++) { out.println("<li>" + paramValues[i]); } out.println("</ul></td>"); } out.print("</tr>"); } out.println("\n</table>\n</body></html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }이제 아래 형식을 통해 위의 서블릿을 시도해 보세요.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <form action="ReadParams" method="POST" target="_blank"> <input type="checkbox" name="maths" checked="checked" /> 数学 <input type="checkbox" name="physics" /> 物理 <input type="checkbox" name="chemistry" checked="checked" /> 化学 <input type="submit" value="选择学科" /> </form> </body> </html>이제 위 형식을 사용하여 서블릿을 호출하면 다음과 같은 결과가 생성됩니다.
위 서블릿을 사용하여 텍스트 상자, 라디오 버튼 또는 드롭다운 상자 등과 같은 다른 양식 데이터를 읽을 수 있습니다.