English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

javaweb에서 요청과 응답을 구현하는 방법

 먼저 프로세스도시도를 보겠습니다:

 서버가 요청을 처리하는 프로세스:

  (1서버는 각 요청을 받을 때마다 새로운 스레드를 할당합니다.
  (2서버는 클라이언트의 요청 데이터를 request 객체에 포장하며, request는 요청 데이터의载体입니다!
  (3서버는 또한 response 객체를 생성하며, 이 객체는 클라이언트와 연결되어 있으며, 클라이언트에게 응답을 보내는 데 사용됩니다.
 

 프로세스도시图中可以看出,JavaWeb의 요청과 응답에서 가장 중요한 두 가지 매개변수는 request와 response로, 이 두 매개변수는 Servlet의 service() 메서드에서 사용됩니다.

1、response 개념:

         response는 Servlet.service 메서드의 하나의 파라미터로서, javax.servlet.http.HttpServletResponse 타입입니다. 클라이언트가 각 요청을 보낼 때마다 서버는 response 객체를 생성하여 Servlet.service() 메서드에 전달합니다. response 객체는 클라이언트에 응답하기 위해 사용되며, 이는 service() 메서드에서 response 객체를 사용하여 클라이언트에 응답할 수 있다는 것을 의미합니다.

response 객체의 기능은 다음과 같은 네 가지로 나뉩니다:

(1)응답 헤더 정보 설정

(2)상태 코드 전송

(3)응답 본문 설정

(4)리디렉션 

2、응답 본문

response는 응답 객체로서, 클라이언트에 응답 본문(응답 본문)을 출력할 수 있습니다. response는 총 두 개의 응답 스트림 객체를 제공합니다:

(1)PrintWriter out = response.getWriter():문자 스트림을 가져옵니다;

(2)ServletOutputStream out = response.getOutputStream():바이트 스트림을 가져옵니다; 

물론, 응답 본문 내용이 문자인 경우 response.getWriter()를 사용하며, 응답 내용이 바이트인 경우 예를 들어 다운로드 시 response.getOutputStream()를 사용할 수 있습니다.

주의، 하나의 요청에서는 이 두 스트림을 동시에 사용할 수 없습니다! 즉, repsonse.getWriter()를 사용하거나 response.getOutputStream()를 사용하면 됩니다. 두 스트림을 동시에 사용하면 illegalStateException 예외가 발생합니다.

3、응답 헤더 정보 설정

response 객체의 setHeader() 메서드를 사용하여 응답 헤더를 설정할 수 있습니다! 이 메서드로 설정된 응답 헤더는 최종적으로 클라이언트 브라우저에 전송됩니다!

(1)response.setHeader("content-type”, “text/html;charset=utf-8)": content 설정-type 응답 헤더의 역할은 브라우저에 응답 내용이 html 타입이며 인코딩이 utf로 알려주는 것입니다-8。또한 동시에 response의 문자 스트림 인코딩을 utf로 설정합니다-8,즉 response.setCharaceterEncoding("utf-8”);

(2)response.setHeader("Refresh","5; URL=http://www.baidu.com":5초 후 자동으로 백도우 메인 페이지로 이동합니다.

4상태 코드 및 다른 메서드를 설정합니다.

(1)response.setContentType("text/html;charset=utf-8”):response.setHeader(“content-type”, “text/html;charset=utf-8”);

(2)response.setCharacterEncoding(“utf-8”): 문자 응답 스트림의 문자编码을 utf로 설정합니다-8;

(3)response.setStatus(200):상태 코드를 설정합니다;

(4)response.sendError(404“자원이 존재하지 않습니다”)이 발생할 때, Tomcat는 고정된 오류 페이지로 이동하지만 오류 메시지를 표시할 수 있습니다.

5리디렉션(*****重点*****)

5.1 리디렉션(두 번째 요청)이 무엇인가요?

http:에 접근할 때,//www.sun.com에 접근할 때, 브라우저 주소 표시줄의 URL이 http:로 바뀝니다.//www.oracle.com/us/sun/index.htm이 되어 리디렉션됩니다. 리디렉션은 서버가 브라우저에 다른 주소를 방문하도록 통지하는 것으로, 다시 한 번 요청을 발생시킵니다.

 5.2 리디렉션을 완료하는 방법은 무엇인가요?

답: 리디렉션의 상태 코드는302우선 response 객체를 사용하여 브라우저에 전송합니다302상태 코드를 설정한 후, Location을 설정하여 사용할 수 있는 URL을 제공하고, 브라우저가 새로운 URL을 방문하여 리디렉션을 실현합니다.

예제:

public class AServlet extends HttpServlet { 
  public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
    response.setStatus(302);  
    response.setHeader("Location", "http://www.baidu.com");  
  } 
} 

위 코드의 역할은: AServlet에 접근할 때, 브라우저에 베이도우 홈페이지로 리디렉션을 통지합니다. 클라이언트 브라우저는 응답 코드가302그 후, 서버가 리디렉션을 시키는지 알 수 있어서 즉시 응답 헤더 Location을 가져와 두 번째 요청을 발생시킵니다.

또한 빠른 리디렉션 방법이 있습니다.response.sendRedirect() 메서드를 사용하면 됩니다. 예를 들어 위의 예제에서 두 줄은 response.sendRedirect("http://www.baidu.com)으로 대체.

request—앞서 클라이언트의 모든 요청 데이터를 포장한 것 

1、request 개요

request는 Servlet.service() 메서드의 파라미터로, javax.servlet.http.HttpServletRequest 타입입니다. 클라이언트가 각 요청을 발생시키면 서버는 request 객체를 생성하고, 요청 데이터를 request에 포장한 후 Servlet.service() 메서드를 호출할 때 service() 메서드에 전달합니다. 이는 service() 메서드에서 request 객체를 통해 요청 데이터를 가져올 수 있다는 것을 의미합니다。

그림과 같이 보입니다:


request의 기능은 다음과 같이 분류될 수 있습니다:

(1)요청 헤더 데이터를 포장합니다;

(2)요청 본문 데이터를 포장합니다. GET 요청이면 본문이 없습니다;

(3)request는 도메인 객체로, Map으로 사용하여 데이터를 추가 및 가져올 수 있습니다;

(4)request는 요청 전환 및 요청 포함 기능을 제공합니다。

2、request 도메인 메서드

request는 도메인 객체입니다! JavaWeb에서 총 네 가지 도메인 객체가 있습니다.ServletContext는 도메인 객체로, 전체 애플리케이션에서 단 한 개의 ServletContext 객체가 생성됩니다.request는 하나의 요청에서 데이터를 공유할 수 있습니다;

한 번의 요청은 request 객체를 생성합니다. 한 번의 요청에서 여러 Servlet을 경험하면 여러 Servlet이 request를 통해 데이터를 공유할 수 있습니다. 현재 한 번의 요청에서 몇 개의 Servlet을 경험할지는 아직 알지 못합니다;

아래는 request의 도메인 메서드입니다:

(1)void setAttribute(String name, Object value):객체를 저장하는 데 사용됩니다. 도메인 속성 저장으로도 불릴 수 있습니다. 예를 들어: servletContext.setAttribute(“xxx”, “XXX”)에서 request에 도메인 속성을 저장했습니다. 도메인 속성 이름은 xxx이며, 도메인 속성의 값은 XXX입니다. 주의하세요, 이 메서드를 여러 번 호출하면 같은 name를 사용하여 이전 값이 덮어씌우게 됩니다. 이 특성은 Map과 동일합니다;

(2)Object getAttribute(String name):request에서 데이터를 가져오는 데 사용됩니다. 현재 가져오기 전에 먼저 저장해야 합니다. 예를 들어: String value = (String)request.getAttribute(“xxx”);, xxx 이름의 도메인 속성을 가져옵니다;

(3)void removeAttribute(String name):request에서 도메인 속성을 제거하는 데 사용됩니다. name 매개변수로 지정된 도메인 속성이 존재하지 않으면, 이 메서드는 아무것도 하지 않습니다;

(4)Enumeration getAttributeNames():获取所有域属性的名称;

3、request传递参数

最为常见的客户端传递参数方式有两种:

(1)浏览器地址栏直接输入:一定是GET请求;

(2)超链接:一定是GET请求;

(3)表单:可以是GET,也可以是POST,这取决于<form>的method属性值;

GET请求和POST请求的区别:

(1)GET请求:

请求参数会在浏览器的地址栏中显示,所以不安全;

请求参数长度限制长度在1K之内;

GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

(2)POST请求:

请求参数不会显示浏览器的地址栏,相对安全;

请求参数长度没有限制;

4、请求转发和请求包含(*****重点*****)

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet"); 使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径

请求转发:rd.forward(request,response);
请求包含:rd.include(request,response);

有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
    >一个请求跨多个Servlet,需要使用转发和包含。
 >请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)          即当前Servlet设置的相应头有效,相应体无效。
    >请求包含:由两个Servlet共同未完成响应体!(都留)                                                                    都有效。     
    >无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!  

요청 전환과 요청 포함 비교:

(1)AServlet에서 BServlet로 요청 전환을 하면, AServlet에서 응답 본문을 출력할 수 없습니다. 즉, response.getWriter()와 response.getOutputStream()를 클라이언트로 출력할 수 없습니다. 이 작업은 BServlet이 완료해야 합니다. 요청 포함을 사용하면 이 제한이 없습니다;

(2)요청 전환은 응답 본문을 출력할 수 없지만, 응답 헤더를 설정할 수 있습니다. 예를 들어: response.setContentType(”text/html;charset=utf-8”);

(3)요청 포함은 대부분 JSP 페이지에서 사용되며, 여러 페이지의 통합을 완료합니다;

(4)요청 전환은 대부분 Servlet에서 사용되며, 전환 목표는 대부분 JSP 페이지입니다;

그림과 같이 보입니다:


요청 전환과 재지정 비교

(1)요청 전환은 하나의 요청이며, 재지정은 두 개의 요청입니다;

(2)요청 전환 후 브라우저 주소 탐색기에는 변화가 없지만, 재지정은 변화가 있습니다. 이는 재지정이 두 개의 요청이기 때문입니다;

(3)요청 전환의 목표는 이 애플리케이션 내의 자원일 수 있으며, 재지정의 목표는 다른 애플리케이션일 수 있습니다;

(4)요청 전환의 AServlet과 BServlet에 대한 요청 메서드는 동일합니다. 즉, 모두 GET이거나 모두 POST입니다. 요청 전환은 하나의 요청입니다;

(5)재지정의 두 번째 요청은 반드시 GET입니다;

 이것이 이 문서의 전체 내용입니다. 많은 도움이 되길 바라며, 모두가呐喊 강의를 많이 지지해 주시길 바랍니다.

성명서:이 문서의 내용은 인터넷에서 가져온 것으로, 저작권자는 모두가 다음과 같습니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공적인 편집을 거치지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반 내용이 있음을 발견하면 이메일을 보내 주시기 바랍니다.: notice#oldtoolbag.com(보내는 이메일에서 #을 @으로 변경하십시오. 신고하고 관련 증거를 제공하시면, 해당 내용이 실제로 위반된 경우, 이 사이트는 즉시 해당 내용을 삭제합니다.)

좋아하는 것