目录
案例:需求-->我输入一个就打出一个,将这个hello world变成活的🙌
这期咱们来了解一下LayUI并用它编码实现一个登陆页面
一、LayUI简介
LayUI官方网站:https://www.layui.com/(已下线,作者贤心)
参考地址:http://layui.org.cn/demo/index.html(非官网,现由众多开发者维护)
下载到你的非中文目录下,压缩包解压即可用啦!
A.LayUI是什么?
LayUI,是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到 API 的每一处细节都经过精心雕琢,非常适合界面的快速开发。layui 首个版本发布于2016年秋,它区别于那些基于 MVVM 底层的 UI 框架,却并非逆道而行,而是信奉返璞归真之道。准确地说,它更多是为服务端程序员量身定做,开发者无需涉足各种前端工具的复杂配置,只需面对浏览器本身,使得开发十分便捷
B. 主要模块&目录结构
主要模块
layui 提供了丰富的内置模块,他们皆可通过模块化的方式按需加载,其中包括:layer、layDate、layPage、laytpl、table、form、upload、element、tree、layeditor、rate、carousel、flow、util、code等
目录结构
├─css //css目录
│ │─modules //模块css目录(一般如果模块相对较大,会进行单独提取,比如下面三个)
│ │ ├─laydate
│ │ ├─layer
│ │ └─layim
│ └─layui.css //核心样式文件
├─font //字体图标目录
├─images //图片资源目录(目前只有layim和编辑器用到的GIF表情)
│─lay //模块核心目录
│ └─modules //各模块组件
│─layui.js //基础核心库
└─layui.all.js // 包含layui.js和所有模块的合并文件
C.layui、easyui与bootstrap的对比
比较有趣的对比方式:
easyui=jquery+html4(用来做后台的管理界面) 半老徐娘
bootstrap=jquery+html5 美女 拜金
layui 清纯少女
layui和bootstrap的比较
layui和bootstrap这两个都属于UI渲染框架
layui是国人开发的一套框架,2016年出来的,现在已更新到2.X版本了。比较新,轻量级,样式简单好看(目前官网已下架,开源了)
bootstrap 相对来说是比较成熟的一个框架,现在已经更新到4.X版本。是一个很成熟的框架,这个大部分人一般都用过适用范围不同
layui 更偏向与后端开发人员使用,在服务端页面上有非常好的效果
适合做后台框架layui是提供给后端开发人员最好的ui框架,基于DOM驱动,在实现前端交互上比较麻烦,页面的增删改查都需要查询DOM元素。所以在不需要交互的时候,用layui还是不错的(说这句话的人,只能说明你对layui不了解)
bootstrap 在前端响应式方面做得很好,PC端和移动端表现都不错
适合做网站
如果是类似官网,且需要同时满足PC端和移动端效果,bootstrap 表现很好,但是如果是要交互的网站,比如商城之类,layui显然更好,前后端分离
大小不一样1.layui 轻量级
2.bootsrap 因为成熟,所以使用方便,但是同时也是因为成熟,就显得有些冗余
D.layui和easyui对比
1.easyui 是非开源的,有需要解决的问题的话,就只能等官方更新了
2.layui是开源的,社区比较活跃,解决问题还是比较快的
3.easyui诞生的早些,所以功能相对完善一些,很多功能都能是比较健全的
4.layui就相对来说少一些了,不过,功能都是像官网说的,精雕细琢
5.layui更符合现在的审美
二、配置环境&案例
将项目所需的模块导入,后期编码补充完整,在将完整代码补上
MySQL中所用表:⬇⬇⬇⬇⬇
试一试是否能运行出效果⬇⬇⬇⬇(部分电脑需要联网才能有样式)
网页上可以显示出来咱们就开始我们今天编码吧!!!
先将下载的LayUI导入
在创建一个Demo引入LayUI
LayUI.js同步该操作❗❗
后-我们拷贝一个script看看我们访问这个页面时它能不能传入hello world
传了吧,那么到目前为止LayUI就导入成功了,现在我们做一个小功能,目的是告诉大家LayUI呢是要用哪个模块就导哪个模块
案例:需求-->我输入一个就打出一个,将这个hello world变成活的🙌
Demo1源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 引入 layui.css -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/static/js/layui/css/layui.css">
<!-- 引入 layui.js -->
<script src="${pageContext.request.contextPath }/static/js/layui/layui.js"></script>
</head>
<body>
请输入:<input type="text" value="默认值" id="layui_demo1_input">
<button id="layui_demo1_btn">点我有惊喜</button>
<script>
//导入js相对应的模块jQuery.js
layui.use(['layer', 'form','jquery'], function(){
var layer = layui.layer
,form = layui.form
//将模块赋值给变量
,$ = layui.jquery;
//给button添加点击事件
$("#layui_demo1_btn").click(function(){
var layui_demo1_input=$("#layui_demo1_input").val();
layer.msg(layui_demo1_input);
});
layer.msg('Hello World');
});
</script>
</body>
</html>
三、自定义LayUI模块
我们先看看官网⬇⬇⬇⬇
在静态目录下创建一个mymodule文件 (图中已标明😜)
mymod.js源码:
layui.define(function(exports){ //提示:模块也可以依赖其它模块,如:layui.define('mod1', callback);
var obj = {
hello: function(str){
alert('Hello '+ (str||'mymod'));
},say: function(str){
alert('say '+ (str||'mymod'));
}
};
//输出 mymod 接口 导出的模块名要与该js一致
exports('mymod', obj);
});
mymodule_config.js源码:
//config的设置是全局的
layui.config({
base: 'static/js/layui/mymodule/js/' //假设这是你存放拓展模块的根目录
}).extend({ //设定模块别名
mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名
});
我们创建一个Demo2测试自定义模块成功了不:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 引入 layui.css -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/static/js/layui/css/layui.css">
<!-- 引入 layui.js -->
<script src="${pageContext.request.contextPath }/static/js/layui/layui.js"></script>
<!-- 将我刚刚写的两个js导入 -->
<script src="${pageContext.request.contextPath }/static/js/layui/mymodule/js/mymod.js"></script>
<script src="${pageContext.request.contextPath }/static/js/layui/mymodule/mymodule_config.js"></script>
</head>
<body>
请输入:<input type="text" value="默认值" id="layui_demo1_input">
<button id="layui_demo1_btn">点我有惊喜</button>
请输入相关文字:<input type="text" value="默认值" id="layui_demo1_input">
<button id="layui_demo2_btn">自定义模块</button>
<script>
//导入js相对应的模块jQuery.js
layui.use(['layer', 'form','jquery','mymod'], function(){
var layer = layui.layer
,form = layui.form
,mymod = layui.mymod
//将模块赋值给变量
,$ = layui.jquery;
//给button添加点击事件
$("#layui_demo1_btn").click(function(){
var layui_demo1_input=$("#layui_demo1_input").val();
layer.msg(layui_demo1_input);
});
//给自定义模块按钮添加点击事件
$("#layui_demo2_btn").click(function(){
var layui_demo2_input=$("#layui_demo2_input").val();
mymod.say(layui_demo2_input);
mymod.hello(layui_demo2_input);
});
layer.msg('Hello World');
});
</script>
</body>
</html>
四、登录界面
进入主题啦!前面的也得仔细看那都是精华
想使用LayUI布局前端代码时,我们可以再示例中找所需的
创建一个公共页面,在登录界面引入LayUI样式
上面拷贝的前端代码运行效果⬇⬇⬇⬇⬇
使用LayUI的前端代码大概就是这样操作,看看以下编辑的前端代码
login:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 导入公共界面 -->
<%@ include file="common/header.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" rev="stylesheet" href="${pageContext.request.contextPath }/static/css/iconfont.css" type="text/css" media="all">
<link rel="stylesheet" rev="stylesheet" href="${pageContext.request.contextPath }/static/css/login.css" type="text/css" media="all">
<style> body{color:#;}a{color:#;}a:hover{color:#;}.bg-black{background-color:#;}.tx-login-bg{background:url(images/bg.jpg) no-repeat 0 0;}</style>
</head>
<body class="tx-login-bg">
<div class="tx-login-box">
<div class="login-avatar bg-black">
<i class="iconfont icon-wode"></i>
</div>
<ul class="tx-form-li row">
<li class="col-24 col-m-24"><p>
<input type="text" id="username" placeholder="登录账号" class="tx-input">
</p></li>
<li class="col-24 col-m-24"><p>
<input type="password" id="password" placeholder="登录密码" class="tx-input">
</p></li>
<li class="col-24 col-m-24">
<p class="tx-input-full">
<button id="login" class="tx-btn tx-btn-big bg-black">登录</button>
</p></li>
<li class="col-12 col-m-12"><p>
<a href="#" class="f-12 f-gray">新用户注册</a>
</p></li>
<li class="col-12 col-m-12"><p class="ta-r">
<a href="#" class="f-12 f-gray">忘记密码</a>
</p></li>
</ul>
</div>
</body>
</html>
这是目前代码的运行效果⬇⬇⬇⬇
咱们建立一个User / UserAction
package com.zking.entity;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
super();
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
package com.zking.web;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zking.entity.User;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.R;
import com.zking.util.ResponseUtil;
/**
* 处理前台的请求
* 实现子控制器
* @author Administrator
*
*/
public class UserAction extends ActionSupport implements ModelDriver<User>{
private User user=new User();//接收前台所有参数值
/*//写一个方法,处理前台的请求
public String login(HttpServletRequest req, HttpServletResponse resp) {
//定义一个map集合
Map<String, Object> map=new HashMap<String, Object>();
//假设在页面输入用户/密码为张三、123456;则登录成功反之不成功
if("zhangsan".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
//向前台响应数据 登录成功
map.put("code", 200);
map.put("msg", "成功");
}
else {
//登录失败
map.put("code", 0);
map.put("msg", "账户密码错误");
}
try {
ResponseUtil.writeJson(resp, map);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}*/
//简化改造版
//写一个方法,处理前台的请求
public String login(HttpServletRequest req, HttpServletResponse resp) {
try {
//假设在页面输入用户/密码为张三、123456;则登录成功反之不成功
if("zhangsan".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
ResponseUtil.writeJson(resp, new R().data("code", 200).data("msg", "成功"));
}
else {
ResponseUtil.writeJson(resp, new R().data("code", 0).data("msg", "失败"));
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public User getModel() {
return user;
}
}
两个工具类
ResponseUtil / R
package com.zking.util;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 响应工具类
* @author Administrator
*
*/
public class ResponseUtil {
public static void write(HttpServletResponse response,Object o)throws Exception{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.println(o.toString());
out.flush();
out.close();
}
public static void writeJson(HttpServletResponse response,Object o)throws Exception{
ObjectMapper om = new ObjectMapper();
// om.writeValueAsString(o)浠h〃浜唈son涓�
write(response, om.writeValueAsString(o));
}
}
package com.zking.util;
import java.util.HashMap;
public class R extends HashMap{
public R data(String key, Object value) {
this.put(key, value);
return this;
}
}
Ajax;编辑login页面中
<!-- 向后台发送请求 -->
<script type="text/javascript">
layui.use(['jquery','layer'],function(){
let $=layui.jquery
,layer=layui.layer;
$("#login").click(function(){
$.ajax({
url:"${pageContext.request.contextPath }/user.action?methodName=login"
,dataType:'json'
,data:{
username:${"#username"}.val(),
password:${"#password"}.val()
}
,success:function(data){
//console.log(data);
if(data.code==200){
layer.alert(data.msg,{icon:1});
//登录成功,跳到主页
location.href='main.jsp';
}
else{
layer.alert(data.msg,{icon:2});
}
}
});
});
});
</script>
记得要在配置文件MVC.xml中配置
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/blog" type="com.zking.web.BlogAction">
<forward name="list" path="/blogList.jsp" redirect="false" />
<forward name="toList" path="/blog.action?methodName=list"
redirect="true" />
<forward name="toEdit" path="/blogEdit.jsp" redirect="false" />
</action>
<action path="/user" type="com.zking.web.UserAction">
</action>
</config>
到这里内容也差不多了,拜拜