SpringMVC

Table of Contents

1. Оглядываясь назад на MVC

1.1, что такое MVC

  • MVC – это аббревиатура моделей, представлений и контроллеров, которая является спецификацией проектирования программного обеспечения.
  • Организовать код для организации кода для организации кода.
  • Основная роль MVC – этоУменьшите две куклы между видом и бизнес -логикой
  • MVC не режим дизайна,MVC – режим архитектурыСущность Конечно, есть различия в разных MVC.

Модель (модель): Модель данных, предоставленные данные, которые будут отображаться, поэтому они включают данные и поведение, которые можно рассматривать как доменную модель или компонент Javabean (включая данные и поведение), но теперь она обычно разделена: объект значения (данные DAO) и обслуживание слой (служба поведения). То есть модель предоставляет такие функции, как запрос данных модели и данные модели, включая данные и бизнес.

View (View): Отвечает за дисплей модели, как правило, пользовательский интерфейс, который мы видим, что клиенты хотят видеть.

Контроллер (контроллер): Получить запросы пользователей, поверьте модели для обработки (изменение состояния) и верните возвращенные данные модели в представление после обработки, и представление отвечает за отображение. Другими словами, контроллер сделал туннель.

Наиболее типичным MVC является модель JSP + Service + Javabean.

1.2, ERA MODEL1

  • В ранней разработке веб -сайта обычно используется модель1.
  • В модели1 он в основном делится на два слоя, аспекты и модели.

Преимущество модели1: простая архитектура, более подходящая для разработки небольших проектов;

Недостаток модели1: ответственность JSP не только одна, обязанности слишком тяжелые, и это не удобно поддерживать;

1.3, ERA MODEL2

Model2 делит проект на три части, включаяПросмотр, управление, модель.

  1. Пользовательский выпуск
  2. Сервлет получает данные запроса и вызывает соответствующий метод бизнес -логики
  3. После завершения бизнес -обработки обновленные данные возвращаются в службу
  4. Сервлет превращается в JSP и отображает страницу из JSP
  5. Ответ на страницу обновленной страницы

Анализ обязанностей:

Контроллер: контроллер

  1. Получите данные формы
  2. Позвоните в бизнес -логику
  3. Шаг на указанной странице

Модель: модель

  1. Бизнес -логика
  2. Сохранить статус данных

Просмотр: Просмотр

  1. Отображение страницы

Model2 не только улучшает частоту повторного использования кода и масштабируемость проекта, но и значительно снижает стоимость технического обслуживания проекта. Реализация режима модели 1 относительно проста, подходящая для быстрой разработки небольших проектов. Страницы JSP в модели1 являются как представление, так и контроллер. Сложность масштабируемости и обслуживания применения. Модель2 устраняет недостатки модели1.

1.4, Обзорная служба

  1. Создайте новый проект Maven в качестве родительского проекта! Зависимость от помпона!

    <dependencies>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>5.1.9.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>servlet-api</artifactId>
           <version>2.5</version>
       </dependency>
       <dependency>
           <groupId>javax.servlet.jsp</groupId>
           <artifactId>jsp-api</artifactId>
           <version>2.2</version>
       </dependency>
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>jstl</artifactId>
           <version>1.2</version>
       </dependency>
    </dependencies>
    123456789101112131415161718192021222324252627
    12345678910111213141516171819202122232425262728
    
  2. Создайте индекс: Springmvc-01-Servlet, добавьте поддержку веб-приложения!

  3. Представьте JAR -зависимости, импортируемые из Service и JSP

    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
    </dependency>
    <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.2</version>
    </dependency>
    12345678910
    1234567891011
    
  4. Напишите класс сервлета, чтобы обработать запрос пользователя

    package nuc.ss.servlet;
    
    
    public class HelloServlet extends HttpServlet {
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           
           String method = req.getParameter("method");
           if (method.equals("add")){
               req.getSession().setAttribute("msg",«Метод исполнительного директора»);
          }
           if (method.equals("delete")){
               req.getSession().setAttribute("msg","Выполните метод удаления");
          }
           
           
           req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
      }
    
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doGet(req,resp);
      }
    }
    
    12345678910111213141516171819202122232425
    
  5. Напишите hello.jsp, создайте новую папку JSP в каталоге Web-Inf, создайте новый hello.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Kuangshen</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    
    12345678910
    
  6. Зарегистрируйте службу в Web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
            version="4.0">
       <servlet>
           <servlet-name>HelloServlet</servlet-name>
           <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
       </servlet>
       <servlet-mapping>
           <servlet-name>HelloServlet</servlet-name>
           <url-pattern>/user</url-pattern>
       </servlet-mapping>
    
    </web-app>
    
    12345678910111213141516
    
  7. Настройте Tomcat и запустите тест

    • localhost:8080/user?method=add
    • localhost:8080/user?method=delete

Что делает структура MVC?

  1. Методы для сопоставления URL на класс Java или Java.
  2. Данные, представленные пользователями упаковки.
  3. Запрос на обработку -Колл, связанный с бизнес -обработкой -Данные ответа.
  4. Рендеринг данных ответа. JSP / HTML и т. Д. Представляют данные уровня.

иллюстрировать:

Common Server -Share MVC Frameworks: Struts, Spring MVC, ASP.NET MVC, Zend Framework, JSF; Common Front -End MVC Frameworks: Vue, Angularjs, React, Banckbone; другие режимы, такие как MVP, MVVM и другие режимы развивались . Подожди …

2. Что такое Springmvc

2.1, Обзор

Spring MVC является частью Spring Framework. Это легкая веб -структура, основанная на Java для реализации MVC.

Просмотреть официальный документ: https://docs.spring.io/spring/docs/5.2.0.rease/spring-framework- Ссылка/web.html #Spring-webeb

Почему мы изучаем Springmvc?

Особенности Spring MVC:

  1. Легкий, легко учиться
  2. Эффективная структура MVC на основе ответа на запрос
  3. Хорошая совместимость с пружиной, бесшовно объединенная
  4. Скорость лучше, чем конфигурация
  5. Мощная функция: спокойствие, проверка данных, форматирование, локализация, тема и т. Д.
  6. Простой и гибкий

Spring’s Web Framework окружаетDispatcherServlet [Расписание Сервлета] Дизайн.

Роль DispatcherServlet заключается в распространении запроса на разные процессоры. Начиная с весны 2.5, пользователи, использующие Java 5 или выше, могут быть разработаны в виде аннотаций, что очень кратко; это очень кратко;

Springmvc , , , , Spring ( Springioc aop), . junit . Проверка данных, преобразование типа, перехватчик и т. Д., Так что мы должны учиться.

Наиболее важным моментом является использование большего количества людей, и есть много компаний.

2.2, центральный контроллер

  • Spring’s Web Framework разработана вокруг DispatcherServlet. Роль DispatcherServlet заключается в распространении запроса на разные процессоры. Начиная с весны 2.5, пользователи, которые используют Java 5 или выше, могут принять метод объявления аннотированного контроллера.

Spring MVC Framework похожа на многие другие фреймворки MVC,Поехать на запрос , Вокруг центрального запроса на отправку сервлета и предоставление других функцийDispatcherServlet – это практическая услуга (он наследует от базы Httpservlet)

  • Принцип SpringMVC показан на рисунке ниже:

    При инициировании запроса фронт -контроллер перехватывает запрос. Согласно параметру запроса для генерации запроса агента, найдите фактический контроллер запроса, запрос обработки контроллера, создайте модель данных, доступ к базе данных, ответьте на центральный контроллер , управление контроллером, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением, управлением Устройство использует результат просмотра рендеринга модели и представления, возвращает результат в центральный контроллер, а затем возвращает результат в запрос.

    Оригинальная картина

    Китайская карта

