JSON(JavaScript Object Notation)
    1.一种轻量级的数据交换格式
    2.通常用于在客户端和服务器之间传递数据
    3.jQuery的所有参数都是以JSON格式出现
    4.在Struts 2中通过插件的方式实现

优势(较XML):
    1.轻量级交换语言
    2.结构简单
    3.易于解析
    
JSON对象:
    语法:
        var JSON对象 = {key:value,key:value,……};
    范例:{"id":4,"name":"梅西","pwd":"6666"}
【注意:其中的key值必须是字符串】
    
JSON数组:
    语法:
        var JSON数组 = [value,value,……];
    范例:
        var countryArray = ["中国","美国","俄罗斯"];
        var personArray = [
                            {"name":"张三","age":30},
                            {"name":"李四","age":40}
                          ];
                          
步骤:
    1.导入struts2-json-plugin-xxx.jar
    2.在struts.xml中定义package并继承json-default
    3.指定<result>的type属性指定为"json"

================================Result===============================    
一、JSON类型的Result:
    1.参数说明:
        参数                    作用                                         默认值                                   适用场景
        root   指定要序列化的根对象              当前Actin中所有有返回值的getter方法的值    用于指定不需要序列化key值的数据
        includeProperties  指定根对象中要序列化的属性            当前根对象中的所有属性      用于需要序列化的属性较少的情况
        excludeProperties        指定根对象中要排除的属性              null               用于需要排除序列化的属性较少的情况
        excludeNullProperties    指定根对象中是否序列化值为空的属性    false              用于需要过滤空值的情况

2.步骤:
        a.添加第三方插件:struts2-json-plugin-xxx.jar
        b.在struts.xml中指定package继承json-default
        c.指定<result>的type属性为“json”
        d.根据业务需求合理指定param参数
    
    3.作用:
        a.返回JSON格式数据,配合jQuery实现Ajax
        b.param参数
        c.root、 includeProperties、 excludeProperties、 excludeNullProperties

范例:登录表单
1.User实体类

 package com.Elastic.StrutsDemo6.ivy.entity;
spublic class User {
private String loginName;
private String loginPass; public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPass() {
return loginPass;
}
public void setLoginPass(String loginPass) {
this.loginPass = loginPass;
} }

2.UserAction类

 package com.Elastic.StrutsDemo6.ivy.action;

 import java.util.Date;
import java.util.HashMap;
import java.util.Map; import com.Elastic.StrutsDemo6.ivy.entity.User;
import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport {
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} private Map<String, Object> jsonResult = new HashMap<String, Object>(); public Map<String, Object> getJsonResult() {
return jsonResult;
} public void setJsonResult(Map<String, Object> jsonResult) {
this.jsonResult = jsonResult;
} public String login() { //登陆成功以后,额外添加的信息
/*jsonResult.put("success", true);
jsonResult.put("data", user);
jsonResult.put("msg", "登陆成功");
jsonResult.put("loginTime", new Date());*/ if ("admin".equals(user.getLoginName().trim()) && "123456".equals(user.getLoginPass().trim())) {
jsonResult.put("success", true);
jsonResult.put("data", user);
jsonResult.put("msg", "登陆成功");
jsonResult.put("loginTime", new Date());
} else {
jsonResult.put("success", false);
jsonResult.put("msg", "登陆失败");
jsonResult.put("loginTime", new Date());
}
return SUCCESS;
}
}

3.struts.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" >
<struts>
<!-- 使用JSON配置 -->
<package name="jsonDefault" namespace="/" extends="json-default">
<action name="login" class="com.Elastic.StrutsDemo6.ivy.action.UserAction" method="login"> <!-- 配置JSON类型的result -->
<!--type属性指定为"json"",将返回序列化的JSON格式数据-->
<result type="json">
<!-- <param name="root">user</param> -->
<param name="root">jsonResult</param>
</result>
</action> </package>
</struts>

4.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>StrutsDemo6_ivy</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

