Sistema de fondo cuatro: nuevo

Tabla de contenido

0. Descripción general de las funciones que deben completarse para las nuevas funciones:

1. Agrega la nueva página create.html al proyecto.

2. En la clase ManagementController, agregue una entrada para acceder a create.jsp

3. Escriba create.jsp: prepare for file upload

4. En la clase ManagementController, agregue un método para recibir el envío del formulario create.jsp;

(1) Al procesar [solicitud de carga de archivo de diseño] sin la ayuda de componentes de terceros y utilizando estrategias tradicionales: no funciona;

(1) Demostración 1: Si el método de codificación del formulario no está configurado: enctype = "multipart / form-data";

(2) Demostración 2: Establezca el método de codificación de la forma: enctype = "multipart / form-data";

Conclusión: A través de la demostración anterior, podemos saber que no es posible utilizar la estrategia tradicional para procesar la [solicitud de carga del archivo de diseño] sin la ayuda de componentes de terceros;

(2) Utilice el componente FileUpload para realizar la carga de archivos


0. Descripción general de las funciones que deben completarse para las nuevas funciones:

Ideas de realización:


1. Agrega la nueva página create.html al proyecto.

Create.html introducción de archivo externo: create.html es la página de formulario de la nueva pintura al óleo: abra create.html: puede ver este efecto:

Agregue create.html al proyecto:

<%@page contentType="text/html;charset=utf-8"%>
<!-- 新增油画页面 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>新增油画</title>
<link rel="stylesheet" type="text/css" href="css\create.css">
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
</head>
<body>
	<div class="container">
		<fieldset>
			<legend>新增油画</legend>
			<form action="" method="post"
				autocomplete="off">
				<ul class="ulform">
					<li>
						<span>油画名称</span>
						<span id="errPname"></span>
						<input id="pname" name="pname" />
					</li>
					<li>
						<span>油画类型</span>
						<span id="errCategory"></span>
						<select id="category" name="category">
							<option value="-1">请选择油画类型</option>
							<option value="1">现实主义</option>
							<option value="2">抽象主义</option>
						</select>
					</li>
					<li>
						<span>油画价格</span>
						<span id="errPrice"></span>
						<input id="price" name="price"/>
					</li>
					<li>
						<span>作品预览</span>
						<span id="errPainting"></span>
						<input id="painting" name="painting" type="file" 
							style="padding-left: 0px;" accept="image/*" />
					</li>

					<li>
						<span>详细描述</span>
						<span id="errDescription"></span>
						<textarea
							id="description" name="description"></textarea>
					</li>
					<li style="text-align: center;">
						<button type="submit" class="btn-button">提交表单</button>
					</li>
				</ul>
			</form>
		</fieldset>
	</div>

</body>
</html>

Como puede ver, hay un formulario en create.jsp;


2. En la clase ManagementController, agregue una entrada para acceder a create.jsp

Debido a que, en el proyecto, todas las JSP son invisibles para el exterior, por lo que solo debe haber un salto en el controlador como entrada para acceder a create.jsp ;

Para la clase ManagementController creada en https://blog.csdn.net/csucsgoat/article/details/114897829 este blog, la clase ManagementController debe completarse, las operaciones [Agregar], [Eliminar], [Cambiar], [Verificar] ; Naturalmente, la parte del controlador del nuevo negocio de archivos también está escrita en la clase ManagementController:

package com.imooc.mgallery.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.mgallery.service.PaintingService;
import com.imooc.mgallery.utils.PageModel;

/**
 * 后台管理功能Controller;
 * 后台系统,所需要的增,删,改,查的操作,都在这一个Controller类中完成;
 * Servlet implementation class ManagementController
 */
