使用Springboot完成web项目后端开发

SpringBoot项目后端开发流程

导入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.5.RELEASE</version>
</parent>
<dependencies>
    <!--web启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

创建入口类

@SpringBootApplication
public class UserApp {
    
    
    public static void main(String[] args) {
    
    
        //      参数1 当前入口类的类对象  参数2 main函数的参数
        SpringApplication.run(UserApp.class,args);
    }
}

创建配置文件application.yaml

#项目端口号
server:
  port: 9090
  servlet:
  #项目名称:springboot项目访问时候默认没有项目名
    context-path: /UserModel

Springboot集成mybatis

将mybatis的核心组件交由spring的工厂进行管理

引入依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.31</version>
</dependency>
<!--整合mybatis启动器-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.3</version>
</dependency>

dao层,service层编码

在resources目录下创建mybatis-mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.baizhi.dao.IUserDAO">
    <!--用户注册-->
    <insert id="saveUser" parameterType="com.baizhi.entity.User">
        insert into t_user(id,name,password,sex,photo,birthday,email)
        values (#{user.id},#{user.name},#{user.password},#{user.sex},#{user.photo},#{user.birthday},#{user.email})
    </insert>

    <!--根据用户名称和密码查询用户-->
    <select id="queryUserByNameAndPassword" parameterType="com.baizhi.entity.User" resultType="com.baizhi.entity.User">
        select id,name,password,sex,photo,birthday,email from t_user
    </select>
</mapper>

构建mybatis的配置信息

server:
  port: 9090
  servlet:
    context-path: /UserModel
    jsp:
      init-parameters:
        development: true
  tomcat:
    uri-encoding: UTF-8
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/upload?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  mvc:
    view:
      prefix: /
      suffix: .jsp
#post表单乱码提交
  http:
    encoding:
      charset: utf-8
#文件上传
  servlet:
    multipart:
      enabled: true
      max-file-size: 1MB
      location: D://Uninstall
mybatis:
  type-aliases-package: com.baizhi.entity
  mapper-locations: classpath:com/baizhi/mapper/*.xml
#开启mybatis的批处理,提升sql效率
  executor-type: batch

在入口类中添加注解指定要扫描的包

@MapperScan(basePackages = "com.baizhi.dao")

在xml的配置时会产生 There is no getter for property named ‘user’ in 'class**问题

mybatis会自动识别user对象的值,传到xml文件中,所以需要给对象指定映射。在userDao方法中给user对象添加上@Param注解,可解决这个问题。
int addUser(@Param("user") User user);

Springboot集成jsp

1.导入jsp解析支持的相关jar

<!--使内嵌的tomcat支持解析jsp-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!--引入jsp的支持-->
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

2.配置视图解析器

#添加视图解析器
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

3.通过插件形式启动 或idea的项目中右上角edit更改environment

4.配置页面的热部署

#提供页面热部署
server:
  jsp-servlet:
    init-parameters:
      development: true

自定义实现dao,service,controller

Controller的实现方式如下

/**
 * @RestController: 等价 @Controller + @ResponseBody
 * @RequestMapping: 请求映射,在Spring4.0注解开发中对RequestMapping进行丰富,分别按照请求类型
 *      - @PostMapping   新增
 *      - @GetMapping    查询
 *      - @PutMapping    修改
 *      - @DeleteMapping 删除
 * @RequestParam: 接收表单参数
 */
@RestController
@RequestMapping(value = "/formUserManager")
public class FormUserController {
    
    

    private static final Logger LOGGER= LoggerFactory.getLogger(FormUserController.class);
    @Autowired
    IUserService userService;
	//参数multipartFile是一个文件
    @PostMapping(value = "/registerUser")
    public User registerUser(User user,
        @RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException{
    
    
        //对文件进行初步处理,获取前缀,后缀并进行打印
        if(multipartFile!=null){
    
    
            String fileName=multipartFile.getOriginalFilename();
            String suffix=fileName.substring(fileName.lastIndexOf("."));
            File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
            System.out.println(tmpFile.getName());
            tmpFile.delete();
        }
        userService.saveUser(user);
        return user;
    }

    @PostMapping(value = "/userLogin")
    public User userLogin(User user){
    
    
        return userService.queryUserByNameAndPassword(user);
    }

    @PutMapping(value = "/updateUser")
    public void updateUser(User user,
                           @RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException{
    
    
        if(multipartFile!=null){
    
    
            String fileName=multipartFile.getOriginalFilename();
            String suffix=fileName.substring(fileName.lastIndexOf("."));
            File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
            System.out.println(tmpFile.getName());
            tmpFile.delete();
        }
        userService.updateUser(user);
    }

    @DeleteMapping(value = "/deleteUserByIds")
    public void delteUserByIds(@RequestParam(value = "ids") Integer[] ids){
    
    
        userService.deleteByUserIds(ids);
    }

    @GetMapping(value = "/queryUserByPage")
    public List<User> queryUserByPage(@RequestParam(value = "page",defaultValue = "1") Integer pageNow,
                                      @RequestParam(value = "rows",defaultValue = "10") Integer pageSize,
                                      @RequestParam(value = "column",required = false) String column,
                                      @RequestParam(value = "value",required = false) String value){
    
    
        HashMap<String, Object> results = new HashMap<>();
        results.put("total",userService.queryUserCount(column,value));
        results.put("rows",userService.queryUserByPage(pageNow,pageSize,column,value));
        return userService.queryUserByPage(pageNow,pageSize,column,value);
    }

    @GetMapping(value = "/queryUserById")
    public User queryUserById(@RequestParam(value = "id") Integer id){
    
    
        User user = userService.queryUserById(id);
        return user;
    }

}

项目Controller接口测试

项目的dao,service,controller开发完成后,可以自行使用postman进行测试,也可以只用RestTemplate对项目进行测试。

在springboot的入口类上加入RestTemplate类

@SpringBootApplication
@MapperScans(value ={
    
    
        @MapperScan(basePackages = "com.baizhi.dao")
})
public class UserModelRestApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(UserModelRestApplication.class,args);
    }
    //SpringMVC中自带的一个Rest客户端工具,可以无缝和SpringBoot集成
    @Bean
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
}

将controller中的类复制一份到test文件夹下的包中,去掉原来的注解,更换为springboot测试的注解,在将controller中的每一个方法去掉实现,并用 // 注释掉,为每一个方法重新写一个测试方法

import static org.junit.Assert.*;
@SpringBootTest(classes = UserApp.class)
@RunWith(SpringRunner.class)
public class FormUserControllerTest {
    
    
    @Autowired
    private RestTemplate restTemplate;
    private String prefix="http://localhost:9090/UserModel/formUserManager";

    //    @PostMapping(value = "/registerUser")
    //    public User registerUser(User user,
    //        @RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException

    //用户注册信息
    @Test
    public void testRegisterUser(){
    
    
        //具体链接
        String url=prefix+"/registerUser";
        //构建表单参数(由于要传递文件所以使用MultiValueMap)
        MultiValueMap<String,Object> formData=new LinkedMultiValueMap<>();
        formData.add("name","王小五1");
        formData.add("password","123456");
        formData.add("sex","true");
        formData.add("birthDay","2018-01-26");
        formData.add("photo","user.png");
        formData.add("email","[email protected]");
        //上传文件信息 (上传的文件名不能为中文,否则出现500异常)
        FileSystemResource fileSystemResource=new FileSystemResource("D:\\桌面壁纸/timg.jpg");
        formData.add("multipartFile",fileSystemResource);
        //提交请求
        User user = restTemplate.postForObject(url, formData, User.class);
        assertNotNull("用户",user);
        System.out.println(user);
    }
    
    //删除用户信息
    @Test
    public void testDelteUserByIds(){
    
    
        String url=prefix+"/deleteUserByIds?ids={ids}";
        HashMap<String,Object> params=new HashMap<>();
        params.put("ids","10,11,12");
        restTemplate.delete(url,params);
    }
    
        @Test
    public void testQueryUserByPage(){
    
    
        String url=prefix+"/queryUserByPage?page={page}&rows={rows}&column={column}&value={value}";
        Map<String,Object> params=new HashMap<>();
        params.put("page",1);
        params.put("rows",5);
        params.put("column","name");
        params.put("value","b");
        restTemplate.getForObject(url,User[].class,params);
    }
    //使用Map,还是MultiValueMap看restTemplate调用方法时所需要的参数,如果使用Map,就要在url上添加传递的参数
}

测试时候注意,idea的注解自动生成的类对象的 Get,Set 方法可能有问题,如果在service层出现调用不了属性的 Get、Set方法时可以自己再写对应的Get、Set方法。

使用 restTemplate 测试controller层接口时,必须先启动springboot入口类,否则会出现Connection refused: connect异常。

猜你喜欢

转载自blog.csdn.net/origin_cx/article/details/105234371