2.3, принцип выполнения SpringMVC

На рисунке показана относительно полная блок -схема SpringMVC. Сплошная линия представляет технологию, предоставленную структурой SpringMVC, и не требует, чтобы разработчики реализовали ее. Пунктирная линия указывает на то, что разработчики должны быть реализованы.

Краткий анализ процесса выполнения

  1. DispatcherServlet представляет передний контроллер, который является центром управления всей SpringMVC. Пользователь выпустил запрос, и DispatcherServlet получил запрос и перехватил запрос.
    • Мы предполагаем, что URL -адрес запроса: http: // localhost: 8080/springmvc/hello
    • Три части URL -разборки:
    • http: // localhost: 8080 ——-> Имя домена сервера
    • Springmvc ——> веб-сайт развернута на сервере
    • Привет ——-> Указывает контроллер
    • По анализу, как выражается URL -адрес: Запрос Hello Controller на сайте SpringMVC на сервере Localhost: 8080.
  2. Руководство отображается для процессора. DispatcherServlet Callsppopping, Handlermapping Найдите обработчик в соответствии с URL -адресом запроса.
  3. HandleRexecution представляет собой конкретный обработчик. Его основная функция – найти контроллер на основе URL. Как если бы URL был найден контроллер: привет.
  4. HandleRexecution передает аналитическую информацию в диспетчерскую, такую ​​как картирование контроллера анализа.
  5. HandlerAdapter представляет адаптер процессора, который выполняет обработчик в соответствии с конкретными правилами.
  6. Хэндлер выполняет конкретный контроллер.
  7. Контроллер возвращает конкретную информацию о выполнении в HandlerDapter, например Modratview.
  8. HandlerAdapter передает имя или модель Logic View в DispatcherServlet.
  9. DispatcherServlet вызывает логическое имя представления, передаваемое HandlerDapter.
  10. Просмотр анализатора передал имя логики анализа в DispatcherServlet.
  11. DispatcherServlet вызывает конкретные представления, основанные на результате просмотра просмотра.
  12. Окончательное представление представлено пользователю.

2.3.1, версия конфигурации

  1. Создайте новую крем, SpringMVC-02-Hello, добавьте поддержку веб-сайта!

  2. Определите зависимости импорта SpringMVC!

  3. Настройка web.xml, зарегистрировать DispatcherServlet

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
            version="4.0">
    
       
       <servlet>
           <servlet-name>springmvc</servlet-name>
           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>classpath:springmvc-servlet.xml</param-value>
           </init-param>
           
           <load-on-startup>1</load-on-startup>
       </servlet>
    
       
       
       <servlet-mapping>
           <servlet-name>springmvc</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>
    
    </web-app>
    123456789101112131415161718192021222324252627
    
  4. Напишите файл конфигурации Springmvc! Имя: Springmvc -servlet.xml: [servletname] -servlet.xml

    Объясните, что требования к имени здесь основаны на официальном

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    1234567
    
  5. Добавить картирование обработки (опущено)

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    1
    
  6. Добавьте адаптер процессора (опущен)

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
    12
    
  7. Добавить просмотр анализатора

    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
       
       <property name="prefix" value="/WEB-INF/jsp/"/>
       
       <property name="suffix" value=".jsp"/>
    </bean>
    1234567
    
  8. Напишите, что мы хотим управлять бизнес -контроллером, либо для реализации интерфейса контроллера, либо добавить аннотацию; вам необходимо вернуть Modratview, установить данные, представление о уплотнении;

    package com.kuang.controller;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.mvc.Controller;
    
    public class HelloController implements Controller {
    
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            
            ModelAndView mv = new ModelAndView();
    
            
            mv.addObject("msg","HelloSpringMVC!");
            
            mv.setViewName("hello"); 
            return mv;
        }
    }
    12345678910111213141516171819
    
  9. Дайте свой собственный класс в контейнер Springioc и зарегистрируйте фасоль

    
    <bean id="/hello" class="nuc.ss.controller.HelloController"/>
    
    123
    
  10. Напишите страницу JSP, чтобы прыгнуть, чтобы показать данные, хранящиеся ModlandView, а также наши обычные страницы;

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Kuangshen</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    123456789
    
  11. Настройте Tomcat Startup Test!

Может быть, проблемы: посетите 404, проверьте шаги:

  1. Проверьте вывод консоли и посмотрите, не хватает ли упаковки JAR.
  2. Если пакет JAR существует, дисплей не может быть выведен, просто добавьте зависимости либеал в выпуск проекта Idea!
  3. Перезапустите Tomcat, чтобы решить!

Резюме: давайте посмотрим на реализацию версии аннотации, которая является сущностью SpringMVC.

