从零开始搭建自己的网站二:Springboot项目框架搭建

上一篇文章中,讲的第一、二步购买服务器和绑定域名,我就不细细讲了。本文中会讲解如何构建一个基本的Springboot+freemarker+mybatis项目框架

1、先创建Gradle项目,用Gradle来管理我们的项目。

2、创建目录结构

3、具体代码

1)build.gradle 此处为整个项目的完整jar包。

group 'demo'
version '1.0.0'

apply plugin: 'java'
apply plugin: 'idea'

repositories {
    mavenCentral()
}

buildscript {
    ext {
        springBootVersion = '1.4.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'spring-boot'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-devtools')
    compile 'org.springframework.boot:spring-boot-starter-freemarker'
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-aop')
    compile('org.springframework.boot:spring-boot-starter-cache')
    compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1')
    compile('mysql:mysql-connector-java:5.1.42')
    compile('commons-dbcp:commons-dbcp:1.2.2')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile 'com.alibaba:fastjson:1.2.33'
    compile 'org.apache.commons:commons-lang3:3.6'
    compile("org.springframework.boot:spring-boot-starter-redis:1.3.5.RELEASE")
    compile("org.springframework.data:spring-data-redis:1.7.2.RELEASE")
    compile 'dom4j:dom4j:1.6.1'
    compile 'com.thoughtworks.xstream:xstream:1.4.9'
    compile 'com.qiniu:qiniu-java-sdk:[7.2.0, 7.2.99]'
    compile 'org.json:json'
    compile 'commons-fileupload:commons-fileupload:1.3.2'
    compile 'commons-codec:commons-codec:1.9'
    compile 'net.sf.ehcache:ehcache'
    compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.17'
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.12'
}

ext {
    profile = System.getProperty("env") ?: "dev"
    println "[current profile]:" + profile
}

sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources", "env/$profile"]
        }
    }
}

jar {
    String someString = ''
    configurations.runtime.each {someString = someString + " lib//"+it.name}
    manifest {
        attributes 'Main-Class': 'com.dyw.Application'
        attributes 'Class-Path': someString
    }
}
//清除上次的编译过的文件
task clearPj(type:Delete){
    delete 'build','target'
}
task copyJar(type:Copy){
    from configurations.runtime
    into ('build/libs/lib')
}
//把JAR复制到目标目录
task release(type: Copy,dependsOn: [build,copyJar]) {
// from 'conf'
// into ('build/libs/eachend/conf') // 目标位置
}

2)application.yaml 配置文件,这里配置了2种环境下的配置,分别是local本地和prod生产环境。到时方便发布

spring.profiles.active: local
---
spring:
  profiles: local
  http:
    multipart:
      max-file-size: 1024KB
      max-request-size: 1024KB
  devtools.restart.enabled: true
  output.ansi.enabled: ALWAYS
  freemarker:
    suffix: .html
    settings:
      datetime_format: yyyy-MM-dd HH:mm:ss
      date_format: yyyy-MM-dd
      time_format: HH:mm:ss
      number_format: 0.######
      boolean_format: true,false
      auto_import: "'spring.ftl' as spring"
      whitespace_stripping: true
      default_encoding: UTF-8
      tag_syntax: auto_detect
      url_escaping_charset: UTF-8
      template_update_delay: 3
      locale: zh_CN
      cache_storage: strong:20,soft:250
  resources.chain.strategy:
    content.enabled: true
    fixed.version: 1
  mvc:
    favicon.enabled: false
    static-path-pattern: /**
---
spring:
  profiles: prod
  http:
    multipart:
      max-file-size: 1024KB
      max-request-size: 1024KB
  devtools.restart.enabled: true
  output.ansi.enabled: ALWAYS
  freemarker:
    suffix: .html
    settings:
      datetime_format: yyyy-MM-dd HH:mm:ss
      date_format: yyyy-MM-dd
      time_format: HH:mm:ss
      number_format: 0.######
      boolean_format: true,false
      auto_import: "'spring.ftl' as spring"
      whitespace_stripping: true
      default_encoding: UTF-8
      tag_syntax: auto_detect
      url_escaping_charset: UTF-8
      template_update_delay: 3
      locale: zh_CN
      cache_storage: strong:20,soft:250
  resources.chain.strategy:
    content.enabled: true
    fixed.version: 1
  mvc:
    favicon.enabled: false
    static-path-pattern: /**

3)Application 启动类

@MapperScan("com.dyw.dao")
@EnableAutoConfiguration
@EnableCaching
@SpringBootApplication(scanBasePackages = "com.dyw")
public class Application extends WebMvcConfigurerAdapter implements EmbeddedServletContainerCustomizer {
    public static void main(String[] args) throws Exception {
        new SpringApplicationBuilder().bannerMode(Banner.Mode.OFF);
        SpringApplication application = new SpringApplication(Application.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.run(args);
    }


    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setPassword("root123");
        dataSource.setUrl("jdbc:mysql://localhost/blog?useUnicode=true&characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mybatis/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }


    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        container.setPort(8088);
    }
}

4)GatewayController ,ArticleService,ArticleServiceImpl,ArticleDao

@Controller
public class GatewayController {

    @Autowired
    private ArticleService articleService;

    /**
     * 首页
     */
    @RequestMapping(value = {"/", "index"})
    public String gateway(Model model) {
        List<Article> list = articleService.getArticleList();
        model.addAttribute("articles", list);
        return "homepage/index";
    }
}
public interface ArticleService {

