SSM integrierte detaillierte Lehre (unten)
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
- Interceptor (Interceptor) ist ein Mechanismus zum dynamischen Abfangen von Methodenaufrufen und zum dynamischen Abfangen der Ausführung von Controller-Methoden in SpringMVC
- Wirkung:
- Führen Sie voreingestellten Code vor und nach dem angegebenen Methodenaufruf aus
- Blockieren Sie die Ausführung der ursprünglichen Methode
- 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
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
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
- Anfrage: Anfrageobjekt
- Antwort: Antwortobjekt
- 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