zoukankan      html  css  js  c++  java
  • 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>

    七、测试

  • 相关阅读:
    数据库设计 概念结构设计(以权限系统为例)
    sp_addlinkedserver使用方法
    动态页面静态化技术(很不错的教程摘录)
    C#获取硬件序列号
    [转]消息队列关于MSMQ的基础知识
    通过Image对象获取对象的格式
    历史项目的回忆 2008.04.27
    解决Access to Message Queuing system is denied.权限问题
    windows 输入法生成器 导出输入法的mb文件到txt
    [转载]C#版可调节的文字阴影特效
  • 原文地址:https://www.cnblogs.com/mingforyou/p/14613298.html
Copyright © 2011-2022 走看看