5.valid.js

 /**
* rules: 对象
*/ var rules = {
loginName : {
rule : {
required : true,
length : [6,12]
},
msg : {
required : '用户名不能为空',
length : '用户名的长度必须在6-12位之间'
}
}, loginPass : {
rule : {
length : [6,12]
},
msg : {
length : '密码的长度必须在6-12位之间'
}
}
}; function validForm(form,rules) {
for ( var p in rules) {
form.find('#' + p).on('valid',rules[p],function(event){
//使用event.data, msg内容才会不同!!!
var inputRules = event.data.rule; for ( var r in inputRules) {
var value = $(this).val();
if (r === 'required' && inputRules[r] === true) {
if (value === '') {
$(this).data('success',false); $(this).closest('div').next().html(event.data.msg[r]); } else {
$(this).data('success',true);
$(this).closest('div').next().html('');
}
} //验证先后顺序
/*if ($(this).data('success') === false) {
return;
}*/ if (r === 'length' && inputRules[r]) {
if (value.length > inputRules[r][1] || value.length < inputRules[r][0]) {
$(this).data('success',false); $(this).closest('div').next().html(event.data.msg[r]); } else {
$(this).data('success',true);
$(this).closest('div').next().html('');
}
}
}
});
} //事件绑定一次
function valid() {
//trigger:触发valid事件
form.find(':input').trigger('valid');
var success = true; form.find(':input').each(function() {
if ($(this).data('success') === false) {
success = false;
return;
}
});
return success;
} return valid;
}

6.login.jsp

 <%--引入JSP页面PAGE指令 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 引入JSTL标签指令 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html language="zh-CN">
<head>
<meta charset="utf-8">
<!-- 设置浏览器渲染的引擎 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置支持移动设备 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>网页标题</title>
<!-- 引入bootstrap的样式 -->
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/bootstrap.min.css">
</head>
<body>
<div class="container"> <div class="panel panel-primary">
<div class="panel-heading">登陆</div>
<div class="panel-body">
<form class="form-horizontal" action="login" method="post" data-role="login">
<div class="form-group">
<label class="col-md-3 control-label" for="loginName">用户名:</label>
<div class="col-md-6">
<input class="form-control" id="loginName" name="user.loginName" type="text" autocomplete="off" />
</div>
<div class="col-md-3"> </div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="loginPass">密码:</label>
<div class="col-md-6">
<input class="form-control" id="loginPass" name="user.loginPass" type="password" />
</div>
<div class="col-md-3"> </div>
</div>
<div class="form-group">
<input class="btn btn-primary btn-block" data-role="login" type="button" value="登陆" />
</div>
</form>
</div>
</div>
</div> <!-- 引入JS的样式 -->
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-2.2.4.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/bootstrap.min.js"></script> <script type="text/javascript" src="<%=request.getContextPath()%>/js/valid.js"></script> <script type="text/javascript">
//JSON对象
//测试
/* var person = {
"name":"李四",
"age":20
}; alert(person.age); */ $(function() {
//方法二
//给表单元素绑定一个自定义的验证事件
/* $('#loginName').on('valid', function() {
var name = $(this).val();
if ('' == name) {
$(this).closest('div').next().html('用户名不能为空!');
$(this).data('success', false);
} else {
$(this).closest('div').next().html('');
$(this).data('success', true);
} });
$('#loginPass').on('valid', function() {
var name = $(this).val();
if ('' == name) {
$(this).closest('div').next().html('密码不能为空!');
$(this).data('success', false);
} else {
$(this).closest('div').next().html('');
$(this).data('success', true);
} }); */ var valid = validForm($('form'), rules); $('[data-role="login"]').click(function() {
//获取表单
var $form = $(this).closest('form'); $.ajax({
url : "login",
type : "post",
data : $form.serialize(),
//data : $(this).closest('form').serialize(),
beforeSend : function() {
/* var success = true; //trigger:触发valid事件
$form.find(':input').trigger('valid');
$form.find(':input').each(function() {
if ($(this).data('success') === false) {
success = false;
return;
}
});
return success;*/ //方法三
//返回方法
return valid(); //方法一:
/* var name = $('#loginName').val();
if ('' == name) {
$('#loginName').closest('div').next().html('用户名不能为空!');
return false;
} else {
$('#loginName').closest('div').next().html('');
} var pass = $('#loginPass').val();
if ('' == pass) {
$('#loginPass').closest('div').next().html('密码不能为空!');
return false;
} else {
$('#loginPass').closest('div').next().html('');
} */
},
success : function(result) {
//返回result(对象)
//alert(result);
alert(result.msg);
if (result.success) {
//window.location = 'index.jsp';
}
} });
});
});
</script>
</body>
</html>

