Servlet (3)

Interfaces, clases y métodos de uso común en Servlet 1.
Interfaz


Servlet 2. Interfaz ServletConfig 3. Interfaz ServletContext 4. Interfaz HttpServletRequest
La relación entre ServletRequest y HttpServletRequest La
interfaz HttpServletRequest hereda de la interfaz ServletRequest.
La función principal es encapsular el mensaje de solicitud HTTP, por lo que también llamamos a HttpServletRequest el objeto de solicitud.
Porque el mensaje de solicitud HTTP se divide en tres partes: la línea de solicitud, el encabezado del mensaje de solicitud y el cuerpo del mensaje de solicitud.
Por lo tanto, los métodos para obtener líneas de solicitud, encabezados de solicitud y cuerpos de mensajes de solicitud se definen en la interfaz HttpServletRequest.
1. Métodos relevantes para obtener información de la línea de solicitud.
Al acceder a un servlet, todos los mensajes de solicitud se encapsularán en el objeto HttpServletRequest. La línea de solicitud del mensaje de solicitud contiene el método de solicitud, el nombre del recurso de solicitud, la ruta de solicitud y otra información. En orden para obtener esta información, HttpServletRequest La interfaz define una serie de métodos.
Inserte la descripción de la imagen aquí

P.ej:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
	//通过HttpServletRequest对象得到请求行信息
	System.out.println("getMethod : " + request.getMethod());
	System.out.println("getRequestURI:" + request.getRequestURL());
	System.out.println("getQueryString:" + request.getQueryString());
	System.out.println("getContextPath:" + request.getContextPath());
	System.out.println("getServletPath:" + request.getServletPath());
	System.out.println("getRemoteAddr : " + request.getRemoteAddr());
	System.out.println("getRemoteHost : " + request.getRemoteHost());
	System.out.println("getRemotePort : " + request.getRemotePort());
	System.out.println("getLocalAddr : " + request.getLocalAddr());
	System.out.println("getLocalName : " + request.getLocalName());
	System.out.println("getLocalPort : " + request.getLocalPort());
	System.out.println("getServerName : " + request.getServerName());
	System.out.println("getServerPort : " + request.getServerPort());
	System.out.println("getRequestURL : " + request.getRequestURL());
}

http: // localhost: 8080 / TestServlet7 / test7? myname = zhangsan
Inserte la descripción de la imagen aquí

2. Métodos pertinentes para obtener encabezados de mensajes de solicitud
Inserte la descripción de la imagen aquí

Cuando el navegador envía una solicitud de servlet, necesita pasar información adicional al servidor a través del encabezado del mensaje de solicitud, por ejemplo, el tipo de datos que el cliente puede recibir, el método de compresión y el idioma. Para ello, en la interfaz HttpServletRequest se definen una serie de métodos para obtener campos de encabezado de solicitud HTTP.
Inserte la descripción de la imagen aquí

@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//获取请求消息中的所有头字段
		Enumeration headerNames = request.getHeaderNames();
	    //用循环遍历所有请求头,并通过 getHeader() 方法获取一个指定名称的头字段
	    while (headerNames.hasMoreElements()) {
	    	    //得到请求头的名称
	            String headerName = (String) headerNames.nextElement();
	            System.out.println(headerName + ":" + request.getHeader(headerName));
	        }
	    
	}
}

Inserte la descripción de la imagen aquí

3. Obtención de los parámetros de la solicitud
En el desarrollo actual, a menudo es necesario obtener los datos del formulario enviados por el usuario, como el nombre de usuario y la contraseña. Para facilitar la obtención de los parámetros de la solicitud en el formulario, se definen una serie de parámetros de obtención de la solicitud. en la clase principal ServletRequest del método de interfaz HttpServletRequest
Inserte la descripción de la imagen aquí

P.ej:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
  <form action="/TestServlet7/test7" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <br/>
        爱好:
        <input type="checkbox" name="hobby" value="sing"/>唱歌
        <input type="checkbox" name="hobby" value="dance"/>跳舞
        <input type="checkbox" name="hobby" value="game"/>玩游戏
        <br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//得到请求参数
		String name=request.getParameter("username");
		System.out.println("用户名:"+name);
		String password=request.getParameter("password");
		System.out.println("密码:"+password);
		String hobby[]=request.getParameterValues("hobby");
		System.out.print("爱好:");
		for(String value:hobby){
			System.out.print(value+",");
		}
	}

