Castie!

正态分布, 优劣伴生

北冥有鱼,其名为鲲(kūn)。鲲之大,不知其几千里也;化而为鸟,其名为鹏。鹏之背,不知其几千里也;怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。


北海若曰:“井鼃不可以语于海者,拘于虚也;夏虫不可以语于冰者,笃于时也;曲士不可以语于道者,束于教也。今尔出于崖涘,观于大海,乃知尔丑,尔将可与语大理矣。

Server 入门后端你要学什么

好久没有更新了, 最近一个月在入门服务端的技术栈, 所以快速学了一下java, ssm框架, 这篇文章会将我的学习思路以及一些思考进行分享, 如何将一个月的学习所得通过一篇文章进行梳理, 这对我也是一个极大的挑战.

技术选型

对于Web服务端开发, 有很多语言可供选择比如, php, java, .net, python等, 之前我也试过使用node进行服务器的开发, 但对于国内来说, java还是企业级的标配, 所以我们来学习一下java还是很有必要的.

java技术栈

学习java服务端开发, 我们需要掌握或了解以下技术栈, 所谓万丈高楼平地起, 基础知识还是有必要了解的. 我们通过以下几步来了解下整个java所需的技术流程以及关系.

  1. java环境搭建, 需要下载jdk并配置环境, 这块请自行搜索, 就和你下载Xcode是一个道理.
  2. java基础学习, 如果你有其他语言基础, 直接学习java特色的东西, 比如包结构, 静态, 接口, 注解, 反射, 注解和反射需要好好看看, ssm里面经常用, 要知其所以然.
  3. servlet, filter, listener学习, 了解一下前端和后端的交互, 如何监听过滤请求, 了解原理, jsp可以不用看, 原理和servlet相似.
  4. jdbc, mysql 学习一下如何建表以及连接数据库, 如果有其他开发经验如ios, 就对应fmdb和sqlite.
  5. spring springmvc mybatis, 俗称ssm框架, 也是比较适合上手的框架, 推荐入门.
  6. maven tomcat nginx vstpd linux 项目管理工具, 及服务器反向代理以及ftp静态服务及运维基础.
  7. intillij idea 一个ide熟悉掌握即可.

上述知识, 对于有开发经验的, 看看文档其实也就两个礼拜的时间足以, 不用特别精通, 知其大略即可.

与oc区别

  1. interface 对比 protocol, 这个是一个知识点, 虽然相似但是不同, 对于接口继承和可选的概念和设计也不一样, 可以了解下.
  2. 反射 对比 runtime, 还是不一样的, java中反射和注解是一对相辅相成的东西, 而runtime就是消息转发.
  3. javabean 与property, 一个是通过get 私有属性调用, 一个是自动生成, 还是不一样的.
  4. 包装类, 内部类, final之类的特有功能, 还是有必要学习一下.还有import的概念和oc也是大相径庭.

先列以上几点, 之后再继续补充总结.

实战为例

如果你已经花了些时间, 完成了上述基础部分的学习, 其实花时间2个星期能够看个大概了,然后我们来进行一个接口制作的实际演示.

首先我们需要安装tomcat, jdk 并集成到ide中, 这步骤虽然比较繁琐, 但自行搜索受益良多. 接下来我们就来为之前的简历项目制作接口.

页面图示

针对图示今天先实现第一部分的接口, 首先是数据表设计. 装好mysql后执行创建表sql.

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50719
 Source Host           : localhost
 Source Database       : resume

 Target Server Type    : MySQL
 Target Server Version : 50719
 File Encoding         : utf-8

 Date: 11/13/2017 19:10:36 PM
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `resume_profile`
-- ----------------------------
DROP TABLE IF EXISTS `resume_profile`;
CREATE TABLE `resume_profile` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `profile_image` varchar(500) COLLATE utf8_bin NOT NULL,
  `profile_name` varchar(50) COLLATE utf8_bin NOT NULL,
  `profile_career` varchar(50) COLLATE utf8_bin NOT NULL,
  `profile_summary_title` varchar(50) COLLATE utf8_bin NOT NULL,
  `profile_summary_description` varchar(500) COLLATE utf8_bin NOT NULL,
  `profile_interest_title` varchar(50) COLLATE utf8_bin NOT NULL,
  `profile_education_title` varchar(50) COLLATE utf8_bin NOT NULL,
  `profile_location` varchar(50) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `resume_profile`
