第一个IDEA应用程序
创建一个Java Web应用
打开IDEA,点击 Create New Project -> Java -> JavaWeb

我的博客
- 第一步
- 第二步
- 第一章
- 第一节
- 第二节
ackage com.mktech.hello.idea;
public class MyTest {
public static void main(String[] args) {
System.out.println("Hello IDEA");
}
}
Maven的使用
Maven的安装配置
- 下载Maven
下载地址: maven.apache.org/download.cg…

-
添加MAVEN_HOME
指定Maven解压包的路径 -
配置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.0.0-RELEASE -
快照版(自动更新)
1.0.0-SNAPSHOP mysql-1.0.0-201806047115223330003
第一个Maven项目
-
new Project->Maven Project -
修改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>
- 配置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>
- 配置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>
三层结构
- View层: 视图层(MVC将业务和展示分离)
- Service层: 业务逻辑层
- Dao层: 数据访问层
开发模式(测试驱动编程TDD)
Spring的使用
AOC的使用(第一个spring应用)
- 配置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>
- 配置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>
软件开发测试环节
-
单元测试
- 白盒测试 (能够看到完整代码的)
- 黑盒测试 (没有源码的,功能测试)
- 灰盒测试
-
压力测试
- 并发数的问题,能承载多少并发
-
疲劳强度测试
- 长期稳定运行,72小时 7天
-
冒烟测试
- 对主要流程测试,支付环节
-
集成测试
- 完整功能的测试,最重要的是测试 整体业务流程
-
回归测试
- 增加一个功能
-
自动化测试
- 编码、场景设计
JUnit的使用(第一个JUnit单元测试应用)
- 配置添加JUnit的依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Log4j的使用
- 配置添加Log4j的依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
- 配置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项目的搭建
- 创建一个文件名字就叫 my-shop
- 创建 pom.xml
- 完善 pom.xml
- 完善 maven 的目录结构
- 完善架构
- 配置 spring 和 log4j
- 复制 Bootstrap 和 Jquery 到项目中
Spring整合Web
- 引入spring-web包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
- 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注解
- 开启注解模式
<?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>
- 添加注解
- 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的字符串
实现记住我的功能
- 相关知识
- 操作Cookie(Cookie工具类)
SpringMVC的使用
小知识点(SpringMVC的具体实现方式)
- 请求提交到DispatcherServlet分发器(request)
- 分发器通过Handlermapping找到Controller里的方法
- 控制器的方法做完各种逻辑操作就返回页面的名字到DispatcherServlet(Model and logical view name)
- DispatcherServlet通过视图解析器找到对应视图文件位置
- DispatcherServlet将文件结果返回到浏览器(response)
SpringMVC配置步骤
- pom.xml中添加springMvc依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
- 配置字符集过滤器
<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>
- 配置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>
- 配置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>
- 去掉Spring配置的重复扫描
<context:component-scan base-package="com.mrchen.my.shop">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
SpringMVC拦截器的使用
- 配置拦截器
<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>
- 拦截器操作类
public class LoginInterceptor implements HandlerInterceptor
SSM的使用(ORM 对象关系映射)
Druid连接池的使用
- 添加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>
- 配置数据库连接
# 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
- 集成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>
- 配置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的使用
- 引入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>
- 创建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>
- 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对象关系映射
- 添加单元测试相关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>
- 创建用户表格
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
- 创建表对应实体类
- 创建表对应数据访问接口
- 创建表对应业务访问接口
- 定义关系映射文件
<?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>
- 查询的单元测试
@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前端表单验证框架
- 添加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(用于解决查询条件不确定的情况)
- sql标签(代码片段)
<!-- 定义 -->
<sql id="select>
SELECT
id,
name,
age,
score
FORM
student
</sql>
<!-- 引入 -->
<include refid="select"/>
- 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>
- 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>
- 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>
- 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
- 引入icheck相关的css和js
jsp自定义控件
- 定义自定义控件模板
<%@ 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">×</span>
</button>
</div>
<div class="modal-body">
<p>${message}…</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>
- 使用模板
<!-- 引入tag模板目录 -->
<%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %>
<sys:modal message="您还没有选择任何数据,请至少选择一项"></sys:modal>
异步请求后台数据(返回JSON)
- 引入相关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>
- 注意点
$(dom).bind('click', function() {
//这里的内容会叠加绑定,不会覆盖
})
JQuery DataTables插件
lombok插件的使用
- 通过简单的注解形式帮助我们简化消除一些必须有但显得很臃肿的java代码
- IDEA下载lombok插件
- 添加lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
代码开发依据
- 面向对象三大特性:封装、继承、多态
- 面向对象设计原则:开口合里最单依
- 重构原则:事不过三,三则重构
- 写且只写一次
- 拿来主义、关注各种公众号、技术博客、技术论坛
使用Spring Validation简化服务端验证(JSR-303规范)
- 添加spring validate的pom配置
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.4.Final</version>
</dependency>
- 注入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的使用
- 添加对应的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>
- 实现模拟请求接口
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数据的序列化和反序列化)
实体类的分类
- POJO 简单的 JAVA 对象,原生对象
- VO View Object 视图对象 HTML JSP
- DTO Data Transfer Object 数据传输对象
- Entity 实体类 数据库 ORM 实体类数据传输
- domain 领域模型
RESTFul 风格设计 API(分布式超媒体应用)
使用Kaptcha生成验证码
- 添加Kaptcha的pom配置
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>