Java高级学习(比较标准的MarkDown格式)

746 阅读7分钟

第一个IDEA应用程序

创建一个Java Web应用

打开IDEA,点击 Create New Project -> Java -> JavaWeb

图1

我的博客

  1. 第一步
  2. 第二步
  • 第一章
    • 第一节
    • 第二节
ackage com.mktech.hello.idea;

public class MyTest {
    public static void main(String[] args) {
        System.out.println("Hello IDEA");
    }
}

Maven的使用

Maven的安装配置

  1. 下载Maven
    下载地址: maven.apache.org/download.cg…

  1. 添加MAVEN_HOME
    指定Maven解压包的路径

  2. 配置Maven的本地仓库

语义化版本规范

* 1.0.1 1 第一个版本
* 1.0.1 1(最后一位数) 修复 BUG FIX 1.0.1
* 1.1.0 1(第二位数) 增加了一个功能个或减少了一个功能
* 1.1.1 基于1.1.0修复了一个BUG
* 2.0.0 结构变化  
或者  
* 逢10进1

发行版或者快照版

  1. 发行版
    1.0.0-RELEASE

  2. 快照版(自动更新)
    1.0.0-SNAPSHOP mysql-1.0.0-201806047115223330003

第一个Maven项目

  1. new Project -> Maven Project

  2. 修改maven中心仓库数据源

<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
  1. 配置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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mrchen</groupId>
    <artifactId>hello-maven</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
  1. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

</web-app>

三层结构

  1. View层: 视图层(MVC将业务和展示分离)
  2. Service层: 业务逻辑层
  3. Dao层: 数据访问层

开发模式(测试驱动编程TDD)

Spring的使用

AOC的使用(第一个spring应用)

  1. 配置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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mrchen</groupId>
    <artifactId>hello-spring</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.17.RELEASE</version>
        </dependency>
    </dependencies>
</project>
  1. 配置spring-context.xml
    备注(约定名称):
    spring.xml context.xml springContext.xml application.xml applicationContext.xml application-context.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"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


</beans>

软件开发测试环节

  1. 单元测试

    • 白盒测试 (能够看到完整代码的)
    • 黑盒测试 (没有源码的,功能测试)
    • 灰盒测试
  2. 压力测试

    • 并发数的问题,能承载多少并发
  3. 疲劳强度测试

    • 长期稳定运行,72小时 7天
  4. 冒烟测试

    • 对主要流程测试,支付环节
  5. 集成测试

    • 完整功能的测试,最重要的是测试 整体业务流程
  6. 回归测试

    • 增加一个功能
  7. 自动化测试

    • 编码、场景设计

JUnit的使用(第一个JUnit单元测试应用)

  1. 配置添加JUnit的依赖
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

Log4j的使用

  1. 配置添加Log4j的依赖
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
</dependency>
  1. 配置log4j.properties文件
log4j.rootLogger=INFO, console, file

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=logs/log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n

my-shop项目的搭建

  1. 创建一个文件名字就叫 my-shop
  2. 创建 pom.xml
  3. 完善 pom.xml
  4. 完善 maven 的目录结构
  5. 完善架构
  6. 配置 spring 和 log4j
  7. 复制 Bootstrap 和 Jquery 到项目中

Spring整合Web

  1. 引入spring-web包
 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.17.RELEASE</version>
 </dependency>
  1. web.xml中添加配置
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-context*.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

使用spring注解

  1. 开启注解模式
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.funtl.leeshop" />
</beans>
  1. 添加注解
  • spirng的注解
* @Component(value="student"):value用于指定该bean的id值
 * @Repository:用于对DAO实现类进行注解
 * @Service:用于对Service实现类进行注解
 * @Controller:用于对Controller实现类进行注解
 * @Scope("prototype"):指定类的作用域,默认singleton
 * @Value("1"):指定属性要指定注入的值(初始值)
 * @Autowired:自动注入属性
 * @Resource(name="userService"):创建指定的bean
 * @PostConstruct:相当于初始化的构造函数
 * @RequestMapping(value="", method=""):指定前端调用的url路径,返回值解析为跳转路径
 * @ModelAttribute注解的使用
    1. 用法解释  
        * 在一个类中,如果定义了一个@ModelAttribute注解的方法,在执行任何@RequestMapping方法前都会先执行该方法
        * 可以返回一个Model自动将属性封装到model中
 * @ResponseBody:一般异步获取数据使用,返回结果直接写入HTTP响应正文中(返回数据格式json,xml)
 * @PathVariable:指定接收的参数, 路径参数
 * @RequestParams:指定参数是否必须
  • jackson-annotations的注解
 * @JsonIgnore注解:设置实体类某个属性不被封装成JSON
 * @JsonValue注解:设置实体类的某个属性变成该别名
  • lombok的注解
