SpringBoot整合Angularjs

一、https://code.angularjs.org/  下载  Angularjs

二、添加依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            <version>1.9.22</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit-dep</artifactId>
            <version>4.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <!-- alibaba数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>
        <!-- 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

三、将下载的js文件导入项目

我下载的是1.8.2版本,在resources下创建目录public,将下载的1.8.2的包解压导入public即可。

四、配置文件

application.properties

#是否开启缓存,开发时可设置为false,默认为true
spring.thymeleaf.cache=false
#检查模板是否存在,默认为true
spring.thymeleaf.check-template=true
#检查模板位置是否存在,默认为true
spring.thymeleaf.check-template-location=true
#模板文件编码,UTF-8
spring.thymeleaf.encoding=UTF-8
#模板文件位置
spring.thymeleaf.prefix=classpath:/templates
#Content-Type配置
spring.thymeleaf.servlet.content-type=text/html
#模板文件后缀
spring.thymeleaf.suffix=.html
#启用MVC Thymeleaf视图分辨率
spring.thymeleaf.enabled=true
#模板编码
spring.thymeleaf.mode=LEGACYHTML5
#链中模板解析器的顺序
#spring.thymeleaf.template-resolver-order=o
#应该中解决方案中排除的视图名称的逗号分隔列表
#spring.thymeleaf.excluded-view-names=

#root日志以 WARN 级别输出 (日志只输出 WARN 及以上级别的信息)
#logging.level.root=WARN
#springframework.web 日志只以 DEBUG 级别输出
#logging.level.org.springframework.web=DEBUG
#hibernate 日志以 ERROR 级别输出
#logging.level.org.hibernate=ERROR
logging.file.name=e:\log\info.log
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n

#数据源配置
spring.datasource.name=test
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#加上?useUnicode=true&characterEncoding=UTF-8,否则可能插入数据库中文乱码
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/vhr?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.sql-script-encoding=UTF-8
#spring.datasource.druid.filter.encoding.enabled=true
spring.datasource.druid.filters=stat
spring.datasource.druid.max-active=20
spring.datasource.druid.initial-size=1
spring.datasource.druid.max-wait=60000
spring.datasource.druid.min-idle=1
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=select 'x'
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-open-prepared-statements=20

#所有的mapper映射文件
#mybatis.mapper-locations=classpath*:com/springboot/mapper/*.xml
#resource下的mapper映射文件
#mybatis.mapper-locations=classpath*:mapper/**/*.xml
mybatis.mapper-locations=classpath:mapper/BookMapper.xml
mybatis.config-location=classpath:mybatis/mybatis-config.xml

pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql

五、后端代码

package com.example.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;

import java.io.Serializable;
import java.util.Date;

public class Book implements Serializable {
    private Integer id;
    private String name;
    private String author;
    @JsonIgnore
    private Float price;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date publicationDate;

    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 String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public Date getPublicationDate() {
        return publicationDate;
    }

    public void setPublicationDate(Date publicationDate) {
        this.publicationDate = publicationDate;
    }
}
package com.example.mapper;

import com.example.pojo.Book;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface BookMapper {
    int addBook(Book book);
    int deleteBookById(Integer id);
    int updateBook(Book book);
    Book getBookById(Integer id);
    List<Book> getAllBooks();
}