-- ----------------------------
BEGIN;
INSERT INTO `resume_profile` VALUES ('1', 'http://upload-images.jianshu.io/upload_images/1229762-23e162b9bd6b9c39.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', 'Shuangquan Zhu', 'Designer / Developer', 'Summary', 'Shuangquan Zhu is a professional developer who focuses on iOS now. He has strong knowledge of Objective-C, Swift and Javascript. With these skills, he created quite a few quickly developer tools. He also leads the J1 iOS team to promote the project process.\\nHe crazy loves playing basketball with friends in spare time, He also loves traveling, writing and listening music. He is always willing to try new things, and keeping to learn from them.', 'Interest', 'Education', 'Shanghai');
COMMIT;

-- ----------------------------
--  Table structure for `resume_profile_education`
-- ----------------------------
DROP TABLE IF EXISTS `resume_profile_education`;
CREATE TABLE `resume_profile_education` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `major` varchar(100) COLLATE utf8_bin NOT NULL,
  `school` varchar(100) COLLATE utf8_bin NOT NULL,
  `year` varchar(100) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `resume_profile_education`
-- ----------------------------
BEGIN;
INSERT INTO `resume_profile_education` VALUES ('1', 'Business Management', 'East China University of Science and Technology', '2016'), ('2', 'Customs and International Freight', 'Shanghai Maritime Academy', '2013');
COMMIT;

-- ----------------------------
--  Table structure for `resume_profile_interest`
-- ----------------------------
DROP TABLE IF EXISTS `resume_profile_interest`;
CREATE TABLE `resume_profile_interest` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `interest` varchar(100) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `resume_profile_interest`
-- ----------------------------
BEGIN;
INSERT INTO `resume_profile_interest` VALUES ('1', 'Learn about high tech'), ('2', 'Play basketball'), ('3', 'Listen to music'), ('4', 'Apple products');
COMMIT;

-- ----------------------------
--  Table structure for `resume_profile_social`
-- ----------------------------
DROP TABLE IF EXISTS `resume_profile_social`;
CREATE TABLE `resume_profile_social` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `src` varchar(500) COLLATE utf8_bin NOT NULL,
  `href` varchar(500) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `resume_profile_social`
-- ----------------------------
BEGIN;
INSERT INTO `resume_profile_social` VALUES ('1', 'http://upload-images.jianshu.io/upload_images/1229762-877e3e5c2260bcf1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', 'https://github.com/coderzsq'), ('2', 'http://upload-images.jianshu.io/upload_images/1229762-f6525252f3e8387b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', 'http://www.jianshu.com/u/9d7fad1a4693'), ('3', 'http://upload-images.jianshu.io/upload_images/1229762-a69614a97de93f36.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', 'http://upload-images.jianshu.io/upload_images/1229762-453920a3f4eedcd8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240'), ('4', 'http://upload-images.jianshu.io/upload_images/1229762-91b0949aec719aab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', 'http://coderzsq.github.io/');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

接口设计方面, 注意的就是如果是数组对象, 新建一张单独的表即可, sql语句不懂的同学, 嗯… 努力吧.

然后我们通过maven原型构建一下web-app

接下来, 我们需要创建一下包结构.

.java
└── com
    └── resume
        ├── common
        │   ├── ResponseCode.java
        │   └── ServerResponse.java
        ├── controller
        │   └── PortalController.java
        ├── dao
        │   ├── ProfileEducationMapper.java
        │   ├── ProfileInterestMapper.java
        │   ├── ProfileMapper.java
        │   └── ProfileSocialMapper.java
        ├── pojo
        │   ├── Profile.java
        │   ├── ProfileEducation.java
        │   ├── ProfileInterest.java
        │   └── ProfileSocial.java
        ├── service
        │   ├── IPortalService.java
        │   └── impl
        │       └── PortalServiceImpl.java
        ├── util
        └── vo
            ├── ProfileEducationVo.java
            ├── ProfileInterestVo.java
            ├── ProfileSocialVo.java
            └── ProfileVo.java

我们将项目分为四层, controller, service, dao, pojo, 类似于我们iOS的controller, presenter, viewmodel, model.

分完层级后, 我们来学习下xml的配置吧.