* @Data指定对应的实体类,编译时自动添加get和set方法
  • spring validate的注解
* @null:验证对象是否为null
* @Notnull:验证对象是否不为null,无法检查长度为0的字符串

实现记住我的功能

  1. 相关知识
  • 操作Cookie(Cookie工具类)

SpringMVC的使用

小知识点(SpringMVC的具体实现方式)

  • 请求提交到DispatcherServlet分发器(request)
  • 分发器通过Handlermapping找到Controller里的方法
  • 控制器的方法做完各种逻辑操作就返回页面的名字到DispatcherServlet(Model and logical view name)
  • DispatcherServlet通过视图解析器找到对应视图文件位置
  • DispatcherServlet将文件结果返回到浏览器(response)

SpringMVC配置步骤

  1. pom.xml中添加springMvc依赖
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>${spring.version}</version>
 </dependency>
  1. 配置字符集过滤器
<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 配置Spring的Servlet分发器处理所有HTTP的请求和响应
<servlet>
    <servlet-name>springServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/spring-mvc*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  1. 配置spring-mvc.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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">

    <description>Spring MVC Configuration</description>

    <!-- 加载配置属性文件 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:myshop.properties"/>

    <!-- 使用 Annotation 自动注册 Bean,只扫描 @Controller -->
    <context:component-scan base-package="com.mrchen.my.shop" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 默认的注解映射的支持 -->
    <mvc:annotation-driven />

    <!-- 定义视图文件解析 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="${web.view.prefix}"/>
        <property name="suffix" value="${web.view.suffix}"/>
    </bean>

    <!-- 静态资源映射 -->
    <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
</beans>
  1. 去掉Spring配置的重复扫描
 <context:component-scan base-package="com.mrchen.my.shop">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

SpringMVC拦截器的使用

  1. 配置拦截器
 <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/login"/>
        <mvc:exclude-mapping path="/static/**"/>
        <bean class="com.mrchen.my.shop.web.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>
  1. 拦截器操作类
public class LoginInterceptor implements HandlerInterceptor

SSM的使用(ORM 对象关系映射)