Inserte la descripción de la imagen aquí

4. Pasar datos a través del objeto Solicitud
Inserte la descripción de la imagen aquí

Necesitamos probar el método anterior cuando completamos el salto de servlet.
5.
HttpServletResponse La interfaz HttpServletResponse hereda de la interfaz ServletResponse.
Se utiliza principalmente para encapsular mensajes de respuesta HTTP.
Porque el mensaje de respuesta HTTP se divide en tres partes: línea de estado, encabezado del mensaje de respuesta y cuerpo del mensaje. Por lo tanto, los métodos para enviar el código de estado de respuesta, el encabezado del mensaje de respuesta y el cuerpo del mensaje de respuesta al cliente se definen en la interfaz HttpServletResponse.
1. Métodos relacionados con el envío de códigos de estado
Cuando el servlet envía un mensaje de respuesta al cliente, el código de estado debe establecerse en el mensaje de respuesta.
1) Método setStatus (int status)
Este método se utiliza para establecer el código de estado del mensaje de respuesta HTTP y generar una línea de estado de respuesta. Dado que la información de descripción de estado en la línea de estado de respuesta está directamente relacionada con el código de estado, y la versión HTTP la determina el servidor, siempre que el código de estado se establezca mediante el método setStatus (estado int), la línea de estado puede ser enviado. Cabe señalar que, en circunstancias normales, el servidor web generará una línea de estado con un código de estado de 200 por defecto.
2) Método sendError (int sc)
Este método se utiliza para enviar un código de estado que indica información de error. Por ejemplo, un código de estado 404 indica que no se puede encontrar el recurso solicitado por el cliente. El objeto de respuesta proporciona dos métodos sendError (int sc) sobrecargados, de la siguiente manera:
public void sendError (código int) arroja java.io.IOException
public void sendError (int code, String message) arroja java.io.IOException
En los dos métodos sobrecargados anteriores, el primer método solo envía el código de estado del mensaje de error, y el segundo método además de enviar el código de estado, también puede agregar un mensaje de texto para una explicación rápida, el mensaje de texto aparecerá en el contenido del cuerpo enviado al cliente.
2. Métodos relacionados con el envío de encabezados de mensajes de respuesta
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Cabe señalar que en la serie de métodos enumerados en la tabla anterior, los métodos addHeader (), setHeader (), addIntHeader (), setIntHeader () se utilizan para establecer varios campos de encabezado, mientras que setContetType (), setLoacale () y setCharacterEncoding El método () se utiliza para configurar la codificación de caracteres. Estos métodos de configuración de la codificación de caracteres pueden resolver eficazmente el problema de los caracteres confusos.
3. Métodos relacionados con el envío del cuerpo del mensaje de respuesta
Como en los mensajes de respuesta HTTP, una gran cantidad de datos se transmite a través del cuerpo del mensaje de respuesta, por lo tanto, ServletResponse sigue el concepto de diseño de transmitir grandes cantidades de datos a través del flujo de E / S. Al enviar el cuerpo del mensaje de respuesta, se definen dos métodos relacionados con el flujo de salida.
1) Método getOutputStream ()
El objeto de flujo de salida de bytes obtenido por este método es de tipo ServletOutputStream. Dado que ServletOutputStream es una subclase de OutputStream, puede generar directamente los datos binarios en la matriz de bytes. Por lo tanto, si desea generar el cuerpo de la respuesta en formato binario, debe usar el método getOutputStream ().
2) Método getWriter ()
El objeto de flujo de salida de caracteres obtenido por este método es de tipo PrintWriter. Dado que el objeto de tipo PrintWriter puede generar directamente contenido de texto de caracteres, si desea generar un documento de página web cuyo contenido es todo texto de caracteres, debe utilizar el método getWriter ().

Por ejemplo: generar un archivo html a través de la interfaz HttpServletResponse

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
  <form action="/TestServlet7/test7" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <br/>
        爱好:
        <input type="checkbox" name="hobby" value="sing"/>唱歌
        <input type="checkbox" name="hobby" value="dance"/>跳舞
        <input type="checkbox" name="hobby" value="game"/>玩游戏
        <br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");

		//得到请求参数
		String name=request.getParameter("username");
		
		//通过HttpServletResponse 接口输出一个html文件
		PrintWriter out=resp.getWriter();
		out.write("<html>");
		out.write("<head><meta charset=\"utf-8\"><title>Servlet</title></head>");
		out.write("<body><center><center><h1>恭喜"+name+",登陆成功</h1></center></body>");
		out.write("</html>");
		out.close(); 
	}

