zoukankan      html  css  js  c++  java
  • springboot项目的创建和兼容jsp和注解开发,详细有效(注解和配置两种)

    如果这篇博客能给你带来帮助不胜荣幸,如果有不对的地方,都是码农欢迎指正。直接进入正题

    在这里首先我要声明一下我个人的感觉如果你会ssm(spring+mybatis+springmvc)的话,那么你可以在五分钟之内就搞定了,如果你不会也无所谓。

    我个人是感觉springboot项目其实就是对ssm项目的一个管理和整合。如果你用的eclipse那么你需要下载插件,所以我建议大家直接下载sts(Spring Tools Suite)这个软件.官网自己下载

    我使用的是sts这个树叶的软件。现在直接上:

    1:第一  新建(new)找到Spring Starter Project(这个是创建springboot项目的),然后点击就创建一个springboot项目了。

    然后会让你填写一下你的项目的具体的一些信息。最后点击next(也可以选择使用默认的东西)

    然后会让你选择一些maven 的依赖 全部都是从下面的列表里找的比如从sql 里面找到mysql Driver驱动等等,需要什么就可以添加什么依赖(根据实际需求来添加)

    添加完成之后创建项目的话你的项目里面就会自动下载这些依赖了,到时候前往pom.xml里面进行查看。

    创建的过程可能比较慢 根据你的网速来定义 请大家耐心等待  至此恭喜你你已经创建了一个简单的springboot 项目了,里面需要有一些地方给大家讲一下:

    我是用的导航图的样式来看项目,大家可以使用window--> view-->Navigator来修改视图模式

    有几个框从上往下依此介绍:

    第一个****application.java的文件是整个项目的启动类,所有的项目都需要从这里启动(切记切记)

    然后resources这个文件加下放非Java文件资源的,比如说static下存放css和js和img等等 temolates文件下是存放html界面的,这个文件夹下类似ssm项目下的WEB-INF 文件夹下

    是受到保护的不可以随便访问。然后最重要的就是application.properties(application.yml)文件。这个文件可以说是springboot项目的一个全局配置文件包含众多信息比如说:端口号的配置 datasource数据源的配置我一般习惯使用application.yml来进行一个配置。最后一个就是maven依赖的pom.xml依赖了。如果你的pom.xml如果跟我的一样报了错:

     把你的版本号改成小一点的,比如说2.1.4等等。还有一点就是你的application.properties(application.yml文件)下面的webapp下面的文件夹你需要添加点东西,因为你使用的是war包,所以需要新建上一个文件夹(WEB-INFO)然后里面放上一个web.xml文件 和之前ssm的一样就可以了,然后web.xml文件里面什么也可以不用写。 到此你的项目就不报错了。

    例如我的web.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             version="3.0"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <display-name>myspringbootDemo</display-name>
    </web-app>

     其实这个东西:如果你不需要使用jsp或者其他的什么的完全可以把没有用的东西干掉。

    然后开始写一点东西。写两个查询吧一个注解的一个配置文件的。老规矩还是按照学生表来实现:

    咱们创建目录 student,然后在他下面创建几个包(model(实体类),dao(持久层),service(业务层),web(控制层) )可以看我的创建目录 然后在启动类的上面进行配置扫描其实如果你的实体类和接口要是写在了*****.application那个启动类的同级或统计一下目录,那么会自动帮你扫描。但是我本人也会进行强迫症的扫描。

     好的然后就是上代码:实体类详情什么的我会发给大家项目的参考的。现在就说主要工作流程:然后你需要创建dao层的接口。这里要注意的是:因为你少了很多配置,然后呢你需要使用的就是注解了。所以你在创建接口的时候就需要给他加上注解@Mapper(就相当于告诉项目我这个类呢是接口):然后呢正常写接口,我们写两个方法一个是使用注解的主键查询。另一个是使用注解的形式写mapper.xml的查询:当你使用注解查询的时候你就需要在你的项目上面写上你的相关的注解比如查询使用(@select)修改使用 @Update 删除使用@Delete  等等不在一一举例 。然后括号里面写你的sql语句该怎么写就怎么写,跟ssm项目完全一样。 业务层和控制层同样使用注解来进行配置(可以这样理解:告诉项目这个是业务层,这个是控制层),配合着上面的扫描一起使用。

    当然了在控制层唯一有一点不太一样的地方就是一般情况下我们再看控制层有的时候会加上一个注解@Controller 现在呢多了一个@RestController这个注解,把鼠标放上去的时候就会出现它比@Controller多了一个注解那就是@ResponseBody,也就是说如果使用@RestController这个注解的话你的控制层的所有方法返回的数据格式全部是json串。(当然了我个人建议大家使用@Controller,然后可以在每个方法上面加上@ResponseBody),当你写到这一步的时候,不妨可以停下来跟我的对照一下看看是否一样啊:

    实体类:

    package com.company.demo.student.model;
    
    public class Student {
    
        private Integer id;
        private String name;
        private Integer age;
        private String sex;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Student(Integer id, String name, Integer age, String sex) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
    
        public Student() {
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
        }
    
    }

    dao层:

    package com.company.demo.student.dao;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    import com.company.demo.student.model.Student;
    
    @Mapper
    public interface StudentMapper {
        
        @Select("select * from student where id =#{id}")
        public Student queryById(Integer id);
        
        public List<Student> findAll();
    }

    业务层的接口:

    package com.company.demo.student.service;
    
    import java.util.List;
    
    import com.company.demo.student.model.Student;
    
    
    public interface StudentService {
        
        public Student queryById(Integer id);
        public List<Student> findAll();
    }

    业务层的实现类:

    package com.company.demo.student.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.company.demo.student.dao.StudentMapper;
    import com.company.demo.student.model.Student;
    
    
    @Service
    public class StudentImpl implements StudentService{
        
        @Autowired
        private StudentMapper studentMapper;
        
        @Override
        public Student queryById(Integer id) {
            // TODO Auto-generated method stub
            Student queryById = studentMapper.queryById(id);
            return queryById;
        }
    
        @Override
        public List<Student> findAll() {
            // TODO Auto-generated method stub
            List<Student> findAll = studentMapper.findAll();
            return findAll;
        }
        
    }

    控制层:

    package com.company.demo.student.web;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.company.demo.Message.Result;
    import com.company.demo.Message.ResultCode;
    import com.company.demo.student.model.Student;
    import com.company.demo.student.service.StudentService;
    
    @Controller
    public class StudentController {
        
        @Autowired
        private StudentService  studentService;
        
        
        @ResponseBody
        @RequestMapping("/findAll")
        public Result findAll(){
            Result result = new Result();
            List<Student> findAll = studentService.findAll();
            if(findAll!=null){
                result.setData(findAll);
                result.setResultCode(ResultCode.SUCCESS);
                return result;
            }else{
                result.setResultCode(ResultCode.RESULT_IS_NOT);
                return result;
            }
        }
        
        @ResponseBody
        @RequestMapping("/selectById")
        public Result selectById(Integer id){
            Result result = new Result();
            if(id!=null){
                Student queryById = studentService.queryById(id);
                if(queryById!=null){
                    result.setData(queryById);
                    result.setResultCode(ResultCode.SUCCESS);
                    return result;
                }else{
                    result.setResultCode(ResultCode.RESULT_IS_NOT);
                    return result;
                }
            }else{
                result.setResultCode(ResultCode.PARAM_IS_BLANK);
                return result;
            }
        }
        
    }

    完事了之后,因为是演示我就简单的做一下数据的返回处理 自己写了两个两个类当成数据的返回处理类吧算是:

    第一个数据的返回类:

    package com.company.demo.Message;
    
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    
    @JsonInclude(Include.NON_NULL)
    public class Result{
         
        private ResultCode resultCode;
        private String message;
        private Object data;
        
        public ResultCode getResultCode() {
            return resultCode;
        }
        public void setResultCode(ResultCode resultCode) {
            this.resultCode = resultCode;
        }
        
        public Result() {
            // TODO Auto-generated constructor stub
        }    
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
        
        //查询成功返回的东西
        public static Result success(Object data){
            Result result = new Result();
            result.setResultCode(ResultCode.SUCCESS);
            result.setData(data);
            return result;
        }
        
        //添加删除修改成功之后调用
        public static Result success(){
            Result result = new Result();
            result.setResultCode(ResultCode.SUCCESS);
            return result;
        }
        
        //添加失败调用
        public static Result failure(ResultCode resultCode){
            Result result = new Result();
            result.setResultCode(resultCode);
            return result;
        }
        
        //其他失败调用的
        //查询成功返回的东西
        public static Result success(Object data,ResultCode resultCode){
            Result result = new Result();
            result.setResultCode(resultCode);
            result.setData(data);
            return result;
        }
        
    }

    第二个:枚举的参数类型类:

    package com.company.demo.Message;
    
    public enum ResultCode {
        
        SUCCESS(1,"成功"),
        ERROR(0,"错误"),
        
        PARAM_IS_INVALID(1001,"参数无效"),
        PARAM_IS_BLANK(1002,"参数为空"),
        PARAM_TYPE_BIND_ERROR(1003,"参数类型错误"),
        PARAM_NOT_COMPLETE(1004,"参数缺失"),
        
        USER_NOT_LOGGED_IN(2001,"用户未登录,访问的路径须验证,请登录"),
        USER_LOGIN_ERROR(2002,"账户不存在或密码错误"),
        USER_ACCOUNT_FORBIDDEN(2003,"账号已被禁用"),
        USER_NOT_EXIST(2004,"用户不存在"),
        USER_HAS_EXISTED(2005,"用户已存在"),
        
        RESULT_IS_NOT(5000,"没有符合您想要的查询结果"),
        RESULT_OTHER_ERROR(9999,"没有进入方法,直接跳转返回"); 
        
        
        private Integer code;
        private String message;
        
        private ResultCode(Integer code, String message) {
            this.code = code;
            this.message = message;
        }
        
        public Integer code() {
            return this.code;
        }
    
        public String message() {
            return this.message;
        }
        
    }

    接下来这个是重点:那就是springboot 的全局一个简单配置: 我把之前resource 下面的那个application.properties 改成了application.yml格式.(用习惯了)

    server:
      port: 8085 #端口号
      servlet: 
       context-path: /myspringboot  #你自定义的虚拟的项目名 方便实用
    spring: 
      mvc:
        view:
          suffix: .jsp   #因为有的人可能用jsp 所以添加jsp的配置
          prefix: /jsp/  #所以就配置一下前后缀 其实正常情况下应该是放到/WEB-INF/下面的。
                 #我为了方便演示就放到了可以直接访问的目录下,你可以自由放置
    static-path-pattern: /static/** #过滤静态资源 thymeleaf: #springboot支持html文件 使用thymeleaf配置 cache: false encoding: UTF-8 mode: LEGACYHTML5 prefix: classpath:/templates/ suffix: .html check-template-location: true datasource: #数据源配置 url: jdbc:mysql://localhost:3306/teststudent?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver #驱动类 看你的数据库是六以上的吗?版本高的需要使用 这个驱动 mybatis: mapper-locations: classpath*:xml/*.xml #这个位置是配置 是配置dao层的mapper.xml存放的位置的 其中第一个是你新建的包名是什么就是什么 type-aliases-package: com.ygjy.hospital.model #实体类 别名配置 #配置pagehelper pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true params: count=countSql

    然后如果你是用的是jsp 那么你需要干两件事      第一添加servlet 依赖:

         <!--jsp页面使用jstl标签 -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
            <!--用于编译jsp -->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <scope>provided</scope>
            </dependency>

    第二:去那个配置文件里面进行配置:因为我刚才已经进行配置了就是配置jsp的视图解析:所以不用再配置了。

    还有因为咱们还打算使用mapper.xml:所以我们需要新建一个文件夹来存放:我们在resource文件夹下新建一个叫xml()的文件:(这个跟上面的application.yml里面的配置相呼应)。然后在 pom.xml文件里面加入:<build></build>标签里面添加:  添加完成了之后你就可以使用mapper.xml文件了:

            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>            

    里面可以写你的mapper.xml例如我写了一个:

    <?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.company.demo.student.dao.StudentMapper">
           <resultMap id="student" type="com.company.demo.student.model.Student">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="age" jdbcType="INTEGER" property="age" />
        <result column="sex" jdbcType="VARCHAR" property="sex" />
      </resultMap>
        
           <!-- 搜索全部 -->
        <select id="findAll" resultMap="student">
            select * from student where 1=1;
        </select>
       
    </mapper>

    到达这里呢!其实你的项目已经算是好了!现在让我们启动一下项目:在这里请大家记住springboot 项目跟大家说过:有一个固定的启动类:现在我们找到那个启动类右击 run as

    spring boot app 点击一下那个小树叶就可以了!

    你会看到  spring 的字样:

     

    我们先来演示一下使用注解方法的那个  打开你本地的postman 如果没有直接使用浏览器都可以,测一下接口:给他一个默认的参数比如说  我给了一个 5 

    效果展示:

    因为本人的的前台功能比较菜,所以就简单的写一个jsp的吧,目的就是为了两个验证第一 :看看我刚才的配置是否成功了如果springboot项目能兼容jsp就说明配置成功了。

    (前台jsp已上传百度云,可自行下载。)

    下面直接展示jsp的效果。咱们在webapp下面新建一个jsp包然后 写一个界面 这次咱们验证使用mapper.xml的哪个方法。顺便看看mapper.xml的配置成功没有。

    直接看效果:

    到这里呢!就算是完成了,其实还有很多东西没有放进去,以后有时间的话会不断晚上的 比如逆向工程 分页 上传 导出什么的,打算写但是今天写到这里有点累了,其实都跟ssm没什么区别,以后有机会不断完善。最后附上源码给大家吧!(虽然自己也是刚入行的菜鸡)不给源码的人一般不是善良的码农。

    链接: https://pan.baidu.com/s/1fInJe4AtSXCAlfMcFa5k6Q 提取码: maay 

  • 相关阅读:
    利用相关的Aware接口
    java 值传递和引用传递。
    权限控制框架Spring Security 和Shiro 的总结
    优秀代码养成
    Servlet 基础知识
    leetcode 501. Find Mode in Binary Search Tree
    leetcode 530. Minimum Absolute Difference in BST
    leetcode 543. Diameter of Binary Tree
    leetcode 551. Student Attendance Record I
    leetcode 563. Binary Tree Tilt
  • 原文地址:https://www.cnblogs.com/lifan666/p/springbootDemo.html
Copyright © 2011-2022 走看看