①作用:Service层将各种业务封装起来,为Controller层的类提供接口进行调用。
②问题:
⑴为什么要有Service层?
MVC模式采用的是分层设计,各层之间职责分明。如果没有Service层,那么操作数据库、数学计算、调用其他api等(Service的作用)各种服务就会被放在Controller层中,这就导致原本功能明确的的Controller层变得臃肿复杂、逻辑混淆,并且会和Model层出现了业务逻辑粘连的情况,而且不同的控制器(controller)之间没有办法共享通用的业务逻辑,会出现大量重复代码。因此应该将业务逻辑从C层&M层解耦出来,成为独立的Service层。
⑵Service为什么要写分成Service类和Serviceimpl类?
Service只是为Controller提供函数接口,具体实现在Serviceimpl中。将功能的实现和使用分离,接口用于表示功能而实现是具体的使用,功能可以有不同的使用。当然,如果接口只有一个使用的话,那么可以省去接口节约成本。
③编写Service层⑴在com.xxx下创建service包→在service包下创建impl→在service包下创建xxxService接口类→在impl包下创建Serviceimpl类
⑵编写xxxService接口类和xxxServiceimpl类(以下举例)
NewsService类
package com.example.demo3.service;
public interface NewsService {
String get(String title);
}
NewsServiceimpl类
package com.example.demo3.service.impl;
import com.example.demo3.mapper.NewsMapper;
import com.example.demo3.service.NewsService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service //service表明它是一个服务层类,Spring扫描时会将它作为service加载
public class NewsServiceimpl implements NewsService {
@Resource //依赖注入
private NewsMapper newsMapper;
@Override //复写Service接口中的方法时要加override
public String get(String title){
return newsMapper.getnews(title);
}
}
⑶也可以不写impl类,直接将Service接口改为Service类
package com.example.demo3.service;
import com.example.demo3.mapper.NewsMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service //service表明它是一个服务层类,Spring扫描时会将它作为service加载
public class NewsService {
@Resource //依赖注入
private NewsMapper newsMapper;
public String get(String title){
return newsMapper.getnews(title);
}
}
二、Controller层(控制层)
①作用:(①)接收客户端的请求,(②)调用Service层业务逻辑获取数据,然后(③)传递数据给前端。该层应尽量轻薄,避免编写涉及业务处理的代码
②编写Controller层⑴在com.xxx下创建controller包,在controller包下创建xxxController
⑵编写xxxController类(以下举例)
package com.example.demo3.controller;
import com.example.demo3.service.NewsService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/news")
public class NewsController {
@Resource //依赖注入
private NewsService newsService;
@RequestMapping("index")
public String getnews(String title){
return title;
}
}
③注解解释:
⑴@RestController:表示它是一个控制器,Spring在扫描时会把它作为一个控制器加载
前后端分离的开发设计模式下,推荐使用@RestController注解,它相当于@ResponseBody + @Controller的组合使用。
⑵@RequestMapping:
Ⅰ、设置请求路径。
例:类:@RequestMapping("/news") 方法:@RequestMapping("/display")
放在类和方法的前面,指定了对应的请求的url。spring在初始化时会将这些信息解析、存放,当前端发生请求时,如果前端使用/news/display则请求会先被该Controller所拦截然后交给方法。如果前端直接使用/display,spring会通过url找到该方法并将前端请求分配给该方法。
Ⅱ、设置请求方式(默认为POST)
@RequestMapping(value = “/news”, method = RequestMethod.POST)
@GetMapping("news")等价于@RequestMapping(value="/news",method=RequestMethod.GET)
@PostMapping("news")等价@RequestMapping(value="/news",method=RequestMethod.POST)
三、控制器获得前端发送的HTTP请求中的参数的方式注:建议先看JAVA EE项目:(5)前端的前两个知识点,弄清楚概念
①通过Servlet API获取(GET/POST)
@RequestMapping("test")
public .....(HttpServletRequest request){ //HttpSession session也行
String username = request.getParameter("username"); //假设有一个username参数
.......
return ...;
}
spring会自动解析参数request、session,使其相关函数可以很容易得到HTTP请求中的数据,但是不建议使用该方法,因为这样控制器会依赖于Servlet容器
②通过形参获取(GET/POST)
通过参数名称和HTTP请求中的名称保持一致从而直接获取参数值
⑴普通参数
@RequestMapping("test")
public .....(int a,int b){ //假设有参数a和b
System.out.println("a:"+a);
System.out.println("b:"+b);
.......
return ...;
}
⑵pojo对象(DTO,用于参数很多的情况)
@RequestMapping("test")
public .....(DTO dto){ //假设DTO中有参数a和b
System.out.println("a:"+dto.geta());
System.out.println("b:"+dto.getb());
.......
return ...;
}
③通过@RequesetParam注解获取(GET/POST)
当控制器参数和HTTP请求中的参数名称不一致时,参数接收会失败,这时可以用@R。。来解决问题
@RequestMapping("test") //HTTP传过来的是a,而控制器中命名的是b(都是int类型)
public .....(@RequestParam("a") int b){
System.out.println("b:"+b);
.......
return ...;
}
④使用URL传参(restful格式)(只有GET)
使用@PathVariable
⑤传递json参数(POST)
使用@RequestBody
⑥接受列表数据和表单序列化(POST)
四、启动Spring项目后端服务器的方式①添加spring-web依赖:在JAVA EE项目:(2)创建项目的时候已经添加过,如果没添加可以按照里面的指导手动添加
②在application.properties中除了之前添加的还要添加
server.port=8090 //端口号 server.servlet.context-path=/SSM_demo //项目名
③服务器框架搭建完后,在xxxApplication文件中运行main函数,启动服务器