Inserte la descripción de la imagen aquí

¿La diferencia entre reenviar y redireccionar?
1.
reenviar: reenviar (solicitud ServletRequest, respuesta ServletResponse) de la interfaz RequestDispatcher: este método se utiliza para transferir una solicitud de un servlet a otro recurso web. [Reenvío de solicitudes] La
interfaz HttpServletRequest hereda un método requestDispatcher para obtener el objeto RequestDispatcher de la interfaz ServletRequest
RequestDispatcher getRequestDispatcher (ruta de cadena): devuelve el objeto RequestDispatcher que encapsula el recurso especificado por una ruta determinada.
Parámetro Cadena de ruta: ruta de destino [debe comenzar con "/" para indicar el directorio raíz de la aplicación web actual]
Debe tenerse en cuenta que el contenido del directorio WEB-INF también es visible para el objeto RequestDispatcher. Por lo tanto, el recurso pasado al método getRequestDispatcher (ruta de cadena) puede ser un archivo en el directorio WEB-INF.
Por ejemplo:

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //通过HttpServletRequest对象得到RequestDispatcher对象
		   RequestDispatcher reDispatcher=req.getRequestDispatcher("/other");
		   //通过RequestDispatcher对象的forward(ServletRequest request,ServletResponse response)
		   //方法将请求转发到目录路径
		   reDispatcher.forward(req, resp);
	}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OtherServlet--------");
	}
}

http: // localhost: 8080 / TestServlet8 / test8
Inserte la descripción de la imagen aquí

Pasar datos a través del objeto Solicitud
Inserte la descripción de la imagen aquí

P.ej:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
	<form action="test8" method="post">
		用户名:<input type="text" name="username"><br/>
      	密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //得到请求提交的用户名
		   String name=req.getParameter("username");
		   //将得到的用户名保存到HttpServletRequest对象中
		   req.setAttribute("myname", name);
		   //从 HttpServletRequest对象中删除指定名称的属性
		   //req.removeAttribute("myname");
		   //通过HttpServletRequest对象得到RequestDispatcher对象
		   RequestDispatcher reDispatcher=req.getRequestDispatcher("/other");
		   //通过RequestDispatcher对象的forward(ServletRequest request,ServletResponse response)
		   //方法将请求转发到目录路径
		   reDispatcher.forward(req, resp);
	}
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到来自TestServlet8中保存在HttpServletRequest中的myname数值
		String  myname=(String)req.getAttribute("myname");
		System.out.println("OtherServlet--------myname==="+myname);
	}
}

Inserte la descripción de la imagen aquí

RequestDispatcher's forward (req, resp) - diagrama de principio de funcionamiento del reenvío de solicitudes
Inserte la descripción de la imagen aquí

2.Redirect ---- HttpServletRespone.sendRedirect () [Redirect]
Para lograr la redirección de solicitudes, la interfaz HttpServletResponse define un método sendRedirect ().
La sintaxis completa del método sendRedirect () es la siguiente:
public void sendRedirect (java .lang .String location) arroja el
parámetro java.io.IOException String location: la ruta de acceso de destino después de la redirección.
Inserte la descripción de la imagen aquí

package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //通过HttpServletResponse对象的sendRedirect方法完成重定向
		   resp.sendRedirect("other"); //http://localhost:8080/TestServlet8/other
		   
	}
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OtherServlet--------");
	}
}

Inserte la descripción de la imagen aquí

package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		    //得到请求提交的用户名
		   String name=req.getParameter("username");
		   //将得到的用户名保存到HttpServletRequest对象中
		   req.setAttribute("myname", name);
		   resp.sendRedirect("other");
	}
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String  myname=(String)req.getAttribute("myname");
		System.out.println("OtherServlet--------myname=="+myname);	
	}
}

Inserte la descripción de la imagen aquí

para resumir:
Inserte la descripción de la imagen aquí

1.html página ----- "Controlador de servlet

1.<form action="test8" method="post">
2.<a href=”test8”></a>`

3. Envío de solicitud asíncrona Ajax de
Js 2. Manejador de servlet ---- "página html
1. RequestDispatcher.forward (req, resp)
2. HttpServletRespone.sendRedirect ()

Supongo que te gusta

Origin blog.csdn.net/guoguo0717/article/details/109102209
Recomendado
Clasificación