二、Stream类型的Result    
    1.步骤:
        a.定义一个InputStream类型的成员变量
        b.给该变量添加getter和setter方法
        c.将要发送到客户端的数据赋值给该变量
        d.根据业务需求合理指定param参数
        
    2.作用:
        a.返回二进制数据,配合jQuery实现Ajax,或者实现验证码
    
    3.param参数
        a.contentType、inputStream

范例:验证码--在上一个范例的基础上修改
1.CodeAction类

 package com.Elastic.StrutsDemo6.ivy.action;

 import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date; import javax.imageio.ImageIO; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class CodeAction extends ActionSupport {
private InputStream inputStream; public InputStream getInputStream() throws IOException {
//1.随机生成4位的验证码
String[] strs = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7",
"8", "9" };
String code = "";
for (int i = 0; i < 4; i++) {
String temp = strs[(int)(Math.random() * strs.length)]; //随机生成大写字母
temp = (int)(Math.random() * 2) == 0 ? temp : temp.toUpperCase();
code += temp;
} //2.生成验证码图片
BufferedImage codeImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);
//得到图片的绘制对象
Graphics2D g2d = codeImg.createGraphics();
//设置填充颜色并填充
g2d.setColor(new Color(240, 240, 240));
g2d.fillRect(0, 0, codeImg.getWidth(), codeImg.getHeight());
//绘制验证码到图片上
Font font = new Font("微软雅黑", Font.PLAIN, 20);
g2d.setFont(font);
//获取字体宽度
FontMetrics fm = g2d.getFontMetrics();
//设置左右空白和字体间隔
float start = 15;
float space = (float)(codeImg.getWidth() - 2 * start - fm.getStringBounds(code, g2d).getWidth()) / (code.length() - 1);
//随机生成每个字符的样式
for (int i = 0; i < code.length(); i++) {
g2d.setColor(getRandomColor());
String temp = code.charAt(i) + "";
g2d.drawString(temp, start, font.getSize());
start += fm.getStringBounds(temp, g2d).getWidth() + space;
} //绘制干扰项
//随机生成点
for (int i = 0; i < 100; i++) {
g2d.setColor(getRandomColor());
int x = (int)(Math.random() * codeImg.getWidth());
int y = (int)(Math.random() * codeImg.getHeight());
g2d.drawLine(x, y, x, y);
}
//随机生成线
for (int i = 0; i < 10; i++) {
g2d.setColor(getRandomColor());
int x = (int)(Math.random() * codeImg.getWidth());
int y = (int)(Math.random() * codeImg.getHeight());
int x1 = (int)(Math.random() * codeImg.getWidth());
int y1 = (int)(Math.random() * codeImg.getHeight());
g2d.drawLine(x, y, x1, y1);
} ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(codeImg, "png", byteArrayOutputStream);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); //把验证码保存到session中
ActionContext.getContext().getSession().put("code", code);
//设置验证码有效时间
ActionContext.getContext().getSession().put("codeMaxTime", new Date().getTime() + 10 * 1000); return byteArrayInputStream;
} public Color getRandomColor() {
int r = (int)(Math.random() * 256);
int g = (int)(Math.random() * 256);
int b = (int)(Math.random() * 256);
return new Color(r, g, b);
} }

2.struts.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" >
<struts> <!-- 使用JSON配置 -->
<package name="jsonDefault" namespace="/" extends="json-default">
<action name="login" class="com.Elastic.StrutsDemo6.ivy.action.UserAction" method="login">
<!-- 配置JSON类型的result -->
<!--type属性指定为"json"",将返回序列化的JSON格式数据-->
<result type="json">
<!-- <param name="root">user</param> -->
<param name="root">jsonResult</param> <!-- ??? -->
<param name="excludeProperties">data.loginPass</param>
<param name="excludeNullProperties">true</param>
</result> </action>
</package> <package name="default" namespace="/" extends="struts-default">
<action name="code" class="com.Elastic.StrutsDemo6.ivy.action.CodeAction">
<result type="stream">
<param name="ContentType">image/jpeg</param>
<param name="inputStream"></param>
</result> </action> </package>
</struts>