pom.xml
<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 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.coderzsq</groupId>
  <artifactId>resume</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>resume Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>

    <org.springframework.version>4.0.0.RELEASE</org.springframework.version>
    <org.mybatis.version>3.4.1</org.mybatis.version>
    <org.mybatis.spring.version>1.3.0</org.mybatis.spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>7.0.64</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>


    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.7.3</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${org.mybatis.spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${org.mybatis.version}</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.11</version>
    </dependency>

    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.12</version>
    </dependency>

    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
      <!--<scope>runtime</scope>-->
    </dependency>


    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.1.2</version>
      <scope>compile</scope>
    </dependency>

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

  </dependencies>
  <build>
    <finalName>resume</finalName>
    <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <configuration>
          <verbose>true</verbose>
          <overwrite>true</overwrite>
        </configuration>
        <!--增加配置文件的依赖,可以省去mysbatis-generator中配置jdbc-connect的jar的位置-->
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
          </dependency>
        </dependencies>
      </plugin>

      
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
          <compilerArguments>
            <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib/</extdirs>
          </compilerArguments>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port>
          <path>/</path>
          <uriEncoding>UTF-8</uriEncoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

一些基本的依赖和运行时配置及插件, 类似package.json以及cocoapods.

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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_2_5.xsd"
         id="WebApp_ID" version="2.5">

    <display-name>Archetype Created Web Application</display-name>

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>



    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

</web-app>


这个文件就管理servlet的监听及过滤的配置, 可以看到使用的是spring的dispatcher.

dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.resume" annotation-config="true"/>

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>



    <!-- 文件上传 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/> <!-- 10m -->
        <property name="maxInMemorySize" value="4096" />
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>


</beans>

这个文件告诉springmvc如何扫描注解,之前有讲到注解的本质就是打好标记通过反射实现逻辑.

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.resume" annotation-config="true"/>

    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="2"/>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:datasource.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="utf-8"/>
    </bean>


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driverClassName}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="${db.initialSize}"/>
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="${db.maxActive}"/>
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="${db.maxIdle}"/>
        <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="${db.minIdle}"/>
        <!-- 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制 -->
        <property name="maxWait" value="${db.maxWait}"/>
        <!--#给出一条简单的sql语句进行验证 -->
         <!--<property name="validationQuery" value="select getdate()" />-->
        <property name="defaultAutoCommit" value="${db.defaultAutoCommit}"/>
        <!-- 回收被遗弃的(一般是忘了释放的)数据库连接到连接池中 -->
         <!--<property name="removeAbandoned" value="true" />-->
        <!-- 数据库连接过多长时间不用将被视为被遗弃而收回连接池中 -->
         <!--<property name="removeAbandonedTimeout" value="120" />-->
        <!-- #连接的超时时间,默认为半小时。 -->
        <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>

        <!--# 失效检查线程运行时间间隔,要小于MySQL默认-->
        <property name="timeBetweenEvictionRunsMillis" value="40000"/>
        <!--# 检查连接是否有效-->
        <property name="testWhileIdle" value="true"/>
        <!--# 检查连接有效性的SQL语句-->
        <property name="validationQuery" value="SELECT 1 FROM dual"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:mappers/*Mapper.xml"></property>

        <!-- 分页插件 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageHelper">
                    <property name="properties">
                        <value>
                            dialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>

    </bean>

    <bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.resume.dao"/>
    </bean>

    <!-- 使用@Transactional进行声明式事务管理需要声明下面这行 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
    <!-- 事务管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        <property name="rollbackOnCommitFailure" value="true"/>
    </bean>


</beans>

这个文件告诉了我们如何配置spring的注解以及一些其他的配置.

以上的其实对于前端都有脚手架工具可以自动生成, 而spring迟迟没有, 只能人肉脚手架, 有点感到spring boot的好了 hhhhhh.

这一篇我们讲解了学习后端你要学什么, 并搭建起了基本框架, 下一篇我们就来实际讲讲如何进行接口开发.

About:

点击下方链接跳转!!

🌟 项目源码 请点这里🌟 »> 喜欢的朋友请点喜欢 »> 下载源码的同学请送下小星星 »> 有闲钱的壕们可以进行打赏 »> 小弟会尽快推出更好的文章和大家分享 »> 你的激励就是我的动力!!

最近的文章

Server 使用Spring来构建服务

刚才一篇我们提到了如何入门后端, 我也知道一篇文章是不可能完成后端的方方面面的, 期望达到的是知道如何进行学习, 有一条清晰的学习路径, 少绕弯路. 这篇我们就来进行简历的接口开发了.参考链接: Server 入门后端你要学什么以下内容在上述文章基础上进行, 请事先查阅.jdbc 代码生成首先我们要做的就是使用mybatis插件进行读取数据库数据并生成jdbc代码.generatorConfig.xml<?xml version="1.0" encoding="UTF-8"?&...…

后端开发继续阅读
更早的文章

Web PC项目快速适配移动端

昨天我们快速的将Vue的项目快速迁移到了React上来, 经过学习两个不同的框架发现, React更加适合复杂的需求以及更加适合我们这种移动端开发者的思维习惯.参考链接: Web 是时候用前端写个简历了! Web 前端项目要从基本布局开始 Web 简历一定要设计的美美的 Web 使用Vue代替陈旧的jQuery Web Vue项目速转.htm静态网页 Web 将项目快速迁移至React以下内容在上述文章基础上进行, 请事先查阅.在着手移动端之前, 我们先给之前的导航栏点击按...…

前端开发继续阅读