@WebServlet("/management")
public class ManagementController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// 创建PaintingService对象;;
	// 即无论是前台系统的PaintingController,还是后台系统的ManagementController都调用PaintingService中提供的方法;
	private PaintingService paintingService = new PaintingService();
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ManagementController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置请求体中的字符集编码方式;;;
		// get请求没有请求体,所以,这个语句是为doPost()方法中执行doGet(request,response)后,跳转过来的post请求来设置的;
		// 即这条代码是为doPost()来进行服务的;
		request.setCharacterEncoding("UTF-8");
		// 设置响应的字符集编码方式
		response.setContentType("text/html;charset=utf-8");
		
		String method = request.getParameter("method");
		if(method.equals("list")) {  // 当前台传入的method参数值为“list”的时候,代表是分页请求,调用定义的list方法;
			this.list(request,response);  // 然后,将分页处理的代码写在list方法中就可以了;
		}else if(method.equals("delete")) {  // 当method参数值为“delete”时,表示是删除请求,调用定义的delete方法;
			this.delete(request, response);
		}else if(method.equals("show_create")) {
			// method参数为“show_create”,表示是新增;调用新增的方法,跳转到create.jsp
			this.showCreatePage(request, response);
		}
		
	}

	/**
	 * @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); // doPost调用了doGet()方法,所以,把逻辑代码都写在doGet方法中就可以了;
	}
	
	/**
	 * 
	 * @param request
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String p = request.getParameter("p");
		String r = request.getParameter("r");
		if(p==null) {
			p = "1";
		}
		if(r==null) {
			r = "6";
		}
		PageModel pageModel = paintingService.pagination(Integer.parseInt(p), Integer.parseInt(r));
		request.setAttribute("pageModel", pageModel);
		request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
	}
	private void delete(HttpServletRequest request, HttpServletResponse response) {
		
	}
	
	/**
	 * 这个方法,是一个纯粹的入口;
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void showCreatePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/jsp/create.jsp").forward(request, response);
	}

}

 Algunas descripciones de la clase ManagementController:

      (1) Primero, si el valor del parámetro del método en la solicitud es "show_create", llame al método showCreatePage ();

else if(method.equals("show_create")) {
			// method参数为“show_create”,表示是新增;调用新增的方法,跳转到create.jsp
			this.showCreatePage(request, response);
		}

      (2) El método showCreatePage () es reenviar la solicitud a create.jsp; nuevamente, ¡este método solo proporciona una entrada de acceso para create.jsp! ! !

private void showCreatePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/jsp/create.jsp").forward(request, response);
	}

A partir de entonces: Visite en el navegador:  localhost: 8080 / management? Method = show_create , accederá a la clase ManagementController, y luego ManagementController solicitará la redirección a create.jsp; en otras palabras, jsp debe proporcionar acceso en el controlador Entrada.


3. Escriba create.jsp: prepare for file upload

Carga de archivos: requisitos previos

A continuación, escriba create.jsp de acuerdo con los requisitos previos para la carga de archivos:

<%@page contentType="text/html;charset=utf-8"%>
<!-- 新增油画页面 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>新增油画</title>
<link rel="stylesheet" type="text/css" href="css\create.css">
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
</head>
<body>
	<div class="container">
		<fieldset>
			<legend>新增油画</legend>
			<!-- enctype="multipart/form-data"只有这样设置,我们选择的文件才能以二进制的形式上传至服务器 -->
			<form action="/management?method=create" method="post"
				autocomplete="off" enctype="multipart/form-data">
				<ul class="ulform">
					<li>
						<span>油画名称</span>
						<span id="errPname"></span>
						<input id="pname" name="pname" />
					</li>
					<li>
						<span>油画类型</span>
						<span id="errCategory"></span>
						<select id="category" name="category">
							<option value="-1">请选择油画类型</option>
							<option value="1">现实主义</option>
							<option value="2">抽象主义</option>
						</select>
					</li>
					<li>
						<span>油画价格</span>
						<span id="errPrice"></span>
						<input id="price" name="price"/>
					</li>
					<li>
						<span>作品预览</span>
						<span id="errPainting"></span>
						<!-- accept="image/*":表示在文件选择框中默认保留所有图片格式的文件,这相当于是一个文件的筛选条件,
						但是这个条件并不靠谱;在后面涉及表单校验的时候,就会明白。 -->
						<input id="painting" name="painting" type="file" 
							style="padding-left: 0px;" accept="image/*" />
					</li>

					<li>
						<span>详细描述</span>
						<span id="errDescription"></span>
						<textarea
							id="description" name="description"></textarea>
					</li>
					<li style="text-align: center;">
						<button type="submit" class="btn-button">提交表单</button>
					</li>
				</ul>
			</form>
		</fieldset>
	</div>

</body>
</html>

Algunas notas sobre create.jsp:

      (1) Establezca el método de envío del formulario para publicar; enctype = "multipart / form-data": establezca el tipo de codificación del formulario;

<form action="/management?method=create" method="post"
				autocomplete="off" enctype="multipart/form-data">

      (2) Agregue la etiqueta de entrada con type = "file";

<input id="painting" name="painting" type="file" 
							style="padding-left: 0px;" accept="image/*" />

      (3) action = "/ management? Method = create": Después de enviar el formulario, establezca la dirección enviada;

<form action="/management?method=create" method="post"
				autocomplete="off" enctype="multipart/form-data">

4. En la clase ManagementController, agregue un método para recibir el envío del formulario create.jsp;

Se puede encontrar que la dirección enviada por el formulario create.jsp es la clase ManagementController:

<form action="/management?method=create" method="post"
				autocomplete="off" enctype="multipart/form-data">

(1) Al procesar [solicitud de carga de archivo de diseño] sin la ayuda de componentes de terceros y utilizando estrategias tradicionales: no funciona;

El envío de este formulario implica la carga de archivos. Si no utiliza componentes de terceros, utilice el método anterior para obtener los datos de la solicitud a través de métodos como [request.getParameter ("pname");] en el controlador: 

package com.imooc.mgallery.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.mgallery.service.PaintingService;
import com.imooc.mgallery.utils.PageModel;

/**
 * 后台管理功能Controller;
 * 后台系统,所需要的增,删,改,查的操作,都在这一个Controller类中完成;
 * Servlet implementation class ManagementController
 */