3.UserAction类

 package com.Elastic.StrutsDemo6.ivy.action;

 import java.util.Date;
import java.util.HashMap;
import java.util.Map; import com.Elastic.StrutsDemo6.ivy.entity.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport {
private User user; private String code; public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} private Map<String, Object> jsonResult = new HashMap<String, Object>(); public Map<String, Object> getJsonResult() {
return jsonResult;
} public void setJsonResult(Map<String, Object> jsonResult) {
this.jsonResult = jsonResult;
} public String login() { long time = (long) ActionContext.getContext().getSession().get("codeMaxTime");
if (time < new Date().getTime()) {
jsonResult.put("msg", "验证码过期");
jsonResult.put("success", false);
return SUCCESS;
} String sessionCode = ActionContext.getContext().getSession().get("code").toString();
if (sessionCode.equalsIgnoreCase(code)) {
jsonResult.put("msg", "验证码错误");
jsonResult.put("success", false);
return SUCCESS;
} //登陆成功以后,额外添加的信息
/*jsonResult.put("success", true);
jsonResult.put("data", user);
jsonResult.put("msg", "登陆成功");
jsonResult.put("loginTime", new Date());*/ if ("admin".equals(user.getLoginName().trim()) && "123456".equals(user.getLoginPass().trim())) {
jsonResult.put("success", true);
jsonResult.put("data", user);
jsonResult.put("msg", "登陆成功");
jsonResult.put("loginTime", new Date());
} else {
jsonResult.put("success", false);
jsonResult.put("msg", "登陆失败");
jsonResult.put("loginTime", new Date());
}
return SUCCESS;
} }

4.login.jsp

 <%--引入JSP页面PAGE指令 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 引入JSTL标签指令 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html language="zh-CN">
<head>
<meta charset="utf-8">
<!-- 设置浏览器渲染的引擎 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置支持移动设备 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>网页标题</title>
<!-- 引入bootstrap的样式 -->
<link rel="stylesheet" type="text/css"
href="<%=request.getContextPath()%>/css/bootstrap.min.css">
</head>
<body>
<div class="container"> <div class="panel panel-primary">
<div class="panel-heading">登陆</div>
<div class="panel-body">
<form class="form-horizontal" action="login" method="post" data-role="login">
<div class="form-group">
<label class="col-md-3 control-label" for="loginName">用户名:</label>
<div class="col-md-6">
<input class="form-control" id="loginName" name="user.loginName" type="text" autocomplete="off" />
</div>
<div class="col-md-3"> </div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="loginPass">密码:</label>
<div class="col-md-6">
<input class="form-control" id="loginPass" name="user.loginPass" type="password" />
</div>
<div class="col-md-3"> </div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="code">验证码:</label>
<div class="col-md-6">
<input class="form-control" id="code" name="code" type="password" />
<img id="codeImg" alt="" src="code" onclick="getCode()"><a href="javascript:getCode();">看不清楚,换一张?</a>
</div>
<div class="col-md-3"> </div>
</div>
<div class="form-group">
<input class="btn btn-primary btn-block" data-role="login" type="button" value="登陆" />
</div>
</form>
</div>
</div>
</div> <!-- 引入JS的样式 -->
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-2.2.4.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/bootstrap.min.js"></script> <script type="text/javascript" src="<%=request.getContextPath()%>/js/valid.js"></script> <script type="text/javascript">
function getCode() {
document.getElementById('codeImg').src='code?_dc='+new Data();
}
</script> <script type="text/javascript">
$(function() {
var valid = validForm($('form'), rules); $('[data-role="login"]').click(function() {
//获取表单
var $form = $(this).closest('form');
$.ajax({
url : "login",
type : "post",
data : $form.serialize(),
beforeSend : function() {
//返回方法
return valid();
},
success : function(result) {
alert(result.msg);
if (result.success) {
//window.location = 'index.jsp';
}
} });
});
});
</script>
</body>
</html>