    /**
     * 查询所有的文章列表
     */
    List<Article> getArticleList();
}
@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleDao articleDao;

    @Override
    public List<Article> getArticleList() {
        return articleDao.getArticleList();
    }
}
@Component
public interface ArticleDao {

    /**
     * 获取文章
     */
    List<Article> getArticleList();
}

5)Article实体 此处先不用管字段,后面我会详细解释。

public class Article {
    //ID
    private int id;
    //内容ID
    private int contentId;
    //标题
    private String title;
    //摘要
    private String abstr;
    //分类
    private String categoryId;
    //内容
    private String content;
    //时间
    private String createDate;
    //置顶
    private String top;
    //图片地址
    private String imgurl;
    //关键词
    private String key;

    private String keyValue;

    private String categoryValue;

    private int click;

    private int comment;

    public int getClick() {
        return click;
    }

    public void setClick(int click) {
        this.click = click;
    }

    public int getComment() {
        return comment;
    }

    public void setComment(int comment) {
        this.comment = comment;
    }

    public String getCategoryValue() {
        return categoryValue;
    }

    public void setCategoryValue(String categoryValue) {
        this.categoryValue = categoryValue;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getKeyValue() {
        return keyValue;
    }

    public void setKeyValue(String keyValue) {
        this.keyValue = keyValue;
    }

    public String getTop() {
        return top;
    }

    public void setTop(String top) {
        this.top = top;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getContentId() {
        return contentId;
    }

    public void setContentId(int contentId) {
        this.contentId = contentId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAbstr() {
        return abstr;
    }

    public void setAbstr(String abstr) {
        this.abstr = abstr;
    }

    public String getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(String categoryId) {
        this.categoryId = categoryId;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getCreateDate() {
        return createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getImgurl() {
        return imgurl;
    }

    public void setImgurl(String imgurl) {
        this.imgurl = imgurl;
    }
}

6)article_sqlmap.xml mybatis配置文件

<?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.dyw.dao.ArticleDao" >
    <resultMap id="article" type="com.dyw.model.Article" >
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="contentId" property="contentId" jdbcType="INTEGER" />
        <result column="title" property="title" jdbcType="VARCHAR" />
        <result column="abstr" property="abstr" jdbcType="VARCHAR" />
        <result column="categoryId" property="categoryId" jdbcType="VARCHAR" />
        <result column="imgurl" property="imgurl" jdbcType="VARCHAR" />
        <result column="createDate" property="createDate" jdbcType="VARCHAR" />
        <result column="top" property="top" jdbcType="VARCHAR" />
        <result column="key" property="key" jdbcType="VARCHAR" />
        <result column="keyValue" property="keyValue" jdbcType="VARCHAR" />
        <result column="categoryValue" property="categoryValue" jdbcType="VARCHAR" />
    </resultMap>

    <select id="getArticleList" resultMap="article">
        select * from article
    </select>
</mapper>

7)index.html 页面 我们在上面application.yaml中已经配置了freemarker,所以在页面中可以直接用freemarker语法

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>丁垠午博客首页</title>
</head>

<body>
<#list articles as article>
 ${article.title}</br>
</#list>

</body>
</html>

8)启动Application中的main方法,运行项目。效果如下,整个项目基本框架搭建完成,而且我们也从http请求到后台,再到数据库,再转回到前端展示整个流程完整的走完。


欢迎转载,转载请注明出处 http://www.dingyinwu.com 

如果文章中有任何问题,请大家纠正,我会非常感激,一起进步。

评论 抢沙发

表情
  1. #1

    来自 匿名 的用户 (2018-06-22 00:00:00)

    文章页面有个上一篇和下一篇就好了,我就可以不用返回到首页再去往下滚动加载找到第三篇了[em_20]

    回复
  2. #2

    来自 匿名 的用户 (2018-08-06 00:00:00)

    [em_1]

    回复
  3. #3

    来自 匿名 的用户 (2018-08-21 00:00:00)

    我跟你的经历一样,问题是我的网站还在拖着...

    回复
  4. #4

    来自 匿名 的用户 (2018-09-12 00:00:00)

    请问有代码包吗

    回复
  5. #5

    来自 匿名 的用户 (2019-04-28 14:54:35)

    不用Gradle用maven怎么样,springboot就解决了配置的问题

    61.142.233.240
    回复
  6. #6

    来自 匿名 的用户 (2019-06-13 16:42:46)

    为什么不用 maven啊 这个 gra看不太懂 哈哈

    183.134.216.118
    回复
Title