栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA EE项目:(4)SpringMVC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA EE项目:(4)SpringMVC

SpringMVC的结构:Controller层+Service层 一、Service层(业务层)

①作用: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函数,启动服务器

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号