Struts(六)的更多相关文章

  1. struts 2读书笔记-----struts2的开发流程

    一.将struts 2的lib文件夹下地commons-fileupload.jar.commons-io.jar.freemarker.jar.javassist.jar.ognl.jar.stru ...

  2. Struts 2 入门

    Struts 2  入门: 一:Struts 2执行流程: 1 客户端发送请求: 2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤 ...

  3. Struts2(十五)实现文件上传

    一.导入包 需要将commons-fileupload和commons-io包和struts包一起导入 实现步骤: 在Jsp页面实现客户端选择上传文件 配置Struts.xml,拦截器会自动接收上传的 ...

  4. struts2.3.24 + spring4.1.6 + hibernate4.3.11+ mysql5.5.25开发环境搭建及相关说明

    一.目标 1.搭建传统的ssh开发环境,并成功运行(插入.查询) 2.了解c3p0连接池相关配置 3.了解验证hibernate的二级缓存,并验证 4.了解spring事物配置,并验证 5.了解spr ...

  5. Struts2学习笔记二:开发流程

    一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...

  6. Struts2(一)— 入门

    一.概述 1.什么是Struts2 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立 ...

  7. struts2的搭建和简单的例子(采用struts-2.5.2版本)

    struts框架的概述: 当2001年初,Struts的第一个版本在apache网站上发布,它提供了一种分离视图和业务应用逻辑的web应用方案. 在Struts诞生之前,开发人员都是在jsp里写入处理 ...

  8. struts2 结合extjs实现的一个登录实例

    一.先搭建好struts2,能够通过myeclipse高速搭建. 二.再导入extjs所需的库文件. 三.写一个实体类User package com.ext.model; public class ...

  9. [struts2学习笔记] 第三节 创建struts 2 HelloWorld所需的六个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40349201 官方文档:http://struts.apache.org/releas ...

随机推荐

  1. The Annual Summary Of 2019

    Time is flying, it arrives at the end of year again. This is my first year working in PinDuoDuo inc ...

  2. 电脑端TIM登录时记住密码

    为什么每次登录TIM时点了记住密码,下次再登录时还是记不住呢? 不是扫码就是还得输出密码,为这事愁了好多次, 最近终于发现如何记住密码了... 进入登录界面以后,点击左下角这个小图标>> ...

  3. antDeaign-form-getFieldDecorator 使用注意事项

    2020-01-06 antDeaign-form-getFieldDecorator 使用注意事项 一.使用getFieldDecorator之前,必须先使用 Form.create({ })(Fo ...

  4. IDEA错误: 找不到或无法加载主类

    错误: 找不到或无法加载主类 idea本身缓存问题 解决:清理缓存重启IDEA file-->invalidate Cache/restart 之后再重新build.

  5. EntityFramework Core一劳永逸动态加载模型,我们要知道些什么呢?

    前言 这篇文章源于一位问我的童鞋:在EntityFramework Core中如何动态加载模型呢?在学习EntityFramwork时关于这个问题已有对应园友给出答案,故没有过多研究,虽然最后解决了这 ...

  6. vnpy源码阅读学习(3):学习vnpy的界面的实现

    学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...

  7. docker制作cenos+php56+nginx镜像

    首先你环境要安装好docker 1 获取centos镜像. docker search centos 选取第一个官方镜像. docker pull  docker.io/centos 新建镜像挂载目录 ...

  8. python继承简介

    继承 是面向对象的三大特性之一 作用: 通过继承可以使一个类获取其它类中的属性和方法 使用方法: 在定义类时,可以在类名后的括号中指定当前类的父类(超类.基类.super) 这样子类(衍生类)就可以直 ...

  9. 求一个数的阶乘在 m 进制下末尾 0 的个数

    题意 : 求一个数 n 的阶层在 m 进制下末尾 0 的个数 思路分析 : 如果是 10 进制地话我们是很容易知道怎么做的,数一下其对 5 约数地个数即可,但是换成 m 进制的话就需要先将 m 分解质 ...

  10. day6 云道页面 知识点梳理(1)

    关于块级元素.行内元素.行内块元素的梳理 (1)块级元素 特点:   a.可以设置宽高,行高,外边距和内边距   b.块级元素会独占一行    c.宽度默认是容器的100%    d.可以容纳内联元素 ...