SSM integrierte detaillierte Lehre (unten)

Fügen Sie hier eine Bildbeschreibung ein

5. SSM integrierte Seitenentwicklung

1 Vorbereitungen

Um sicherzustellen, dass auf statische Ressourcen zugegriffen werden kann, muss eine statische Ressourcenfilterung festgelegt werden

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    
    
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
        registry.addResourceHandler("/pages/**")
            .addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**")
            .addResourceLocations("/css/");
        registry.addResourceHandler("/js/**")
            .addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**")
            .addResourceLocations("/plugins/");
    }
}

2 Listenabfragefunktion

  • Front-End-Code
//列表
getAll() {
    
    
    //发送ajax请求
    axios.get("/books").then((res)=>{
    
    
        this.dataList = res.data.data;
    });
}

3 Funktion hinzufügen

  • Front-End-Code
//弹出添加窗口
handleCreate() {
    
    
    this.dialogFormVisible = true;
    this.resetForm();
},
//重置表单
resetForm() {
    
    
    this.formData = {
    
    };
},
//添加
handleAdd () {
    
    
    //发送ajax请求
    axios.post("/books",this.formData).then((res)=>{
    
    
        console.log(res.data);
        //如果操作成功,关闭弹层,显示数据
        if(res.data.code == 20011){
    
    
            this.dialogFormVisible = false;
            this.$message.success("添加成功");
        }else if(res.data.code == 20010){
    
    
            this.$message.error("添加失败");
        }else{
    
    
            this.$message.error(res.data.msg);
        }
    }).finally(()=>{
    
    
        this.getAll();
    });
},
  • Code-Behind-Verbesserungen
@Service
public class BookServiceImpl implements BookService {
    
    
    @Autowired
    private BookDao bookDao;
	//增删改的方法判断了影响的行数是否大于0,而不是固定返回true
    public boolean save(Book book) {
    
    
        return bookDao.save(book) > 0;
    }
	//增删改的方法判断了影响的行数是否大于0,而不是固定返回true
    public boolean update(Book book) {
    
    
        return bookDao.update(book) > 0;
    }
	//增删改的方法判断了影响的行数是否大于0,而不是固定返回true
    public boolean delete(Integer id) {
    
    
        return bookDao.delete(id) > 0;
    }

    public Book getById(Integer id) {
    
    
        if(id < 0){
    
    
            throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
            return bookDao.getById(id);
        }
    }
    public List<Book> getAll() {
    
    
        return bookDao.getAll();
    }
}

4 Änderungsfunktion

  • Popup-Fenster zum Abfragen von Buchinformationen anzeigen
//弹出编辑窗口
handleUpdate(row) {
    
    
    // console.log(row);   //row.id 查询条件
    //查询数据,根据id查询
    axios.get("/books/"+row.id).then((res)=>{
    
    
        // console.log(res.data.data);
        if(res.data.code == 20041){
    
    
            //展示弹层,加载数据
            this.formData = res.data.data;
            this.dialogFormVisible4Edit = true;
        }else{
    
    
            this.$message.error(res.data.msg);
        }
    });
}
  • Speichern Sie geänderte Buchinformationen
//编辑
handleEdit() {
    
    
    //发送ajax请求
    axios.put("/books",this.formData).then((res)=>{
    
    
        //如果操作成功,关闭弹层,显示数据
        if(res.data.code == 20031){
    
    
            this.dialogFormVisible4Edit = false;
            this.$message.success("修改成功");
        }else if(res.data.code == 20030){
    
    
            this.$message.error("修改失败");
        }else{
    
    
            this.$message.error(res.data.msg);
        }
    }).finally(()=>{
    
    
        this.getAll();
    });
}

5 Löschfunktion

// 删除
handleDelete(row) {
    
    
    //1.弹出提示框
    this.$confirm("此操作永久删除当前数据,是否继续?","提示",{
    
    
        type:'info'
    }).then(()=>{
    
    
        //2.做删除业务
        axios.delete("/books/"+row.id).then((res)=>{
    
    
            if(res.data.code == 20021){
    
    
                this.$message.success("删除成功");
            }else{
    
    
                this.$message.error("删除失败");
            }
        }).finally(()=>{
    
    
            this.getAll();
        });
    }).catch(()=>{
    
    
        //3.取消删除
        this.$message.info("取消删除操作");
    });
}

6. Abfangjäger

1 Einführung in Interceptor

Problemimport

Frage 1: Wer ist das vom Abfangjäger abgefangene Objekt?

Frage 2: Was ist der Unterschied zwischen einem Interceptor und einem Filter?

1.1 Konzept und Funktion des Abfangjägers

Bild-20210805175445422

  • Interceptor (Interceptor) ist ein Mechanismus zum dynamischen Abfangen von Methodenaufrufen und zum dynamischen Abfangen der Ausführung von Controller-Methoden in SpringMVC
  • Wirkung:
    1. Führen Sie voreingestellten Code vor und nach dem angegebenen Methodenaufruf aus
    2. Blockieren Sie die Ausführung der ursprünglichen Methode
    3. Zusammenfassung: Verbessert
  • Kernprinzip: AOP-Gedanke