Druid连接池的使用

  1. 添加Spring-durid依赖包配置
 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${alibaba-druid.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
  1. 配置数据库连接
# JDBC
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/myshop?useUnicode=true&useSSL=false&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

# JDBC Pool
jdbc.pool.init=1
jdbc.pool.minIdle=3
jdbc.pool.maxActive=20

#JDBC Test
jdbc.testSql=SELECT 'x' FORM DUAL
  1. 集成spring-druid配置文件
<?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:context="http://www.springframework.org/schema/context"
       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">

    <!-- 加载配置属性文件 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:myshop.properties"/>

    <!-- 数据源配置, 使用 Druid 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
        <property name="driverClassName" value="${jdbc.driverClass}"/>

        <!-- 基本属性 url、user、password -->
        <property name="url" value="${jdbc.connectionURL}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="${jdbc.pool.init}"/>
        <property name="minIdle" value="${jdbc.pool.minIdle}"/>
        <property name="maxActive" value="${jdbc.pool.maxActive}"/>

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000"/>

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <property name="validationQuery" value="${jdbc.testSql}"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="stat"/>
    </bean>
</beans>
  1. 配置Druid的监控中心
<servlet>
    <servlet-name>DruidStatView</servlet-name>
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DruidStatView</servlet-name>
    <url-pattern>/druid/*</url-pattern>
</servlet-mapping>

spring-mybaties的使用

  1. 引入mybaties相关的pom配置
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
</dependency>
  1. 创建MyBatis(mybatis-config.xml)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 全局参数 -->
    <settings>
        <!-- 打印 SQL 语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />

        <!-- 使全局的映射器启用或禁用缓存。 -->
        <setting name="cacheEnabled" value="false"/>

        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
        <setting name="lazyLoadingEnabled" value="true"/>

        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="true"/>

        <!-- 是否允许单条 SQL 返回多个数据集 (取决于驱动的兼容性) default:true -->
        <setting name="multipleResultSetsEnabled" value="true"/>

        <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
        <setting name="useColumnLabel" value="true"/>

        <!-- 允许 JDBC 生成主键。需要驱动器支持。如果设为了 true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false  -->
        <setting name="useGeneratedKeys" value="false"/>

        <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不映射 PARTIAL:部分 FULL:全部  -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>

        <!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
        <setting name="defaultExecutorType" value="SIMPLE"/>

        <!-- 使用驼峰命名法转换字段。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
        <setting name="localCacheScope" value="SESSION"/>

        <!-- 设置 JDBC 类型为空时,某些驱动程序 要指定值, default:OTHER,插入空值时不需要指定类型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
</configuration>
  1. Spring整合MyBatis的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="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">

    <!-- 配置 SqlSession -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 用于配置对应实体类所在的包,多个 package 之间可以用 ',' 号分割 -->
        <property name="typeAliasesPackage" value="com.funtl.my.shop.domain"/>
        <!-- 用于配置对象关系映射配置文件所在目录 -->
        <property name="mapperLocations" value="classpath:/mapper/**/*.xml"/>
        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
    </bean>

    <!-- 扫描 Mapper -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.funtl.my.shop.web.admin.dao" />
    </bean>
</beans>

第一个MyBatis对象关系映射

  1. 添加单元测试相关pom依赖配置
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
</dependency>
  1. 创建用户表格
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  1. 创建表对应实体类
  2. 创建表对应数据访问接口
  3. 创建表对应业务访问接口
  4. 定义关系映射文件
<?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.mrchen.my.shop.admin.dao.TbUserDao">
    <select id="selectAll" resultType="TbUser">
        select
        a.id,
        a.username,
        a.password,
        a.phone,
        a.email,
        a.created,
        a.updated
        from
        tb_user as a
    </select>
</mapper>
  1. 查询的单元测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context.xml","classpath:spring-context-druid.xml","classpath:spring-context-mybatis.xml"})
public class TbUserServiceTest {
    @Autowired
    private TbUserService tbUserService;

    @Test
    public void testSelectAll() {
        List<TbUser> tbUsers = tbUserService.selectAll();
        for (TbUser tbUser : tbUsers) {
            System.out.println(tbUser.getUsername());
        }
    }
}

spring的表单标签库

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

使用JQuery Validation前端表单验证框架

  1. 添加js依赖文件配置
<script src="/static/assets/plugins/jquery-validation/js/jquery.validate.min.js"></script>
<script src="/static/assets/plugins/jquery-validation/js/additional-methods.min.js"></script>
<script src="/static/assets/plugins/jquery-validation/js/localization/messages_zh.js"></script>

MyBatis动态SQL(用于解决查询条件不确定的情况)

  1. sql标签(代码片段)
<!-- 定义 -->
<sql id="select>
    SELECT
        id,
        name,
        age,
        score
    FORM
        student
</sql>
<!-- 引入 -->
<include refid="select"/>
  1. if标签(条件判断)
<select id="selectByIf" resultType="com.mrchen.my.shop.mybatis.entity.Student">
    SELECT
        id,
        name,
        age,
        score
    FORM
        student
    WHERE 1 = 1
    <if test="name != null and name != ''">
        AND name LIKE concat('%', #{name}, '%')
    </if>
    <if test="age != null and age > 0">
        AND age > #{age}
    </if>
</select>
  1. where标签(单独使用if需要加1=1)
<select id="selectByWhere" resultType="com.mrchen.my.shop.mybatis.entity.Student">
    SELECT
        id,
        name,
        age,
        score
    FORM
        student
    <where>
        <if test="name != null and name != ''">
            AND name LIKE concat('%', #{name}, '%')
        </if>
        <if test="age != null and age > 0">
            AND age > #{age}
        </if>
    </where>
</select>
  1. choose标签(等同于switch...case...语句)
<select id="selectByChoose" resultType="com.mrchen.my.shop.mybatis.entity.Student">
    SELECT
        id,
        name,
        age,
        score
    FORM
        student
    <where>
        <choose>
            <when test="name != null and name != ''">
                AND name LIKE concat('%', #{name}, '%')
            </when>
            <when test="age != null and age > 0">
                AND age > #{age}
            </when>
            <otherwise>
                AND 1 != 1
            </otherwise>
        </choose>
    </where>
</select>
  1. foreach标签(遍历数组)
  • 该标签的属性
    • collection(array或者list) 表示要遍历的集合类型,这里是数组,即array
    • open、close、separator为对遍历内容的SQL拼接
  • 查询id为2与4的学生信息
<select id="selectByForeach" resultType="com.mrchen.my.shop.mybatis.entity.Student">
    SELECT
        id,
        name,
        age,
        score
    FORM
        student
    <if test="array != null and array.length > 0">
        WHERE id IN
        <foreach collection="array" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </if>
</select>

热部署插件(Jrebel)

jQuery iCheck

  1. 引入icheck相关的css和js

jsp自定义控件

  1. 定义自定义控件模板
<%@ tag language="java" pageEncoding="UTF-8" %>
<%@ attribute name="title" type="java.lang.String" required="false" description="模态框的标题" %>
<%@ attribute name="message" type="java.lang.String" required="true" description="模态框的信息" %>

<div class="modal fade" id="modal-default">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">${title == null?"温馨提示": title}</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <p>${message}&hellip;</p>
            </div>
            <div class="modal-footer justify-content-between">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" class="btn btn-primary">确定</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
    <!-- /.modal-dialog -->
</div>

  1. 使用模板
<!-- 引入tag模板目录 -->
<%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %>

<sys:modal message="您还没有选择任何数据,请至少选择一项"></sys:modal>

异步请求后台数据(返回JSON)

  1. 引入相关pom文件配置
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
<!-- 处理自定义类型 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>
  1. 注意点
$(dom).bind('click', function() {  
    //这里的内容会叠加绑定,不会覆盖  
})

JQuery DataTables插件

lombok插件的使用

  1. 通过简单的注解形式帮助我们简化消除一些必须有但显得很臃肿的java代码
  2. IDEA下载lombok插件
  3. 添加lombok依赖
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
</dependency>

代码开发依据

  1. 面向对象三大特性:封装、继承、多态
  2. 面向对象设计原则:开口合里最单依
  3. 重构原则:事不过三,三则重构
  4. 写且只写一次
  5. 拿来主义、关注各种公众号、技术博客、技术论坛

使用Spring Validation简化服务端验证(JSR-303规范)

  1. 添加spring validate的pom配置
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.4.Final</version>
</dependency>
  1. 注入Validator工具类
<!-- 配置 Bean Validator 定义 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean id="beanValidator" class="com.funtl.my.shop.commons.validator.BeanValidator">
    <property name="validator" ref="validator" />
</bean>

Apache HttpClient的使用

  1. 添加对应的pom配置
 <properties>
    <apache-httpclient.version>4.5.5</apache-httpclient.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${apache-httpclient.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>fluent-hc</artifactId>
        <version>${apache-httpclient.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>${apache-httpclient.version}</version>
    </dependency>
</dependencies>
  1. 实现模拟请求接口
public class MyTest {
    public static void main(String[] args) {
        // 创建 HttpClient客户端, 打开浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://localhost:8085/user/page");
        httpPost.setHeader("Connection", "keep-alive");
        httpPost.setHeader("Cookie", "JSESSIONID=EC021513E0F3C425A269127B534D15FD");
        httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36");

        // 创建请求参数
        List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
        params.add(new BasicNameValuePair("draw", "1"));
        params.add(new BasicNameValuePair("start", "1"));
        params.add(new BasicNameValuePair("length", "10"));

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            System.out.println(EntityUtils.toString(httpEntity));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void get() {
        // 创建 HttpClient客户端, 打开浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // 创建 GET 请求,输入URL
        HttpGet httpGet = new HttpGet("http://localhost:8085/user/page?draw=1&start=1&length=10");
        httpGet.setHeader("Connection", "keep-alive");
        httpGet.setHeader("Cookie", "JSESSIONID=05CF17F719877B15B4D95CD9EFC5AF58");
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36");

        try {
            CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            System.out.println(EntityUtils.toString(httpEntity));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用Jackson处理JSON数据(JSON数据的序列化和反序列化)

实体类的分类

  1. POJO 简单的 JAVA 对象,原生对象
  2. VO View Object 视图对象 HTML JSP
  3. DTO Data Transfer Object 数据传输对象
  4. Entity 实体类 数据库 ORM 实体类数据传输
  5. domain 领域模型

RESTFul 风格设计 API(分布式超媒体应用)

使用Kaptcha生成验证码

  1. 添加Kaptcha的pom配置
<dependency>
    <groupId>com.google.code.kaptcha</groupId>
    <artifactId>kaptcha</artifactId>
    <version>${kaptcha.version}</version>
</dependency>

使用Apache Commons Email实现邮件发送功能