在处理完基本的部署后,SpringBoot已经可以实现将数据库数据回传到前端以JSON形式展示,但是SpringBoot要进行前端页面的跳转呢,在非前后端分离的项目中,页面跳转是交给后端来发布命令的,因此,我们一般是通过Thymeleaf框架与frameWorker框架两个执行使用,无论是springmvc或者SpringBoot都是样的处理方式!
1-----SpringBoot热部署:
SpingBoot不仅是对SpringMvc进行高度封装,其本身也对Tomcat进行了封装,实现了一键启动和关闭的作用,但是对于开发中我们的频繁修改代码,每次都要进行重启,这明显是很不友好的 ,因此SpringBoot的热部署插件出现了!
1.添加依赖
分别添加依赖和插件
POM文件依赖包:
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Plugin插件包:
<!--热部署插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork><!--保证devtools可以重启-->
<addResources>true</addResources><!--加载静态资源-->
</configuration>
</plugin>
2.进行IDEA的设置
当部署完成后,需要启动IDEA的权限,使得它允许被程序调用.
---------File-Settings-Compiler-Build Project automatically或者直接搜索compiler
-------注册按钮的启动:
对于2017.2.15版本或已经被中文版本化的IDEA版本,可能会出现命令1失效,如果失效请使用第二条命令:
命令1:请看第二条
命令2:ctrl + shift + alt + /,选择Registry,勾上 Compiler autoMake allow when app running
3.实现效果:
效果1:修改类或者配置文件,应用会进行重启
效果2:修改静态页面,在thymeleaf已经被配置为cache缓存为false的情况下,应用会被重载(不是重启)
2--------配置Thyemleaf页面跳转
1 .添加依赖
SpringBoot支持想前端传递json数据,但是对于页面跳转则需要另外的设置以保证其能加载和识别HTML,追加依赖如下:
POM文件中依赖如下:
<!--页面框架-freemarker-->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>-->
<!--两者可以共存,但是一般常用以下-->
<!--页面框架-thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2 .页面使用
步骤1:在resources文件夹里面设置templates模块,设置如下:
步骤2:进行application.yml文件的节点配置-->设置通用的必须参数
步骤3:关闭服务器的缓存:
步骤4:代码如何写
在后端通常采用如下:
前端一般这么用:
此处的js和bootstarp和validator都是在后端的resources配置好的,其语法网络上已经上五花八门的介绍,这里便不再多说,可自行搜索thymeleaf页面语法!
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>登录</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- jquery @{}里面的斜杠表示static静态文件夹-->
<script type="text/javascript" th:src="@{/js/jquery.min.js}"></script>
<!-- bootstrap -->
<link rel="stylesheet" type="text/css" th:href="@{/bootstrap/css/bootstrap.min.css}" />
<script type="text/javascript" th:src="@{/bootstrap/js/bootstrap.min.js}"></script>
<!-- jquery-validator 用于做表单验证-->
<script type="text/javascript" th:src="@{/jquery-validation/jquery.validate.min.js}"></script>
<script type="text/javascript" th:src="@{/jquery-validation/localization/messages_zh.min.js}"></script>
<!-- layer -->
<script type="text/javascript" th:src="@{/layer/layer.js}"></script>
<!-- md5.js -->
<script type="text/javascript" th:src="@{/js/md5.min.js}"></script>
<!-- common.js -->
<script type="text/javascript" th:src="@{/js/common.js}"></script>
<style type="text/css">
html,body{
height:100%;
width:100%;
}
body{
background:url('/img/bg.jpg') no-repeat;
background-size:100% 100%;
padding-top:100px;
}
</style>
</head>
<body>
<form name="loginForm" id="loginForm" method="post" style="width:30%; margin:0 auto;">
<h2 style="text-align:center; margin-bottom: 20px">用户登录</h2>
<div class="form-group">
<div class="row">
<label class="form-label col-md-4">请输入手机号码</label>
<div class="col-md-8">
<input id="mobile" name = "mobile" class="form-control" type="text" placeholder="手机号码" required="true" minlength="11" maxlength="11" />
</div>
<div class="col-md-1">
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<label class="form-label col-md-4">请输入密码</label>
<div class="col-md-8">
<input id="password" name="password" class="form-control" type="password" placeholder="密码" required="true" minlength="6" maxlength="16" />
</div>
</div>
</div>
<div class="row" style="margin-top:40px;">
<div class="col-md-6">
<button class="btn btn-primary btn-block" type="reset" onclick="reset()">重置</button>
</div>
<div class="col-md-6">
<button class="btn btn-primary btn-block" type="submit" onclick="login()">登录</button>
</div>
</div>
</form>
</body>
<script>
function login(){
$("#loginForm").validate({
submitHandler:function(form){
doLogin();
}
});
}
function doLogin(){
g_showLoading();
var inputPass = $("#password").val();
var salt = g_passsword_salt;
var str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
var password = md5(str);
$.ajax({
url: "/login/do_login",
type: "POST",
data:{
mobile:$("#mobile").val(),
password: password
},
success:function(data){
if(data.status == 0){
layer.msg("成功");
window.location.href="/goods/to_list";
}else{
layer.msg(data.msg);
}
//layer.closeAll();
},
error:function(){
layer.closeAll();
}
});
}
</script>
</html>
3------Redis的部署
1.追加依赖
新增Redis的依赖,用于与SpringBoot整合
<!--添加redis的jedis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
格式化存储:
<!--fastjson依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
2.配置
需要增加配置类与依赖类将数据从,application.yml中读取出来
步骤1:application.yml文件的配置
步骤2:添加依赖类并通过注解将数据给动态加载
步骤3:配置注册Redis的JedisPoolConfig工厂类,本贴图为最基本配置
步骤4:基本参数设置,调用工厂类并设置通过方法
注意:该类就是获取jedis的连接并利用对该连接进行封装,然后通过注解@Service被加载到容器中,在其他类中以注解形式被调用
步骤5:调用实例
封装的方法被使用:
4-----JSR303验证框架
JSR303框架提供的是一套通过注解代理高高频校验参数的合法性的框架,可以在一定程度上简化代码并减少业务入侵!并简化开发,此外JSR303还提供一套自定义的校验注解方法,用户可以根据自己的需要在自定义适合自己的注解!在开发中。在开发中为了防止过多的注解,导致代码可读性太差,我们一般使用选择将代码封装在一个工具类!
1.追加依赖:
POM文件依赖:
<!--集成校验模块-通过注解实现也允许自定义-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.注解的想使用
类使用方法1:对于参数的校验,主要是来自于前端回传回来的参数与后端回传出去,接口传递出去的数据,因此我们可以在vo类中进行设置!
类使用方法2:当框架自身提供的注解不满足我们的需求或者不满足我们的逻辑,这个时候可以选择自定义注解,如下:
步骤1:创建 @Interface接口类 。寻找框架提供注解并获取其注解接口类的统一标记语言,维护到自己的@Interface接口上
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class })//表示调用的自定义校验器
public @interface IsMobile {
boolean required() default true;//必备的字段信息,表示必传,当前默认为空
String message() default "手机号码格式错误";//表示错误时候的信息
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
步骤2:创建注解实现类
//自定义的数值校验器
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
//实现Constrain参数
private boolean required = false;//是否必填
//获取刚刚定义器里面的required是否允许为空,注解
public void initialize(IsMobile constraintAnnotation) {
required = constraintAnnotation.required();
}
public boolean isValid(String value, ConstraintValidatorContext context) {
if(required) {
return ValidatorUtil.isMobile(value);
}else {//非必填,判断为空则true
if(StringUtils.isEmpty(value)) {
return true;
}else {//有数据则判断规则
return ValidatorUtil.isMobile(value);
}
}
}
}
当字段回传归来,则可以在vo类里面使用该注解进行注解
步骤3:ValidUtils的内容如下:
public class ValidatorUtil {
private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}");//正则表达式
//手机校验
public static boolean isMobile(String src) {
if(StringUtils.isEmpty(src)) {
return false;
}
Matcher m = mobile_pattern.matcher(src);
return m.matches();
}
// public static void main(String[] args) {
// System.out.println(isMobile("18912341234"));
// System.out.println(isMobile("1891234123"));
// }
}
该工具类可以用于后期,各类参数校验与封装,适用于将对参数的各类校验给统一放置起来,在不同场景下使用~~~~~~~~~