서블릿 양식 데이터


많은 경우 일부 정보는 브라우저에서 웹 서버로, 마지막으로 백그라운드 프로그램으로 전달되어야 합니다. 브라우저는 이 정보를 웹 서버에 전달하기 위해 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 메소드를 사용하여 양식 데이터 읽기

  • 使用 GET 方法读取表单数据

    • 名字:ZARA

    • 姓氏:ALI

    이름

    : ZARA

  • : ALI

  • < /ul>< /td>

양식의 GET 메소드 사용 예
다음은 HTML 양식과 제출 버튼을 사용한 간단한 예입니다. 두 개의 값을 전달합니다. 우리는 입력을 처리하기 위해 동일한 Servlet HelloForm을 사용할 것입니다.

<!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 메소드를 모두 처리할 수 있도록 약간 수정해 보겠습니다. 다음
HelloForm.java
서블릿 프로그램은 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>

이 코드의 결과는 다음과 같은 형식입니다.

读取复选框数据

  • 数学标识:on

  • 物理标识:null

  • 化学标识:on

<🎜><🎜><🎜>아래는 웹 브라우저에서 제공하는 체크박스 입력을 처리하는 CheckBox.java Servlet 프로그램입니다. <🎜>
// 导入必需的 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);
  }
}
<🎜>위 예에서는 다음 결과가 표시됩니다. <🎜>

체크박스 데이터 읽기

  • <🎜><🎜>수학적 플래그: <🎜>on<🎜>
  • <🎜><🎜>물리적 플래그: <🎜>null<🎜>
  • < li><🎜><🎜>화학물질 식별: <🎜>on<🎜>

모든 양식 매개변수 읽기

다음은 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>

이제 위 형식을 사용하여 서블릿을 호출하면 다음과 같은 결과가 생성됩니다.

위 서블릿을 사용하여 텍스트 상자, 라디오 버튼 또는 드롭다운 상자 등과 같은 다른 양식 데이터를 읽을 수 있습니다.