1. Descripción general de HttpServletRequest
Anularemos los service()
métodos cuando creemos el Servlet , o doGet()/doPost()
estos métodos tienen dos parámetros, uno es la solicitud que representa la solicitud y la respuesta que representa la respuesta.
El tipo de solicitud en el método de servicio es ServletRequest y el tipo de solicitud en el método doGet / doPost es HttpServletRequest, HttpServletRequest es una subinterfaz de ServletRequest con funciones y métodos más poderosos. Hoy estamos aprendiendo HttpServletRequest.
Dos, tome la solicitud Http a través de la herramienta de captura de paquetes
Debido a que la solicitud representa una solicitud, podemos obtener la solicitud Http a través de este objetoLínea de solicitud,Encabezado de solicitudconCuerpo de la solicitud
Tres, obtenga la línea de solicitud a través de solicitud
Obtenga el método de solicitud del cliente:String getMethod()
Obtenga el recurso solicitado:
String getRequestURL()
StringBuffer getRequestURL()
String getContextPath()
---- El nombre de la aplicación webString getQueryString()
---- Obtenga la cadena de parámetro después de enviar la dirección URL username = zhangsan & password = 123
Caso:
String method = request.getMethod();
System.out.println("method:"+method);
//2、获得请求的资源相关的内容
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println("uri:"+requestURI);
System.out.println("url:"+requestURL);
//获得web应用的名称
String contextPath = request.getContextPath();
System.out.println("web应用:"+contextPath);
//地址后的参数的字符串
String queryString = request.getQueryString();
System.out.println(queryString);
//3、获得客户机的信息---获得访问者IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("IP:"+remoteAddr);
El efecto es el siguiente:
esta dirección es una dirección IPV6, si desea cambiar a 127.0.0.1, debe modificar la configuración de la computadora. Representa la IP local.
Cuatro, obtenga el encabezado de la solicitud a través de la solicitud
long getDateHeader(String name)
String getHeader(String name)
——Obtener la cabeza especificadaEnumeration getHeaderNames()
—— Obtener los nombres de todos los jefesEnumeration getHeaders(String name)
int getIntHeader(String name)
Caso número uno:
Cree un nuevo HeaderServlet, escriba lo siguiente
//1.获得指定的头,这里是获取USER-Agent也就是用户使用的浏览器
String header = request.getHeader("User-Agent");
System.out.println(header);
//2.获得所有的头的名称
Enumeration<String> headerNames =request.getHeaderNames();
while (headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
El efecto es el siguiente:
Caso 2:
Si agregamos una etiqueta a form.html, la dirección a visitar es HeadServlet escrita en el Caso 1.
<a href="/HeaderServlet">访问HeaderServlet资源</a>
En este punto, obtenemos la información de todos los encabezados de solicitud, que se pueden ver a través de la consola.
La función de los TIPS: encabezado de referencia: la fuente de la visita. Función: el enlace anti-sanguijuela significa que se accede al enlace a través del html escrito por mí, lo que puede evitar que otros malversen mi página web vinculada
Caso tres:
Para dominar la cadena antirrobo, haz una pequeña demostración
El primer paso es crear un nuevo news.html y acceder al Servlet
body>
<a href="/RefererServlet">纯手工山楂球</a>
</body>
El segundo paso es detectar la cadena de acceso
public class RefererServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//对该新闻的来源进行判断
String Header = request.getHeader("RefererServlet");
if(Header !=null&&Header.startsWith("http://localhost")){
//从本人网站跳转过去,可以看新闻
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("纯手中山楂球安全可食用");
}
else{
response.getWriter().write("盗网站者,可耻");
}
}
Cinco, obtener el cuerpo de solicitud mediante solicitud
Si el contenido del cuerpo de la solicitud esEnviar por correoLos parámetros de solicitud, el formato es:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]
Tome los parámetros anteriores como ejemplo, obtenga los parámetros de solicitud a través de los siguientes métodos:
String getParameter(String name)
String[] getParameterValues(String name)
Caso número uno:
Paso 1: crea un formulario nuevo
<form action="/ContentServlet" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
爱好:<input type="checkbox" name="hobby" value="zq">足球
<input type="checkbox" name="hobby" value="pq">排球
<input type="checkbox" name="hobby" value="ppq">乒乒球
<input type="submit" value="提交">
</form>
Paso 2: obtenga un valor único y varios valores en el cuadro de texto respectivamente
public class ContentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得单个表单值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+" "+password);
//2.获得多个表单的值
String[]hobbys = request.getParameterValues("hobby");
for (String hobby:hobbys){
System.out.println(hobby);
}
}
}
El efecto es el siguiente:
Enumeration getParameterNames()
(poco usado)Map<String,String[]> getParameterMap()
(Comúnmente utilizado)
Nota: Los parámetros enviados por el cliente al servidor son todas cadenas
Caso 2:
En este punto, continuamos escribiendo junto al Servlet anterior
//3.获取所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//4.获得所有的参数 参数封装到一个Map<String,String[]>
Map<String,String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String,String[]> entry:parameterMap.entrySet()){
System.out.println(entry.getKey());
for(String str:entry.getValue()){
System.out.println(str);
}
System.out.println("+++++++++++++++++++++++++++++++++++");
}
El efecto es el siguiente:
Seis, la solución para enviar código confuso
- resolverMétodo de envío posteriorEl confuso:
request.setCharacterEncoding("UTF-8");
- resolverobtener el método de envíoIlegible:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8")
;
Siete, otras funciones de solicitud
- la solicitud es un objeto de dominio
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
Nota: El alcance del campo de solicitud: en una solicitud
Caso número uno:
Finalidad: El dominio de la solicitud es competente, almacenamos información en el contenido de Servlet1 y la obtenemos en Servlet2.
El primer paso es crear un nuevo Servlet1
@WebServlet(name = "Servlet1",urlPatterns
="/Servlet1")
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向request域中存储数据
request.setAttribute("name","tom");
RequestDispatcher dispatcher = request.getRequestDispatcher("/Servlet2");
//执行转发的方法
dispatcher.forward(request,response);
}
}
Paso 2: escriba un Servlet2
@WebServlet(name = "Servlet2",urlPatterns
="/Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request域中取出数据
Object attribute = request.getAttribute("name");
response.getWriter().write("123w45"+attribute);
}
}
El efecto es el siguiente:
Nota: Cuando ingresamos a Servlet1 en el sitio web en este momento, él lo reenviará y el contenido saltará al contenido de Servlet2, que es el siguiente contenido de Request, reenvío. En segundo lugar, preste atención para comprender la solicitud en el Servlet una vez, puede obtener todos los recursos
- solicitar reenvío de solicitud completo
Obtener el reenviador de solicitudes ---- la ruta es la dirección reenviada
RequestDispatcher getRequestDispatcher(String path)
Adelante a través del objeto reenviadorrequestDispathcer.forward(ServletRequest request, ServletResponse response)
Caso 2:
Propósito: Para dominar el contenido del reenvío de solicitudes, que es casi similar al caso 1, hacemos un Servlet1 y un Servlet2, y reenviamos el contenido de Servlet1 a Servlet2.
El primer paso: escribe un Servlet1:
@WebServlet(name = "Servlet1",urlPatterns ="/Servlet1")
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Servlet1将请求转发给Servlet2 此处新建一个转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/Servlet2");
//执行转发的方法
dispatcher.forward(request,response);
}
}
Paso 2: escriba un servlet
@WebServlet(name = "Servlet2",urlPatterns ="/Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("123w45");
}
}
El efecto es el siguiente:
En este momento, cuando visitamos Servlet1, se muestra el contenido de Servlet2:
Ocho, algunas precauciones para la solicitud
1. ¿Comparar el ciclo de vida del dominio ServletContext y el dominio de solicitud?
ServletContext:
- Crear: inicio del servidor
- Destruir: apagado del servidor
- El alcance del dominio: toda la aplicación web
solicitud:
- Crear: crear solicitud al visitar
- Destruir: se destruye el final de la solicitud de respuesta
- Alcance del dominio: en una solicitud
2. ¿Cómo escribir la dirección del cliente y la dirección del servidor?
- Dirección del cliente:
- Es la dirección donde el cliente accede al servidor, la dirección fuera del servidor,
- Funciones: escriba el nombre de la aplicación web
- Método de acceso: redireccionar
- Dirección del servidor:
- La dirección de salto de los recursos internos del servidor,
- Funciones: no es necesario escribir el nombre de la aplicación web
- Método de acceso: adelante
3. ¿La diferencia entre reenvío y redireccionamiento?
- Redirigir la solicitud dos veces y reenviar la solicitud una vez
- La dirección de la barra de direcciones de redireccionamiento cambia y la dirección de reenvío permanece sin cambios
- La redirección puede acceder a sitios web externos La redirección solo puede acceder a recursos internos
- El rendimiento del reenvío es mejor que la redirección