@WebServlet("/management")
public class ManagementController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// 创建PaintingService对象;;
	// 即无论是前台系统的PaintingController,还是后台系统的ManagementController都调用PaintingService中提供的方法;
	private PaintingService paintingService = new PaintingService();
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ManagementController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置请求体中的字符集编码方式;;;
		// get请求没有请求体,所以,这个语句是为doPost()方法中执行doGet(request,response)后,跳转过来的post请求来设置的;
		// 即这条代码是为doPost()来进行服务的;
		request.setCharacterEncoding("UTF-8");
		// 设置响应的字符集编码方式
		response.setContentType("text/html;charset=utf-8");
		
		String method = request.getParameter("method");
		if(method.equals("list")) {  // 当前台传入的method参数值为“list”的时候,代表是分页请求,调用定义的list方法;
			this.list(request,response);  // 然后,将分页处理的代码写在list方法中就可以了;
		}else if(method.equals("delete")) {  // 当method参数值为“delete”时,表示是删除请求,调用定义的delete方法;
			this.delete(request, response);
		}else if(method.equals("show_create")) {
			// method参数为“show_create”,表示是新增;调用新增的方法,跳转到create.jsp
			this.showCreatePage(request, response);
		}else if(method.equals("create")) {
			this.create(request, response);
		}
		
	}

	/**
	 * @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); // doPost调用了doGet()方法,所以,把逻辑代码都写在doGet方法中就可以了;
	}
	
	/**
	 * 
	 * @param request
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String p = request.getParameter("p");
		String r = request.getParameter("r");
		if(p==null) {
			p = "1";
		}
		if(r==null) {
			r = "6";
		}
		PageModel pageModel = paintingService.pagination(Integer.parseInt(p), Integer.parseInt(r));
		request.setAttribute("pageModel", pageModel);
		request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
	}
	private void delete(HttpServletRequest request, HttpServletResponse response) {
		
	}
	
	/**
	 * 显示【新增】页面;这个方法,是一个纯粹的入口;
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void showCreatePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/jsp/create.jsp").forward(request, response);
	}
	/**
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void create(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String pname = request.getParameter("pname");
		System.out.println(pname);
		//request.getRequestDispatcher("/WEB-INF/jsp/create.jsp").forward(request, response);
	}


}

¿Por qué la forma tradicional (sin usar componentes de terceros) para manejar [solicitudes que involucran cargas de archivos] no es suficiente? ? ? La demostración es la siguiente 

(1) Demostración 1: Si el método de codificación del formulario no está configurado: enctype = "multipart / form-data";

Explique que en este momento, el método de codificación de este formulario todavía adopta el método de envío tradicional, que también es el método de codificación al que estamos acostumbrados antes:

En la clase ManagementController, agregue un punto de interrupción en System.out.println (pname); en el método create () agregado: para facilitar la observación del efecto

 

Se encuentra que si el método de codificación del formulario no está establecido: enctype = "multipart / form-data", todo es normal, ¡la misma situación que a menudo se encontraba antes! ! !

(2) Demostración 2: Establezca el método de codificación de la forma: enctype = "multipart / form-data";

Sin embargo, este formulario necesita cargar archivos, y si el formulario necesita cargar archivos, el método de codificación de este formulario debe establecerse en enctype = "multipart / form-data";

Es decir, se encuentra que, en este momento, se adopta la estrategia tradicional [request.getParameter ("pname");] y no se pueden obtener los datos en la solicitud ;;;; Esto indica que hay un problema. . . . .

Conclusión: A través de la demostración anterior, podemos saber que no es posible utilizar la estrategia tradicional para procesar la [solicitud de carga del archivo de diseño] sin la ayuda de componentes de terceros;

Cuando el envío del formulario incluye la carga de archivos, debe establecer el método de codificación del formulario en [enctype = "multipart / form-data"]. Por lo tanto, los datos binarios se pasan del cliente al servidor. Los componentes proporcionados por las tres partes son muy problemáticos. Entonces, la inspiración que brinda la demostración anterior es que cuando se trata de cargar archivos, debe usar un componente de terceros: es decir, el componente FileUpload proporcionado por Apache.

……………………………………………………

(2) Utilice el componente FileUpload para realizar la carga de archivos

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/csucsgoat/article/details/114994214
Recomendado
Clasificación