2.3.2, версия аннотации

  1. Создайте новую кхудл, SpringMVC-03-Hello-Nanotation. Добавьте веб -поддержку!

  2. Поскольку у Maven может быть проблема фильтрации ресурсов, мы будем идеально настроены

    <build>
       <resources>
           <resource>
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.properties</include>
                   <include>**/*.xml</include>
               </includes>
               <filtering>false</filtering>
           </resource>
           <resource>
               <directory>src/main/resources</directory>
               <includes>
                   <include>**/*.properties</include>
                   <include>**/*.xml</include>
               </includes>
               <filtering>false</filtering>
           </resource>
       </resources>
    </build>
    1234567891011121314151617181920
    
  3. Соответствующие зависимости вводятся в файле POM.xml: основные библиотеки Spring Framework, Spring MVC, Сервлет, JSTL и т. Д. Мы были представлены в зависимости нашего отца!

  4. Настройка web.xml

    будь осторожен:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
            version="4.0">
    
       
       <servlet>
           <servlet-name>SpringMVC</servlet-name>
           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>classpath:springmvc-servlet.xml</param-value>
           </init-param>
           
           <load-on-startup>1</load-on-startup>
       </servlet>
    
       
       <servlet-mapping>
           <servlet-name>SpringMVC</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>
    
    </web-app>
    
    123456789101112131415161718192021222324252627
    
  5. Разница между / и /*:

    • <Url-pattern> / < / url-pattern> не совпадает. JSP, только запрос, который мы написали; то есть .JSP не будет входить в класс Spring DispatcherServlet.
    • <Url-pattern> / * < / url-pattern> будет соответствовать * .jsp, и когда представление JSP будет возвращено, класс DispatcherServlet снова входит в пружину, в результате чего соответствующий контроллер сообщает о ошибке 404.
  6. Добавить файл конфигурации Spring MVC

    Добавьте файлы конфигурации SpringMVC-servlet.xml в каталоге ресурсов. Форма конфигурации в основном аналогична конфигурации контейнера пружины. Чтобы поддержать МОК на основе аннотаций, установлена ​​функция автоматических сканирующих пакетов. Конкретная информация является такой следует:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
        
        <context:component-scan base-package="com.kuang.controller"/>
        
        <mvc:default-servlet-handler />
        
        <mvc:annotation-driven/>
    
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/" />
            
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>
    1234567891011121314151617181920212223242526272829303132333435
    

В ViewPlayer мы храним все представления в/web-inf/каталог, чтобы представление было безопасным, потому что файлы в этом каталоге не могут быть доступны напрямую.

  • Сделайте аннотацию IOC вступить в силу
  • Фильтрация статического ресурса: html. Js. CSS. Picture, Video …
    • Драйвер аннотации MVC
    • Конфигурация просмотра анализатора
  1. Создать контроллер

    Напишите класс управления Java: com.kuang.controller.hellocontroller, обратите внимание

    package nuc.ss.controller;
    package com.kuang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HelloController {
        @RequestMapping("/hello")
        public String hello(Model model){
            
            model.addAttribute("msg","hello,springmvcAnnotation");
            return "hello";
        }
    }
    
    1234567891011121314151617
    
    • @Controller должен автоматически сканировать пружинный контейнер IOC при инициализации;
    • @Requestmapping – это провести путь запроса. Здесь, поскольку в классе и методах есть отображение, это должно быть/helloController/Hello;
    • Метод, который были объявлены параметры типа модели, чтобы привести данные в действие в представление;
    • Возвращенный результат-это имя представления Hello, плюс префикс в файле конфигурации становится Web-Inf/JSP/hello.jsp
  2. Создать слой представления

    Создайте hello.jsp в каталоге Web-Inf/ JSP. Представление может быть непосредственно удалено и отображает информацию, возвращенную из контроллера;

    Вы можете использовать EL для указания значений или объектов, хранящихся в модели;

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>SpringMVC</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    123456789
    
  3. Настройте Tomcat Run

    Настройте Tomcat, включите сервер, доступ к соответствующему пути запроса!

    ОК, успешная операция!

резюме

Шаги реализации на самом деле очень просты:

  1. Создать новый веб -проект
  2. Смешанные банки, связанные с импортом
  3. Напишите web.xml, зарегистрируйтесь для DispatcherServlet
  4. Напишите файл конфигурации SpringMVC
  5. Следующий шаг – создать соответствующий класс управления, контроллер
  6. Наконец -то улучшите соответствие между видом фронта и контроллером
  7. Тест работает на отладку.

Три основных элемента, которые необходимо настроить с помощью Springmvc

Переработанный кейтер, адаптер процессора, просмотр анализатора

Обычно нам нужно толькоРучная конфигурация просмотр анализатораПроцессор MaperсАдаптер процессораПросто открытаАннотационный драйвВот и все, и большая часть конфигурации XML устраняется

4. RESTful и Controller

4.1. Контроллер контроллера

  • Контроллер является сложным, предоставляя доступ к приложениям и обычно реализуется посредством определения интерфейса или определения аннотации.
  • Контроллер отвечает за анализ запроса пользователя и преобразование его в модель.
  • Один класс контроллера в Spring MVC может включать несколько методов
  • В Spring MVC есть много способов настроить контроллер

4.2. Реализация интерфейса контроллера

Контроллер – это интерфейс, под org.springframework.web.servlet.mvc, в интерфейсе есть только один метод;


public interface Controller {
   
   ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

123456
1234567

тестовое задание

  1. Создайте новую крем, SpringMVC-04-контроль!

    • Файл конфигурации MVC оставляет только ViewPlayer!
  2. Напишите класс контроллера, Controlertert1

    
    
    public class ControllerTest1 implements Controller {
    
       public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
           
           ModelAndView mv = new ModelAndView();
           mv.addObject("msg","Test1Controller");
           mv.setViewName("test");
           return mv;
      }
    }
    
    12345678910111213
    1234567891011121314
    
  3. После завершения написания перейдите к бобам запроса на регистрацию в файле конфигурации Spring; имя соответствует пути запроса, класс соответствует требованиям запросов на обработку

    <bean name="/t1" class="nuc.ss.controller.ControllerTest1"/>
    
    12
    123
    
  4. Напишите переднюю часть test.jsp, обратите внимание на написание в каталоге Web-Inf/JSP, соответствующий

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Kuangshen</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    
    12345678910
    1234567891011
    
  5. Настройте тест Tomcat Running. У меня нет проекта для публикации конфигурации здесь.

иллюстрировать:

  • Осознайте определение контроллера интерфейса контроллера – более старый способ
  • Недостатком является: в контроллере есть только один метод. Если требуется несколько методов, вам необходимо определить несколько контроллера; метод определения более неприятен;

Используйте аннотацию @controller

  • Тип аннотации контроллера, используемый для объявления весеннего класса, является контроллером (три других заметки были упомянуты при разговоре о МОК);

  • Spring может использовать механизм сканирования, чтобы найти все аннотированные классы контроллера в приложении. Чтобы гарантировать, что Spring может найти ваш контроллер, вам необходимо объявить сканирование компонентов в файле конфигурации.

    
    <context:component-scan base-package="nuc.ss.controller"/>
    
    123
    1234
    
  • Добавить класс ControlerTest2 для реализации аннотации;

    
    @Controller
    public class ControllerTest2{
    
       
       @RequestMapping("/t2")
       public String index(Model model){
           
           model.addAttribute("msg", "ControllerTest2");
           
           return "test";
      }
    }
    
    1234567891011121314
    123456789101112131415
    
  • Запустите Tomcat Test

Можно обнаружить, что оба наших запроса могут указывать на представление (тест), но результаты результатов страницы различны. Отсюда мы видим, что представление повторяется, а контроллер и представление являются слабо последовательными отношениями . Сущность

Метод аннотации является наиболее часто используемым способом!

RequestMapping

@RequestMapping

  • @Requestmapping Annotation используется для максимального URL -адреса для класса контроллера или конкретного метода программы обработки. Можно использовать для класса или метода. Для класса все запросы ответов в классе основаны на адресе как родительский путь.

  • Чтобы проверить вывод более точного, мы можем добавить тест на название проекта MyWeb

  • Только прокомментируйте метод

    @Controller
    public class TestController {
       @RequestMapping("/h1")
       public String test(){
           return "test";
      }
    }
    
    12345678
    123456789
    

    Путь доступа: http: // localhost: 8080 / имя проекта / H1

  • В то же время

    @Controller
    @RequestMapping("/admin")
    public class TestController {
       @RequestMapping("/h1")
       public String test(){
           return "test";
      }
    }
    
    123456789
    12345678910
    

    Путь доступа: http: // localhost: 8080/имя проекта/admin/h1, необходимо сначала указать путь класса, прежде чем указать

Стиль спокойного

концепция

Restful – это стиль позиционирования ресурсов и работы ресурсов. Это не стандарт или соглашение, это просто стиль. Программное обеспечение, основанное на этом стиле, может быть более кратким, более многослойным и легким для достижения механизма кеша.

Функция

Ресурсы: все в Интернете может быть абстрагировано в ресурсы

Операция ресурсов: используйте Post, Delete, Plat, Get, используйте различные методы для эксплуатации ресурсов.

Соответствует добавлению, удалению, модификации и запросу соответственно.

Традиционный способ эксплуатационных ресурсов : Различные параметры для достижения разных эффектов! Методы одиноки, публиковать и получить

http://127.0.0.1/item/queryitem.action?id=1 запрос, получить, получить

http://127.0.0.1/item/saveitem.action

http://127.0.0.1/item/updateitem.action

http://127.0.0.1/item/deleteitem.action?id=1 Удалить, получить или пост

Используйте Restful для эксплуатации ресурсов : Вы можете достичь разных эффектов с помощью разных методов запроса! Следующим образом: адрес запроса одинаков, но функция может быть другой!

http://127.0.0.1/item/1 запрос, получить, получить

http://127.0.0.1/item new, post

http://127.0.0.1/item

http://127.0.0.1/item/1 delete, delete

Учебный тест

  1. Создайте новый RestfulController в новом классе

    @Controller
    public class RestFulController {}
    12
    
  2. В Spring MVC вы можете использовать аннотации @pathvariable, чтобы значение параметра метода было связано с переменной шаблона URI.

    package com.kuang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.*;
    
    @Controller
    public class RestFulController {
        @GetMapping("/add/{a}/{b}")
        public String test1(@PathVariable int a,@PathVariable String b, Model model){
            String res=a+b;
            model.addAttribute("msg","Результат:"+res);
            return "test";
        }
        @PostMapping("/add/{a}/{b}")
        public String test2(@PathVariable int a,@PathVariable int b, Model model){
            int res=a+b;
            model.addAttribute("msg","Результат:"+res);
            return "test";
        }
      }
       
    }
    1234567891011121314151617181920212223
    
  3. Давайте проверим запрос на просмотр

  4. Мышление: преимущества использования переменных пути?

    • Сделать путь более кратким;

    • Получить параметры удобнее, и структура будет автоматически преобразовать.

    • Тип переменной пути может ограничить параметры доступа. Если тип отличается, соответствующий метод запроса не может быть доступен. Если доступ к пути здесь/Add/1/A, путь и метод не совпадают, а не параметр, Не тот параметр, что преобразование не удалось.

  5. Давайте изменим соответствующий тип параметра и снова проверьте

    
    @RequestMapping("/add/{p1}/{p2}")
    public String index(@PathVariable int p1, @PathVariable String p2, Model model){
    
       String result = p1+p2;
       
       model.addAttribute("msg", "результат:"+result);
       
       return "test";
    
    }
    1234567891011
    

Укажите тип запроса с атрибутом метода

Тип, используемый для запросов на ограничение, может сузить диапазон запросов. Укажите тип предиката запроса, такой как GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE и т. Д.

Давайте проверим:

  • Добавьте один метод

    
    @RequestMapping(value = "/hello",method = {RequestMethod.POST})
    public String index2(Model model){
       model.addAttribute("msg", "hello!");
       return "test";
    }
    
    1234567
    
  • Мы используем адресную строку браузера для доступа к дефолте в качестве запроса GET, и она сообщит об ошибке 405:

  • Если вы измените пост, чтобы получить, это нормально;

    
    @RequestMapping(value = "/hello",method = {RequestMethod.GET})
    public String index2(Model model){
       model.addAttribute("msg", "hello!");
       return "test";
    }
    
    1234567
    12345678
    

резюме:

Метод аннотации Spring MVC @Requstmapping может обрабатывать HTTP -запросы, такие как GET, POT, POST, DELETE и PATCH.

Все столбцы адреса должны быть типом HTTP Get по умолчанию.

Варианты аннотации уровня метода следующие: комбинированные аннотации

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
12345

@Getmapping – это комбинированная аннотация, обычно большее использование!

Он воспроизводит ярлык @Requestmapping (method = requestMethod.get).

Расширение: метод дискуссионного дискуссии в маленькой желтой утке

Сцена первая:У всех нас есть опыт спрашивать других (даже тех, кто не может быть запрограммирован) и объяснения вопросов программирования, но много раз в процессе нашего объяснения мы думаем о проблеме решения решения

Сценарий 2: Ваши коллеги приходят, чтобы задать вам вопрос, но когда он закончит вопрос, или когда он говорит о половине, он хочет получить ответ и оставить вас с пустым лицом.

Фактически, две вышеупомянутые сцены -это так называемая отладка резиновой утки, также известная как метод отладки резиновой утки. Это один из наиболее часто используемых методов отладки в нашей разработке программного обеспечения.

img

Говорят, что эта концепция является историей в книге «Путь выращивания программистов». Легендарный мастер программы несет с собой маленькую желтую утку. При отладке код вы поставите эту маленькую желтую утку на стол, а затем Зайдите в утку в подробности в утку. Объясните каждую строку кода, а затем быстро исправьте проблему позиционирования.

5. Метод прыжков с результатами

5.1、ModelAndView

Установите объект Modratview, в соответствии с именем представления, и зрителя прыгает на указанную страницу.

Страница: {Просмотр PARSER PREFIX} + ViewName + {View Parser Suffix}


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
     id="internalResourceViewResolver">
   
   <property name="prefix" value="/WEB-INF/jsp/" />
   
   <property name="suffix" value=".jsp" />
</bean>

123456789

Соответствующий класс контроллера

public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}
12345678910

5.2、ServletAPI

ServletAPI

Установив Servertapi, анализатор просмотра не требуется.

  1. Вывод через httpservletresponse

  2. Удаление с помощью httpservletresponse

  3. Переадресация через httpservletresponse

    @Controller
    public class ResultGo {
    
       @RequestMapping("/result/t1")
       public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
           rsp.getWriter().println("Hello,Spring BY servlet API");
      }
    
       @RequestMapping("/result/t2")
       public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
           rsp.sendRedirect("/index.jsp");
      }
    
       @RequestMapping("/result/t3")
       public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
           
           req.setAttribute("msg","/result/t3");
           req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
      }
    
    }
    123456789101112131415161718192021
    

5.3、SpringMVC

Для достижения пересылки и перенаправления -без просмотра синхронизации через SpringMVC;

Перед тестированием вам нужно аннотировать ViewPlayer

  • Дефицит для прямого репоста (также может быть добавлен)
  • Перенаправить репостирование должно быть особенным
@Controller
public class ResultSpringMVC {
   @RequestMapping("/rsm/t1")
   public String test1(){
       
       return "/index.jsp";
  }

   @RequestMapping("/rsm/t2")
   public String test2(){
       
       return "forward:/index.jsp";
  }

   @RequestMapping("/rsm/t3")
   public String test3(){
       
       return "redirect:/index.jsp";
  }
}

123456789101112131415161718192021

Через SpringMVC для достижения пересылки и перенаправления -есть представление;

RE -Redo -Oniented, нет необходимости просматривать устройство разрешения. Суть состоит в том, чтобы переоценить новое место, поэтому обратите внимание на проблему пути.

Вы можете перенаправить на другой запрос.

  • Дефицит для пересылки (не добавить)
  • Перенаправить репостирование должно быть особенным
@Controller
public class ResultSpringMVC2 {
   @RequestMapping("/rsm2/t1")
   public String test1(){
       
       return "test";
  }

   @RequestMapping("/rsm2/t2")
   public String test2(){
       
       return "redirect:/index.jsp";
       
  }

}

6. Обработка данных

6.1, обработайте данные подачи

1. Представленное доменное имя и параметры метода обработки согласованы

Отправить данные: http: // localhost: 8080/hello? Name = kuangshen

Подход :

@RequestMapping("/hello")
public String hello(String name){
   System.out.println(name);
   return "hello";
}
12345

Фоновый выход: Куанген

2. Имя параметра отправленного доменного имени и метода обработки не соответствует

Отправить данные: http: // localhost: 8080/hello? Username = kuangshen

Подход :


@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
   System.out.println(name);
   return "hello";
}
123456

Фоновый выход: Куанген

3. Представленный объект является объектом

Имя атрибута домена формы и объекта, необходимого для отправки, является согласованным, а объекты использования параметров могут

  1. Физический класс

    public class User {
       private int id;
       private String name;
       private int age;
       
       
       
    }
    
    123456789
    
  2. Отправить данные: http: // localhost: 8080/mvc04/user? Name = kuangshen & id = 1 & age = 15

  3. Подход :

    @RequestMapping("/user")
    public String user(User user){
       System.out.println(user);
       return "hello";
    }
    
    123456
    1234567
    

Фоновый вывод: пользователь {id = 1, name=”kuangshen”, age = 15}

ПРИМЕЧАНИЕ. Если используется объект, имя параметра и имя объекта, передаваемые на переднем конце, должны быть согласованными, в противном случае он нулевой.

6.2, данные показывают на передней части

Первый: через ModlandView

Мы всегда были такими раньше.

public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}

1234567891011
123456789101112

Второе: через ModelMap

ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap modelMap){
   
   
   modelMap.addAttribute("name",name);
   System.out.println(name);
   return "hello";
}


12345678910
1234567891011

Третий: через модель

Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
   
   
   model.addAttribute("msg",name);
   System.out.println(name);
   return "test";
}

123456789

6.3, сравнение

Для новичков разница в:

Есть только несколько методов для модели, чтобы использоваться только для хранения данных, что упрощает работу и понимание новичка на объекте модели;
 ModelMap наследует LinkedMap. В дополнение к достижению некоторых методов своих собственных методов, то же наследование метода и характеристики LinkedMap;
 ModlandView может установить логическое представление о возврате при хранении данных для управления прыжком на дисплее.
123

Конечно, в будущем больше соображений развития станет большей производительности и оптимизацией, и вы не можете просто понять это.

Пожалуйста, используйте 80%случаев, чтобы заложить прочную основу, оставшиеся 18%-ные временные исследования, 2%времени для изучения английского языка, официальный документ структуры всегда является лучшим учебником.

7. Решение искаженных проблем

Несчатье

Шаги теста:

1. Мы можем написать представленную форму на домашней странице

<form action="/e/t" method="post"> 
    <input type="text" name="name">
    <input type="submit">
</form>

2. Соответствующий класс обработки в фоновом режиме

@Controller
public class Encoding {
    @RequestMapping("/e/t")
    public String test(Model model,String name){ 
        model.addAttribute("msg",name); 
        return "test"; 
    }}

3. Введите китайский тест и найдите искаженную код

Я должен сказать, что проблема искаженного кода является очень распространенной проблемой в нашей разработке, и это также проблема, которая позволяет нам сделать программу большей!

Spirngmvc решает искаженную код

В прошлом искаженная проблема была решена фильтром, и SpringMVC предоставил нам фильтр, который можно настроить в web.xml.

Изменил файл XML, чтобы перезапустить сервер!

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
        <param-name>encoding</param-name>   
        <param-value>utf-8</param-value>  
    </init-param>
</filter>
<filter-mapping> 
    <filter-name>encoding</filter-name>  
    <url-pattern>/*</url-pattern>
</filter-mapping>

Но мы обнаружили, что в некоторых экстремальных ситуациях. Этот фильтр плохая поддержка для получения.

Окончательное решение

Подход :

1. Измените файл конфигурации Tomcat: Установите кодирование!

<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"          connectionTimeout="20000"          redirectPort="8443" />

2. Индивидуальный фильтр

package com.kuang.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;


public class GenericEncodingFilter implements Filter {

   @Override
   public void destroy() {
  }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       
       HttpServletResponse myResponse=(HttpServletResponse) response;
       myResponse.setContentType("text/html;charset=UTF-8");

       
       HttpServletRequest httpServletRequest = (HttpServletRequest) request;
       
       HttpServletRequest myrequest = new MyRequest(httpServletRequest);
       chain.doFilter(myrequest, response);
  }

   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
  }

}


class MyRequest extends HttpServletRequestWrapper {

   private HttpServletRequest request;
   
   private boolean hasEncode;
   
   public MyRequest(HttpServletRequest request) {
       super(request);
       this.request = request;
  }

   
   @Override
   public Map getParameterMap() {
       
       String method = request.getMethod();
       if (method.equalsIgnoreCase("post")) {
           
           try {
               
               request.setCharacterEncoding("utf-8");
               return request.getParameterMap();
          } catch (UnsupportedEncodingException e) {
               e.printStackTrace();
          }
      } else if (method.equalsIgnoreCase("get")) {
           
           Map<String, String[]> parameterMap = request.getParameterMap();
           if (!hasEncode) { 
               for (String parameterName : parameterMap.keySet()) {
                   String[] values = parameterMap.get(parameterName);
                   if (values != null) {
                       for (int i = 0; i < values.length; i++) {
                           try {
                               
                               values[i] = new String(values[i]
                                      .getBytes("ISO-8859-1"), "utf-8");
                          } catch (UnsupportedEncodingException e) {
                               e.printStackTrace();
                          }
                      }
                  }
              }
               hasEncode = true;
          }
           return parameterMap;
      }
       return super.getParameterMap();
  }

   
   @Override
   public String getParameter(String name) {
       Map<String, String[]> parameterMap = getParameterMap();
       String[] values = parameterMap.get(name);
       if (values == null) {
           return null;
      }
       return values[0]; 
  }

   
   @Override
   public String[] getParameterValues(String name) {
       Map<String, String[]> parameterMap = getParameterMap();
       String[] values = parameterMap.get(name);
       return values;
  }
}

Это также написано некоторыми великими богами, которые я искал в Интернете. Как правило, искаженная обработка SpringMVC по умолчанию может быть хорошо решена!

Затем настройте этот фильтр в web.xml!

Число искаженных, вам нужно обратить на это больше внимания. Где вы можете установить кодирование как можно больше, вы можете установить его на единое кодирование UTF-8!

8. Интерактивная обработка JSON

8.1, что такое JSON?

  • JSON (обозначение объекта JAVASCRPE (JS Object Mark) – это легкий формат обмена данными, который в настоящее время широко используется.
  • Используйте полностью независимо от языка программированиятекстовый форматХранить и представлять данные.
  • Простая и четкая иерархическая структура делает JSON идеальным языком обмена данными.
  • Его легко читать и писать, а также легко анализировать и генерировать машины и эффективно повышает эффективность передачи сети.

На языке JavaScript все является объектом. Следовательно, любой тип, поддерживаемый JavaScript, может быть представлен JSON, таким как строка, числа, объекты, массивы и т. Д. Посмотрите на его требования и грамматические форматы:

  • Объект выражается в виде пары значений ключей, а данные разделены запятыми
  • Целочный объект сохранения кронштейнов
  • Поселение квадратных скобок

Пара значений ключей JSONЭто способ сохранить объект JavaScript. Он также похож на написание объекта JavaScript. Ключ/значение на ключевом имени в комбинации записано впереди и обертывается с двойными кавычками, а толстая кишка разделен: разделяется, а затем соблюдается значение:

{"name": "QinJiang"}
{"age": "3"}
{"sex": "мужчина"}

1234
12345

Многие люди не знают отношения между JSON и JavaScript, и даже никого нет. На самом деле, вы можете понять это:

JSON – это строковое представление объекта JavaScript. Он использует текст для представления информации о объекте JS, которая по сути является строкой.

var obj = {a: 'Hello', b: 'World'}; 
var json = '{"a": "Hello", "b": "World"}'; 

8.2、Объекты JSON и JavaScript поворачивают друг друга

Чтобы реализовать переход от строки JSON к объекту JavaScript, используйте метод json.parse ():

var obj = JSON.parse('{"a": "Hello", "b": "World"}');


Чтобы реализовать преобразование из JavaScript в строку JSON, используя метод json.stringify ():

var json = JSON.stringify({a: 'Hello', b: 'World'});


Тест кода

  1. Создайте новый модуль, SpringMVC-05-JSON, добавьте веб-поддержку

  2. Создайте новый json -.html в веб -каталоге, чтобы написать тестовый контент

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Json_ Qinjiang</title>
    </head>
    <body>
    
    <script type="text/javascript">
       
       var user = {
           name:"Qinjiang",
           age:3,
           sex:"мужчина"
      };
       
       var str = JSON.stringify(user);
       console.log(str);
       
       
       var user2 = JSON.parse(str);
       console.log(user2.age,user2.name,user2.sex);
    
    </script>
    
    </body>
    </html>
    
  3. Используйте браузер, чтобы открыть идею, чтобы просмотреть вывод консоли!

8.3, контроллер возвращает данные JSON

  • Джексон должен быть лучшим инструментом для анализа JSON

  • Конечно, есть больше, чем этот инструмент, например, Fastjson Алибабы.

  • Мы используем Джексон здесь, используя его для импорта пакета JAR;

    
    <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>2.9.8</version>
    </dependency>
    123456
    
  • Настройте конфигурацию, требуемую Springmvc

    • (web.xml)

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
              version="4.0">
      
         
         <servlet>
             <servlet-name>SpringMVC</servlet-name>
             <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             
             <init-param>
                 <param-name>contextConfigLocation</param-name>
                 <param-value>classpath:springmvc-servlet.xml</param-value>
             </init-param>
             
             <load-on-startup>1</load-on-startup>
         </servlet>
      
         
         <servlet-mapping>
             <servlet-name>SpringMVC</servlet-name>
             <url-pattern>/</url-pattern>
         </servlet-mapping>
      
         <filter>
             <filter-name>encoding</filter-name>
             <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
             <init-param>
                 <param-name>encoding</param-name>
                 <param-value>utf-8</param-value>
             </init-param>
         </filter>
         <filter-mapping>
             <filter-name>encoding</filter-name>
             <url-pattern>/</url-pattern>
         </filter-mapping>
      
      </web-app>
      
    • springmvc-servlet.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:mvc="http://www.springframework.org/schema/mvc"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/mvc
             https://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
         
         <context:component-scan base-package="com.kuang.controller"/>
      
         
         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
               id="internalResourceViewResolver">
             
             <property name="prefix" value="/WEB-INF/jsp/" />
             
             <property name="suffix" value=".jsp" />
         </bean>
      
      </beans>
      
    • Мы случайно пишем класс объектов пользователя, а затем пишем наш тестовый контроллер;

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
          private int id;
          private String name;
        private int age;
      }
      12345678
      
    • Здесь нам нужны две новые вещи, одна – @ResponseBody, а другая – объект ObjectMapper. Мы смотрим на конкретное использование

      Написать контроллер;

      @Controller
      public class UserController {
      @RequestMapping("/j1")
          @ResponseBody
          public String json1() throws JsonProcessingException {
              
              ObjectMapper mapper = new ObjectMapper();
      
              
              User user = new User(1, "Qinjiang № 1", 12);
              
      
              String str = mapper.writeValueAsString(user);
              return str;
          }
      123456789101112131415
      
    • Вступление в китайское в это время будет производить искаженную код

      
      @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
      
      123
      1234
      
    • Настройте Tomcat, запустите тест! http: // localhost: 8080/j1

[Примечание: используйте JSON, чтобы не забыть иметь дело с искаженными персонажами]

8.4 Оптимизация кода

Сплошным искаженным

Предыдущий метод более неприятно. Если в проекте есть много запросов, каждый из них должен быть добавлен. Вы можете равномерно указать его через конфигурацию пружины, чтобы вам не приходилось иметь дело с ним каждый раз!

Мы можем добавить сообщение в файл конфигурации Springmvc.

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <constructor-arg value="UTF-8"/>
       </bean>
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="failOnEmptyBeans" value="false"/>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>
1234567891011121314

Вернитесь в json String Uniform Solution

  • @ResponseBody Solution (каждый метод должен быть добавлен, он не рекомендуется)

    @Controller
    public class UserController {
       
       @RequestMapping(value = "/json1")
       @ResponseBody
       public String json1() throws JsonProcessingException {
           
           ObjectMapper mapper = new ObjectMapper();
           
           User user = new User(1, "Qinjiang № 1", 12);
           
           String str = mapper.writeValueAsString(user);
           
           return str;
      }
    }
    12345678910111213141516
    
  • @RestController(Просто добавьте его непосредственно в класс)

    @RestController
    public class UserController {
       @RequestMapping(value = "/j1")
       public String json1() throws JsonProcessingException {
           
           ObjectMapper mapper = new ObjectMapper();
           
           User user = new User(1, "Qinjiang № 1", 12);
           
           String str = mapper.writeValueAsString(user);
           return str;
      }
    
    }
    
    123456789101112131415
    

8.5.

Добавить новый метод

@RequestMapping("/j2")
public String json2() throws JsonProcessingException {

    
    ObjectMapper mapper = new ObjectMapper();
    
   	User user1 = new User(1, "Qinjiang № 1", 12);
    User user2 = new User(2, "Qinjiang № 2", 12);
    User user3 = new User(3, "Qinjiang № 3", 12);
    User user4 = new User(4, "Qinjiang № 4", 12);
    User user5 = new User(5, "Qinjiang № 5", 12);
    List<User> list = new ArrayList<User>();
    list.add(user1);
    list.add(user2);
    list.add(user3);
    list.add(user4);
    list.add(user5);
    
    String str = mapper.writeValueAsString(list);
    return str;
}

12345678910111213141516171819202122

Результаты: очень идеально, нет проблем!

8.6, объект вывода времени

  • Добавить новый метод

    @RequestMapping("/j3")
    public String json3() throws JsonProcessingException {
    
       ObjectMapper mapper = new ObjectMapper();
    
       
       Date date = new Date();
       
       String str = mapper.writeValueAsString(date);
       return str;
    }
    
    
  • Результат работы:

  • Формат даты по умолчанию станет числом, миллисекунды с 1 января 1970 года до текущей даты!

  • Джексон по умолчанию преобразовать время в форму временных метков

Решение: отменить форму TimessTamps, настраивать формат времени

@RequestMapping("/j3")
public String json4() throws JsonProcessingException {

   ObjectMapper mapper = new ObjectMapper();

   
   mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
   
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   
   mapper.setDateFormat(sdf);

   Date date = new Date();
   String str = mapper.writeValueAsString(date);

   return str;
}

123456789101112131415161718

Запустите результаты: успешный вывод!

Нарисуйте как класс инструментов

Если вы хотите использовать его часто, это более хлопотно, мы можем инкапсулировать этот код в класс инструментов; мы напишем его

public class JsonUtils {
    public static String getJson(Object object) {
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }
    public static String getJson(Object object, String dateFormat) {
        ObjectMapper mapper = new ObjectMapper();

        
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        

        
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        mapper.setDateFormat(sdf);

        try {
            
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

}
12345678910111213141516171819202122232425

Когда мы используем класс инструментов, код более краткий!

@RequestMapping("/j3")
    public String json3(){

        Date date = new Date();

        return JsonUtils.getJson(date,"yyyy-MM-dd HH:mm:ss");
    }
}
12345678

Большая заслуга! Идеальный!

8.7、FastJson

Fastjson.jar – это пакет, разработанный Ali для Java Development, который может легко реализовать преобразование объектов JSON и Javabean Objects, реализовать преобразование Javabean Objects и String String и реализуйте преобразование объектов JSON и строки JSON. Есть много способов реализации JSON, и результаты окончательной реализации одинаковы.

Зависимость от помпона Fastjson!

<dependency>
    <groupId>com.alibaba</groupId> 
    <artifactId>fastjson</artifactId>  
    <version>1.2.60</version>
</dependency>

Fastjson три основных класса:

  1. JsonObject представляет
    • JsonObject реализовал интерфейс карты, предполагая, что основная операция JSonObject была реализована MAP.
    • JsonObject соответствует объекту JSON, и данные в объекте JSON можно получить с помощью различных форм методов get (). Сущность. Его сущность завершена путем реализации интерфейса карты и вызывшего метода в интерфейсе.
  2. Jsonaray представляет массив объектов JSON
    • В интерфейсе списка есть метод для завершения операции.
  3. JSON представляет преобразование JSONOBJECT и JSONARRAY
    • Анализ и использование исходного кода JSON
    • Внимательно соблюдайте эти методы, главным образом для реализации объектов JSON, массивов объектов JSON, Javabean -объектов и преобразования струн JSON.

Тест кода, мы создаем новый класс FastJsondemo

@RequestMapping("/j4")
    
    public String json4(){

        User user1 = new User(1, "Qinjiang № 1", 12);
        User user2 = new User(2, "Qinjiang № 2", 12);
        User user3 = new User(3, "Qinjiang № 3", 12);
        User user4 = new User(4, "Qinjiang № 4", 12);
        User user5 = new User(5, "Qinjiang № 5", 12);

        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        list.add(user5);

        System.out.println("******* Java Object to Json String ********");
        String str1 = JSON.toJSONString(list);
        System.out.println("JSON.toJSONString(list)==>"+str1);
        String str2 = JSON.toJSONString(user1);
        System.out.println("JSON.toJSONString(user1)==>"+str2);

        System.out.println("\ n ******* json String to java объект *******");
        User jp_user1=JSON.parseObject(str2,User.class);
        System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);

        System.out.println("\ n ******* java -объект объекта Json *******");
        JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
        System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));

        System.out.println("\ n ******* json объект Java Object *******");
        User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
        System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);

        return JSON.toJSONString(list);
    }

1234567891011121314151617181920212223242526272829303132333435363738

Нам нужно только овладеть использованием этого инструмента, и когда мы его используем, мы найдем соответствующую реализацию в соответствии с конкретным бизнесом. Как и предыдущий инструментарий Commons-IO, просто используйте его!

9. Interceptor+загрузка файла загрузка загрузки

Обзор

Процессор SpringMVC перехватчика аналогична фильтрующим фильтру в разработке сервлета, который используется для предварительной обработки и пост -обработки процессора. Разработчики могут определить некоторые перехватчики для достижения конкретных функций.

Разница между фильтром и перехватчиком:

Перехватчик – это конкретное применение мысли AOP.

фильтр

  • Часть спецификации сервлета может использоваться любой веб -проект Java
  • После настройки/*в URL-паттерне вы можете перехватить все ресурсы, к которым вы хотите получить доступ

Перехватчик

  • Перехватчик – это сама структура SpringMVC, и можно использовать только проект с использованием структуры SpringMVC.
  • Перехватчик будет перехватывать только метод управления доступом. Если вы получаете доступ к JSP/HTML/CSS/Image/JS, он не будет перехватывать

Индивидуальный перехватчик

Как достичь перехватчика?

Если вы хотите настроить перехватчик, вы должны реализовать интерфейс Handlerinterceptor.

1. Создайте новый Moudule, SpringMVC-07-Interceptor, добавьте веб-поддержку

2. Настройте файл web.xml и springmvc-service.xml

3. Напишите перехватчик

package com.kuang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class MyInterceptor implements HandlerInterceptor {

   
   
   
   public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
       System.out.println("-----------------------------------------");
       return true;
  }

   
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
       System.out.println("------------------------------------------------- -------- ");
  }

   
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
       System.out.println("------------ Уборка --------------------------------------- -----------------------);
  }
}

4. Настройте перехватчик в файле конфигурации Springmvc


<mvc:interceptors>
   <mvc:interceptor>
       
       
       
       <mvc:mapping path="/**"/>
       
       <bean class="com.kuang.interceptor.MyInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>

5. Напишите контроллер и получите запрос

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class InterceptorController {

   @RequestMapping("/interceptor")
   @ResponseBody
   public String testFunction() {
       System.out.println(«Метод в контроллере выполняется»);
       return "hello";
  }
}

6. Индекс переднего конца.jsp

<a href=" $ {pageecontext.request.contextpath }/interceptor"> тест перехвата </a>

7. Начните тест Tomcat!

[ , , (img-DhQwZAai-1614607413906)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

Случай

Убедитесь, входит ли пользователь (сертифицированный пользователь)

Выполнение

1. Существует страница входа, которая должна написать страницу доступа к контроллеру.

2. На странице входа есть действие, чтобы отправить форму. Нужно обрабатывать в контроллере. Определите, правильным ли пароль имени пользователя. Если это правильно, напишите информацию пользователя в сеанс.Вернитесь на землю успешно.

3. Перехватывает запросы пользователей, чтобы определить, входят ли пользователи. Если пользователь вошел в систему. Воспроизвести, если пользователь не может войти в систему, перейдите на страницу входа в систему

тестовое задание:

1. Напишите страницу входа в систему.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>

<h1> страница входа </h1>
<hr>

<body>
<form action="${pageContext.request.contextPath}/user/login">
     Имя пользователя: <input type = "text" name = "username"> <br>
       : <input type = "password" name = "pwd"> <br>
       <input type = "Отправить" value = "Recod">
</form>
</body>
</html>

2. Напишите запрос на обработку контроллера

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/user")
public class UserController {

   
   @RequestMapping("/jumplogin")
   public String jumpLogin() throws Exception {
       return "login";
  }

   
   @RequestMapping("/jumpSuccess")
   public String jumpSuccess() throws Exception {
       return "success";
  }

   
   @RequestMapping("/login")
   public String login(HttpSession session, String username, String pwd) throws Exception {
       
       System.out.println("Получите фронт ==="+username);
       session.setAttribute("user", username);
       return "success";
  }

   
   @RequestMapping("logout")
   public String logout(HttpSession session) throws Exception {
       
       session.invalidate();
       return "login";
  }
}

3. Напишите успешную страницу входа в систему. JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>

 <h1> Войдите в успех страница </h1>
<hr>

${user}
 <a href=" $ {pageecontext.request.contextpath }/user/logout"> зарегистрировано </a>
</body>
</html>

4. Прыжок тестирования на странице индекса! Начните тест Tomcat, вы можете ввести домашнюю страницу без входа в систему!

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head>
   <title>$Title$</title>
 </head>
 <body>
   <h1> домашняя страница </h1>
 <hr>
 <%-логин-%>
   <a href=" $ {pagecontext.request.contextpath }/user/jumplogin"> вход в систему </a>
   <a href=" $ {pagecontext.request.contextpath }/user/jumpsuccess"> страница успеха </a>
 </body>
</html>

5. Напишите пользовательский перехватчик входа в систему

package com.kuang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginInterceptor implements HandlerInterceptor {

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
       
       System.out.println("uri: " + request.getRequestURI());
       if (request.getRequestURI().contains("login")) {
           return true;
      }

       HttpSession session = request.getSession();

       
       if(session.getAttribute("user") != null) {
           return true;
      }

       
       request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
       return false;
  }

   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

  }
   
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

  }
}

6. Зарегистрируйте перехватчик в файле конфигурации Springmvc


<mvc:interceptors>
   <mvc:interceptor>
       <mvc:mapping path="/**"/>
       <bean id="loginInterceptor" class="com.kuang.interceptor.LoginInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>

7. Перезапустите тест Tomcat снова!

ОК, функция перехвата в логике теста верна.

Загрузка и загрузка файла

Подготовка

Загрузка файла является одной из наиболее распространенных функций в разработке проекта. SpringMVC может хорошо поддерживать загрузку файлов, но по умолчанию SpringMVC не оснащен многоуровневым по умолчанию, поэтому он не может обрабатывать работу по загрузке файла по умолчанию. Если вы хотите использовать функцию загрузки файла Spring, вам необходимо настроить Multiprtresolver в контексте.

Требование фронтальной формы: чтобы загрузить файл, метод формы должен быть установлен для публикации, а Enctype установлен на Multipart/Form-Data. Только в этом случае браузер может отправить файлы, выбранные пользователем на сервер с двоичными данными;

Подробное объяснение атрибута Entype в форме:

  • Application/xwww = form-urlencoded: метод по умолчанию, только значение атрибута значения в домене формы, форма этого метода кодирования будет обрабатывать значение в домене таблицы в метод кодирования URL.
  • Multipart/Form-Data: этот метод кодирования будет обрабатывать данные формы бинарным способом. Этот метод кодирования будет инкапсулирован в параметры запроса указанного файла файла файла, который не будет кодироваться для символов.
  • Текст/Plain: За исключением преобразования пространства в «+», другие символы не кодируются. Этот метод применим для отправки электронных писем непосредственно через форму.
<form action="" enctype="multipart/form-data" method="post">
   <input type="file" name="file"/>
   <input type="submit">
</form>

После того, как Econompe установлен на Multipart/Form-Data, браузер будет использовать двоичный поток для обработки данных формы, а обработка загрузки файлов включает в себя разрешение исходного ответа HTTP на стороне сервера. В 2003 году Apache Software Foundation выпустил компонент FileUpload с открытым исходным кодом, который вскоре стал лучшим выбором для загруженных файлов Servlet/JSP.

  • Спецификация Servlet3.0 предоставила методы для обработки загрузки файлов, но эта загрузка должна быть завершена в службе.
  • Spring MVC обеспечивает более простую упаковку.
  • Spring MVC обеспечивает прямую поддержку загрузки файлов. Эта поддержка реализована с помощью Multipartresolver.
  • Spring MVC использует технологию Apache Commons FileUpload для получения многократного класса реализации:
  • Commontmultipartresolver. Таким образом, загрузка файла SpringMVC также должна полагаться на компоненты Apache Commons FileUpload.
Файл загружен

1. Импорт пакет JAR, загруженный файлом, Commons-FileUpload, Maven автоматически поможет нам импортировать свой зависимый пакет пакета Commons-IO;


<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.3</version>
</dependency>

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>4.0.1</version>
</dependency>

2. Настройте Bean: Multiprestrover

Уведомление! Пересечение Пересечение Идентификатор этого Bena должен быть: Multipartresolver, в противном случае файл загрузки сообщит о 400 ошибках! Положите яму сюда, научите!


<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   
   <property name="defaultEncoding" value="utf-8"/>
   
   <property name="maxUploadSize" value="10485760"/>
   <property name="maxInMemorySize" value="40960"/>
</bean>

Общие методы CommonsmultipartFile:

  • String getRiginalfilename (): получить исходное имя загруженного файла
  • InputStream getInputStream (): Получите поток файлов
  • Void TransferTO (File DEST): Сохраните загруженный файл в файл каталога

Давайте перейдем к фактическому тесту

3. Напишите страницу на первой странице

<form action="/upload" enctype="multipart/form-data" method="post">
 <input type="file" name="file"/>
 <input type="submit" value="upload">
</form>

4、Controller

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;

@Controller
public class FileController {
   
   
   @RequestMapping("/upload")
   public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {

       
       String uploadFileName = file.getOriginalFilename();

       
       if ("".equals(uploadFileName)){
           return "redirect:/index.jsp";
      }
       System.out.println("Загрузить имя файла:"+uploadFileName);

       
       String path = request.getServletContext().getRealPath("/upload");
       
       File realPath = new File(path);
       if (!realPath.exists()){
           realPath.mkdir();
      }
       System.out.println("Загрузить файл сохранение файла:"+realPath);

       InputStream is = file.getInputStream(); 
       OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); 

       
       int len=0;
       byte[] buffer = new byte[1024];
       while ((len=is.read(buffer))!=-1){
           os.write(buffer,0,len);
           os.flush();
      }
       os.close();
       is.close();
       return "redirect:/index.jsp";
  }
}

5. Проверьте файлы загрузки, ОК!

Используйте file.transto для сохранения загруженных файлов

1. Контроллер записи


@RequestMapping("/upload2")
public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {

   
   String path = request.getServletContext().getRealPath("/upload");
   File realPath = new File(path);
   if (!realPath.exists()){
       realPath.mkdir();
  }
   
   System.out.println("Загрузить файл сохранение файла:"+realPath);

   
   file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));

   return "redirect:/index.jsp";
}

2. Измените изменение адреса отправки формы -энд.

3. Посетите тест подчинения, ОК!

Загрузить документ

Шаг загрузки файла:

1. Установите заголовок ответа

2. Читать файл -inputStream

3. Напишите файл -OutputStream

4. Операция выполнения

5. Закройте поток (сначала откройте, а затем выключите)

Код:

@RequestMapping(value="/download")
public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{
   
   String  path = request.getServletContext().getRealPath("/upload");
   String  fileName = "Основная грамматика .jpg";

   
   response.reset(); 
   response.setCharacterEncoding("UTF-8"); 
   response.setContentType("multipart/form-data"); 
   
   response.setHeader("Content-Disposition",
           "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));

   File file = new File(path,fileName);
   
   InputStream input=new FileInputStream(file);
   
   OutputStream out = response.getOutputStream();

   byte[] buff =new byte[1024];
   int index=0;
   
   while((index= input.read(buff))!= -1){
       out.write(buff, 0, index);
       out.flush();
  }
   out.close();
   input.close();
   return null;
}

внешний интерфейс

<a href="/download"> нажмите, чтобы загрузить </a>
   File realPath = new File(path);
   if (!realPath.exists()){
       realPath.mkdir();
  }
       System.out.println ("Загрузка файла сохранения файла:"+realPath);

       InputStream IS = file.getInputStream (); // Поток ввода файла файла
       OutputStream OS = New FileOutputStream (новый файл (realPath, uploadFilename)); // Поток вывода файлов

       // Прочитайте и напишите
   int len=0;
   byte[] buffer = new byte[1024];
   while ((len=is.read(buffer))!=-1){
       os.write(buffer,0,len);
       os.flush();
  }
   os.close();
   is.close();
   return "redirect:/index.jsp";

}
}


 5. Проверьте файлы загрузки, ОК!



 ** Используйте file.transto для сохранения загруженных файлов **

 1. Контроллер записи

```java
/*
 * Используйте file.transto для сохранения загруженных файлов
*/
@RequestMapping("/upload2")
public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {

       // загружать настройки сохранения пути
   String path = request.getServletContext().getRealPath("/upload");
   File realPath = new File(path);
   if (!realPath.exists()){
       realPath.mkdir();
  }
       // загружать адрес файла
   System.out.println ("Загрузка файла сохранения файла:"+realPath);

       // записать файл непосредственно методом CommonsMultipartFile (примечание в настоящее время)
   file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));

   return "redirect:/index.jsp";
}