mapper/BookMapper.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.example.mapper.BookMapper">
    <!--
    <insert id="addBook" parameterType="com.example.pojo.Book">
        INSERT INTO book(name,author) VALUES (#{name},#{author})
    </insert>
    <insert id="addBook" keyProperty="id" useGeneratedKeys="true"
 parameterType="com.example.pojo.Book">
        INSERT INTO book(name,author) VALUES (#{name},#{author})

     </insert>
     -->
    <insert id="addBook" parameterType="com.example.pojo.Book">
        <selectKey keyProperty="id" resultType="int" order="BEFORE">
            <!--
            select idseq.nextVal from dual
            -->
            SELECT
            auto_increment
            FROM
            information_schema.`TABLES`
            WHERE
            table_name = 'book'
            AND TABLE_SCHEMA = 'vhr'
        </selectKey>
        INSERT INTO book(id,name,author) VALUES (#{id},#{name},#{author})
    </insert>
    <delete id="deleteBookById" parameterType="int">
        delete from book where id=#{id}
    </delete>
    <update id="updateBook" parameterType="com.example.pojo.Book">
        update book set name=#{name},author=#{author} where id=#{id}
    </update>
    <select id="getBookById" parameterType="int" resultType="com.example.pojo.Book">
        select * from book where id=#{id}
    </select>
    <select id="getAllBooks" resultType="com.example.pojo.Book">
        select * from book
    </select>
</mapper>
package com.example.service;

import com.example.pojo.Book;

import java.util.List;

public interface BookService {

    int addBook(Book book);

    int updateBook(Book book);

    int deleteBookById(Integer id);

    Book getBookById(Integer id);

    List<Book> getAllBooks();

    List<Book> findBooks(int page, int rows);

}
package com.example.service;

import com.example.mapper.BookMapper;
import com.example.pojo.Book;
import com.github.pagehelper.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class BookServiceImpl implements BookService{

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Resource//@Autowired
    BookMapper bookMapper;

    @Override
    public int addBook(Book book) {
//        return bookMapper.addBook(book);
//        int insertNum = Integer.parseInt(bookMapper.addBook(book) + "");
        int insertNum = bookMapper.addBook(book);
        Integer id = book.getId();
        logger.info(insertNum+"------BookServiceImpl.addBook()-----------"+id);
        return id;
    }

    @Override
    public int updateBook(Book book) {
        return bookMapper.updateBook(book);
    }

    @Override
    public int deleteBookById(Integer id) {
        return bookMapper.deleteBookById(id);
    }

    @Override
    public Book getBookById(Integer id) {
        return bookMapper.getBookById(id);
    }

    @Override
    public List<Book> getAllBooks() {
        return bookMapper.getAllBooks();
    }

    @Override
    public List<Book> findBooks(int page, int rows) {
        PageHelper.startPage(page,rows);
        return bookMapper.getAllBooks();
    }


}
package com.example.controller;

import com.example.pojo.Book;
import com.example.service.BookService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class BookController {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    //@Autowired
    @Resource
    private BookService bookService;

    @RequestMapping("/books")
    public String books(){
        return "/books";
    }

    @RequestMapping("/save")
    @ResponseBody
    public Map<String, Object> save(@RequestBody Book book){
        Map<String,Object> result = new HashMap<>();
        if(StringUtils.isEmpty(book.getId())){
            book.setId(bookService.addBook(book));
        }else{
            bookService.updateBook(book);
        }
        result.put("id",book.getId());
        return result;
    }

    @RequestMapping("/get")
    @ResponseBody
    public Book get(Integer id){
        return bookService.getBookById(id);
    }

    @RequestMapping("/findAll")
    @ResponseBody
    public List<Book> findAll(){
        logger.info("-----BookController.findAll()--------------------test-----------");
        List<Book> list = bookService.getAllBooks();
        for(int i=0;i<list.size();i++){
            System.out.println(i+"------"+list.get(i).getName());
        }
        return list;
    }

    @RequestMapping("/delete")
    @ResponseBody
    public Map<String, Object> delete(Integer id){
        Map<String, Object> result = new HashMap<>();
        bookService.deleteBookById(id);
        result.put("id", id);
        return result;
    }

    @RequestMapping("/saveBook")
    @ResponseBody
    public String saveBook(){
        logger.info("-------------------------test-----------");
        Book book = new Book();
        book.setAuthor("罗贯中");
        book.setName("三国演义");
        bookService.addBook(book);
        return  "success";
    }

    @RequestMapping("/findBooks/{page}/{rows}")
    @ResponseBody
    public List<Book> findBooks(@PathVariable int page,@PathVariable int rows){
        return bookService.findBooks(page,rows);
    }

    @GetMapping("/book")
    @ResponseBody
    public Book book(){
        Book book = new Book();
        book.setAuthor("罗贯中");
        book.setName("三国演义");
        book.setPrice(48f);
        book.setPublicationDate(new Date());
        return book;
    }

    @GetMapping("/bookOps")
    @ResponseBody
    public void bookOps(){
        Book b1 = new Book();
        b1.setName("西厢记");
        b1.setAuthor("王实甫");
        int i = bookService.addBook(b1);
        System.out.println("addBook>>"+i);
        Book b2 = new Book();
        b2.setId(2);
        b2.setName("朝花夕拾");
        b2.setAuthor("鲁迅");
        int updateBook = bookService.updateBook(b2);
        System.out.println("updateBook>>"+updateBook);
        Book b3 = bookService.getBookById(1);
        System.out.println("getBookById>>"+b3);
        int delete = bookService.deleteBookById(1);
        System.out.println("deleteBookById>>"+delete);
        List<Book> allBooks=bookService.getAllBooks();
        System.out.println("getAllBooks>>>"+allBooks);
    }



}
package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = {"com.example.controller","com.example.service"})
@MapperScan("com.example.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

六、前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--
    <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    -->
    <script src="/angular-1.8.2/angular.min.js"></script>
</head>
<body ng-app="myApp" ng-controller="TestBookController">
    <h1>SpringBoot整合Angularjs</h1>
    <input type="button" value="添加" ng-click="add()" />
    <input type="button" value="保存" ng-click="save()" />
    <br />
    <br />

    <h3>书本信息</h3>
    <input id="id" type="hidden" ng-model="data.id" />
    <table cellspacing="1" style="background-color: #a0c6e5">
        <tr>
            <td>书名:</td>
            <td><input id="name" ng-model="data.name"/></td>
            <td>作者:</td>
            <td><input id="author" ng-model="data.author"/></td>
        </tr>
    </table>
    <br />
    <h3>列表信息</h3>
    <table cellspacing="1" style="background-color: #a0c6e5">
        <tr style="text-align: center;color: #0076c8;background-color: #f4faff;">
            <td>操作</td>
            <td>书名</td>
            <td>作者</td>
        </tr>
        <tr ng-repeat="row in rows" bgcolor="#f0ffff">
            <td>
                <input ng-click="edit(row.id)" value="编辑" type="button"/>
                <input ng-click="del(row.id)" value="删除" type="button"/>
            </td>
            <td>{{row.name}}</td>
            <td>{{row.author}}</td>
        </tr>
    </table>

<script type="text/javascript">
    /*<![CDATA[*/
    var app = angular.module('myApp', []);
    // app.controller('customersCtrl', function($scope, $http) {
    //     $http.get("/try/angularjs/data/Customers_JSON.php")
    //         .then(function (result) {
    //             $scope.names = result.data.records;
    //         });
    // });
    app.controller('TestBookController', function($rootScope, $scope, $http) {
        $scope.data = {};
        $scope.rows = [];

        //添加
        $scope.add = function(){
            $scope.data = {
                name : '水浒传',
                author : '施耐庵'
            };
        }

        //编辑
        $scope.edit = function (id) {
            for(var i in $scope.rows){
                var row = $scope.rows[i];
                if(id == row.id){
                    $scope.data = row;
                    return;
                }
            }
        }

        //移除
        $scope.remove = function(id){
            for(var i in $scope.rows){
                var row = $scope.rows[i];
                if(id == row.id){
                    $scope.rows.splice(i,1);
                    return;
                }
            }
        }

        //保存
        $scope.save = function () {
            $http({
                url : '/save',
                method : 'POST',
                data : $scope.data
            }).then(function(result){
                //保存成功后更新数据
                $scope.get(result.data.id);
            });
        }

        //删除
        $scope.del = function(id){
            $http({
                url : '/delete?id='+id,
                method : 'POST'
            }).then(function(result){
                //删除成功后移除数据
                $scope.remove(result.data.id);
            });
        }

        //获取数据
        $scope.get = function(id){
            $http({
                url : '/get?id='+id,
                method : 'POST'
            }).then(function(result){
                for(var i in $scope.rows){
                    var row = $scope.rows[i];
                    if(result.data.id == row.id){
                        row.name = result.data.name;
                        row.author = result.data.author;
                        return;
                    }
                }
                $scope.rows.push(result.data);
            });
        }

        //初始化载入数据
        // $http({
        //     url : 'findAll',
        //     mehtod : 'POST'
        // }).success(function(rows){
        //     for(var i in rows){
        //         var row = rows[i];
        //         $scope.rows.push(row);
        //     }
        // });


        //初始化载入数据
        $http({
            url : 'findAll',
            mehtod : 'POST'
        }).then(function (result) {  //正确请求成功时处理
            console.info("--初始化载入数据----正确请求成功时处理---------"+JSON.stringify(result));
            for(var i in result.data){
                var row = result.data[i];
                $scope.rows.push(row);
            }
        }).catch(function (result) { //捕捉错误处理
            console.info(JSON.stringify(result));
            // alert(result.data.Message);
        });


        // $http.get("/try/angularjs/data/Customers_JSON.php")
        //     .then(function (result) {
        //         $scope.names = result.data.records;
        //     });
    });

    /*]]>*/
</script>
</body>
</html>

七、测试

原文地址:https://www.cnblogs.com/mingforyou/p/14613298.html