1.2 Der Unterschied zwischen Abfangjägern und Filtern

  • Unterschiedlicher Besitz: Filter gehört zur Servlet-Technologie, Interceptor gehört zur SpringMVC-Technologie
  • Der Abfanginhalt ist unterschiedlich: Filter verbessert den gesamten Zugriff und Interceptor verbessert nur den SpringMVC-Zugriff

Bild-20210805175539717

2 Erste-Schritte-Fall

Problemimport

Welche Schnittstelle muss ein Interceptor implementieren?

2.1 Implementierung des Interceptor-Codes

[Schritt 1] Definieren Sie den Interceptor

Methode: Definieren Sie eine Klasse und implementieren Sie die HandlerInterceptor-Schnittstelle

@Component //注意当前类必须受Spring容器控制
//定义拦截器类,实现HandlerInterceptor接口
public class ProjectInterceptor implements HandlerInterceptor {
    
    
    @Override
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle..."+contentType);
        return true;
    }

    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...");
    }

    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion...");
    }
}
[Schritt 2] Konfigurieren Sie den Lade-Interceptor
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置拦截器
        registry.addInterceptor(projectInterceptor)
            .addPathPatterns("/books","/books/*");
    }
}

Verwenden Sie die Standardschnittstelle WebMvcConfigurer, um die Entwicklung zu vereinfachen (Hinweis: starkes Eindringen).

@Configuration
@ComponentScan({
    
    "com.sun.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置多拦截器
        registry.addInterceptor(projectInterceptor)
            .addPathPatterns("/books","/books/*");
    }
}

2.2 Analyse des Interceptor-Prozesses

Bild-20210805180846313

3 Interceptor-Parameter

Problemimport

Die Methoden postHandle() und afterCompletion() werden beide ausgeführt, nachdem die Prozessormethode ausgeführt wurde. Was ist der Unterschied?

3.1 Vorverarbeitung

//原始方法调用前执行的内容
//返回值类型可以拦截控制的执行,true放行,false终止
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
    System.out.println("preHandle..."+contentType);
    return true;
}
  • Parameter

    1. Anfrage: Anfrageobjekt
    2. Antwort: Antwortobjekt
    3. Handler: Das aufgerufene Prozessorobjekt ist im Wesentlichen ein Methodenobjekt, das das Methodenobjekt in Reflexionstechnologie neu verpackt
  • Rückgabewert
    Wenn der Rückgabewert falsch ist, wird der abgefangene Prozessor nicht ausgeführt.

3.2 Nachbearbeitung

//原始方法调用后执行的内容
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
    System.out.println("postHandle...");
}
  • Parameter
    modelAndView: Wenn die Prozessorausführung abgeschlossen ist und ein Rückgabeergebnis vorliegt, können Sie die entsprechenden Daten und Seiteninformationen lesen und springen

Hinweis: Wenn in der Handler-Methode eine Ausnahme auftritt, wird die Methode nicht ausgeführt

3.3 Bearbeitung nach Fertigstellung

//原始方法调用完成后执行的内容
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
    System.out.println("afterCompletion...");
}
  • Parameterbeispiel
    : Wenn während der Ausführung des Prozessors ein Ausnahmeobjekt auftritt, kann es separat für die Ausnahme behandelt werden

Hinweis: Diese Methode wird unabhängig davon ausgeführt, ob innerhalb der Handler-Methode eine Ausnahme auftritt.

4 Konfiguration der Abfangkette

Problemimport

Was ist eine Abfangkette?

4.1 Mehrere Interceptor-Konfigurationen

  • Definieren Sie den zweiten Interceptor
@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle...222");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...222");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion...222");
    }
}
  • Konfigurieren Sie den zweiten Interceptor
@Configuration
@ComponentScan({
    
    "com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置多拦截器
        registry.addInterceptor(projectInterceptor)
            .addPathPatterns("/books","/books/*");
        registry.addInterceptor(projectInterceptor2)
            .addPathPatterns("/books","/books/*");
    }
}

4.2 Workflow-Analyse mit mehreren Konnektoren

  • Wenn mehrere Interceptoren konfiguriert sind, wird eine Interceptor-Kette gebildet
  • Die laufende Reihenfolge der Abfangjägerkette bezieht sich auf die Reihenfolge, in der die Abfangjäger hinzugefügt werden
  • Wenn der ursprüngliche Prozessor im Interceptor abgefangen wird, werden alle nachfolgenden Interceptoren beendet
  • Wenn der Interceptor unterbrochen wird, wird nur die im vorherigen Interceptor konfigurierte AfterCompletion-Operation ausgeführt

Bild-20210805181537718

Supongo que te gusta

Origin blog.csdn.net/qq_51808107/article/details/130540939
Recomendado
Clasificación