2. Измените изменение адреса отправки формы -энд.

3. Посетите тест подчинения, ОК!

Загрузить документ

Шаг загрузки файла:

1. Установите заголовок ответа

2. Читать файл -inputStream

3. Напишите файл -OutputStream

4. Операция выполнения

5. Закройте поток (сначала откройте, а затем выключите)

Код:

@RequestMapping(value="/download")
public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{
   
   String  path = request.getServletContext().getRealPath("/upload");
   String  fileName = "Основная грамматика .jpg";

   
   response.reset(); 
   response.setCharacterEncoding("UTF-8"); 
   response.setContentType("multipart/form-data"); 
   
   response.setHeader("Content-Disposition",
           "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));

   File file = new File(path,fileName);
   
   InputStream input=new FileInputStream(file);
   
   OutputStream out = response.getOutputStream();

   byte[] buff =new byte[1024];
   int index=0;
   
   while((index= input.read(buff))!= -1){
       out.write(buff, 0, index);
       out.flush();
  }
   out.close();
   input.close();
   return null;
}

внешний интерфейс

<a href="/download"> нажмите, чтобы загрузить </a>

Тест, скачать файл OK, вы можете сравнить с тем, как мы узнали раньше, вы можете знать, что это гораздо удобнее!

Leave a Comment